在kubernetes中通过卷添加代码是否正确?

为了在Docker中简化开发,代码通过卷附加到容器上。 这样,每次代码改变时都不需要重build图像。

那么考虑在Kubernetes中使用相同的想法是否正确?

PS:我知道PersistentVolumePersistentVolumeClaim的概念允许附加音量,但它们是用于数据的。


更新

为了简化开发,我确实需要使用代码和数据的音量。 这将避免我在每次更改代码时重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。

希望它可以帮助别人。