在kubernetes中通过卷添加代码是否正确?
为了在Docker中简化开发,代码通过卷附加到容器上。 这样,每次代码改变时都不需要重build图像。
那么考虑在Kubernetes中使用相同的想法是否正确?
PS:我知道PersistentVolume
和PersistentVolumeClaim
的概念允许附加音量,但它们是用于数据的。
更新
为了简化开发,我确实需要使用代码和数据的音量。 这将避免我在每次更改代码时重build图像。
下面是我正在尝试在minikube中做的事情:
部署
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: php-hostpath spec: replicas: 1 template: metadata: labels: app: php-hostpath spec: containers: - name: php-hostpath image: php:7.0-apache ports: - containerPort: 80 volumeMounts: - name: vol-php-hostpath mountPath: /var/www/html volumes: - name: vol-php-hostpath hostPath: path: '/home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube/src/'
服务
apiVersion: v1 kind: Service metadata: name: php-hostpath namespace: default labels: app: php-hostpath spec: selector: app: php-hostpath ports: - port: 80 targetPort: 80 type: "LoadBalancer"
服务和部署在minikube中很好地创build:
$ kubectl get pods -l app=php-hostpath NAME READY STATUS RESTARTS AGE php-hostpath-3796606162-bt94w 1/1 Running 0 19m $ kubectl get service -l app=php-hostpath NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE php-hostpath 10.0.0.110 <pending> 80:30135/TCP 27m
文件夹src
和文件src/index.php
也很好地创build。
<?php echo "This is my first docker project";
现在我想检查一下每件事情都在运行:
$ kubectl exec -ti php-hostpath-3796606162-bt94w bash root@php-hostpath-3796606162-bt94w:/var/www/html# ls root@php-hostpath-3796606162-bt94w:/var/www/html# exit exit
文件夹src
和文件index.php
不在/var/www/html
!
我错过了什么吗?
PS:如果我在生产env,我不会把我的代码放在一个卷中。 谢谢,
有hostPath允许你绑定一个目录到节点上的一个容器。
在多节点集群中,您将希望使用nodeSelector将开发窗格限制到特定节点(使用内置标签kubernetes.io/hostname: mydevhost
)。
使用minikube查看挂载的主机文件夹部分。
我诚实的说,你可以做到,但是你不应该这样做。 使用容器的特点之一是你可以有始终相同的行为的工件(容器)。 你的代码的新版本应该生成一个新的容器。 通过这种方式,您可以确定在testing时发现的任何新问题都将与新代码直接相关。
一个混合的方法(我不喜欢,但我认为更好)是创build一个docker,下载你的代码(select正确的版本与envs),并运行它。
使用hostPaths不是一个坏主意,但可以是一团糟,如果你有一个不那么小的集群。 当然你可以使用PV,毕竟你的代码是数据。 你可以使用像NFS这样的分布式存储文件系统来做到这一点。
在此文档的基础上,主机文件夹共享尚未在KVM驱动程序中实现。 这是我实际使用的驱动程序。
为了克服这个问题,有两个解决scheme:
-
使用virtualbox驱动程序,以便通过将localhost
/home/THE_USR/...
上的path更改为/hosthome/THE_USR/...
来安装hostPath卷 -
根据命令
$ minikube mount /home/THE_USR/...
将卷挂载到minikube VM。 该命令将返回您在minikube虚拟机上安装的卷的path。 例子被放弃了。
例
(a)在minikube虚拟机上安装一个卷
minikube mount
命令返回该path/ mount-9p
$ minikube mount -v 3 /home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube Mounting /home/amine/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube into /mount-9p on the minikubeVM This daemon process needs to stay alive for the mount to still be accessible... 2017/03/31 06:42:27 connected 2017/03/31 06:42:27 >>> 192.168.42.241:34012 Tversion tag 65535 msize 8192 version '9P2000.L' 2017/03/31 06:42:27 <<< 192.168.42.241:34012 Rversion tag 65535 msize 8192 version '9P2000'
(b)部署path的规范
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: php-hostpath spec: replicas: 1 template: metadata: labels: app: php-hostpath spec: containers: - name: php-hostpath image: php:7.0-apache ports: - containerPort: 80 volumeMounts: - name: vol-php-hostpath mountPath: /var/www/html volumes: - name: vol-php-hostpath hostPath: path: /mount-9p
(c)检查安装量是否正常
amine@amine-Inspiron-N5110:~/DockerProjects/gcloud-kubernetes/application/06-hostPath-volume-example-minikube$ kubectl exec -ti php-hostpath-3498998593-6mxsn bash root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo "This is my first docker project"; root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo 'This is my first hostPath on kubernetes'; root@php-hostpath-3498998593-6mxsn:/var/www/html# cat index.php <?php echo 'This is my first hostPath on kubernetes'; root@php-hostpath-3498998593-6mxsn:/var/www/html#
PS:这种卷装只是开发环境。 如果我在生产环境中,代码将不会被安装:它将在图像中。
PS:我推荐使用virtualbox来代替KVM。
希望它可以帮助别人。
- 将AWS凭证(IAMangular色凭证)传递到在泊坞窗容器中运行的代码
- 我一直得到“dockerbuild设”需要1正确的参数(S)错误
- 创build针对Linux Docker容器的长期运行的.NET Core服务
- docker为什么不运行同时使用–rm和-d的支持?
- 如何查看DockerHub容器的源代码,以便适应它?
- 构buildDocker安装nodejs v4.2.6
- 未安装Docker PDO驱动程序上的PHP 7.1 – 已validation它在映像上
- 如何在Docker容器中不安装shell的情况下inheritance环境variables?
- 当图像被推入时,Docker触发jenkins作业