为了在 Docker 中简化开发,代码通过卷附加到容器。这样,每次更改代码时都无需重新构建图像。
那么,在 Kubernetes 中使用相同的想法是否正确?
PS:我知道这些概念PersistentVolume并PersistentVolumeClaim允许附加卷,但它们用于数据。
为了简化开发,我确实需要将卷用于代码和数据。这将避免我在每次更改代码时重建图像。
下面是我在 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/'
Run Code Online (Sandbox Code Playgroud)
服务
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"
Run Code Online (Sandbox Code Playgroud)
在 minikube 中很好地创建了服务和部署:
$ 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
Run Code Online (Sandbox Code Playgroud)
文件夹src和文件src/index.php也很好地创建。
<?php
echo "This is my first docker project";
Run Code Online (Sandbox Code Playgroud)
现在我想检查每件事是否都在运行:
$ 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
Run Code Online (Sandbox Code Playgroud)
文件夹src和文件index.php不在/var/www/html!
我错过了什么吗?
PS:如果我在生产环境中,我不会把我的代码放在一个卷中。谢谢,
根据此文档,KVM 驱动程序中尚未实现主机文件夹共享。这是我实际使用的驱动程序。
为了克服这个问题,有两种解决方案:
使用virtualbox驱动程序,以便您可以通过将 localhost 上的路径更改/home/THE_USR/...为来安装 hostPath 卷/hosthome/THE_USR/...
根据命令将卷装载到 minikube VM $ minikube mount /home/THE_USR/...。该命令将返回您在 minikube VM 上安装的卷的路径。下面给出了例子。
(a) 在 minikube VM 上安装卷
该minikube mount命令返回该路径 /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'
Run Code Online (Sandbox Code Playgroud)
(b) 部署路径的规范
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
Run Code Online (Sandbox Code Playgroud)
(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#
Run Code Online (Sandbox Code Playgroud)
PS:这种卷挂载只是开发环境。如果我在生产环境中,代码将不会被安装:它将在图像中。
PS:我推荐使用 virtualbox 而不是 KVM。
希望它对其他人有帮助。