1. 程式人生 > >Kubernetes創建掛載共享存儲的容器

Kubernetes創建掛載共享存儲的容器

最重要的 鏈接 class 使用 running readonly load tcp only

原文鏈接:https://www.58jb.com/html/135.html

在上一次的Mysql容器中,已經使用過了配置宿主機目錄掛載的方式,這樣雖然方便但是不夠安全;一般都是把數據存儲在遠程服務器上如:NFS,GlusterFS,ceph等;一般目前主流的還是使用ceph、GlusterFS;

本次實驗使用最簡單的方式NFS來配置一個通過掛載共享存儲的nginx容器;

兩臺機器:

kubernetes: 10.0.10.135 [Centos7.2]

nfs: 10.0.10.31 [Centos6.5的機器]

由於kubernetes還是之前的實驗機器,所以就直接弄好NFS服務器先;

nfs服務器操作:


  1. yum install rpcbind nfs-utils -y
  2. mkdir -p /data/www-data

添加共享目錄配置:


  1. cat >/etc/exports<<-EOF
  2. /data/www-data 10.0.10.0/24(rw,sync)
  3. EOF

添加到開機啟動:


  1. chkconfig rpcbind on
  2. chkconfig nfs on
  3. service nfs start
  4. service rpcbind start

檢查一下配置:


  1. [root@nfs ~]# exportfs
  2. /data/www-data 10.0.10.0/24

再回到kubernetess機器上要安裝一個包:


  1. yum install nfs-utils -y
完成後就可以用命令檢查nfs目享的目錄了;

  1. [root@node5 ~]# showmount -e 10.0.10.31
  2. Export list for 10.0.10.31:
  3. /data/www-data 10.0.10.0/24
嘗試掛載一下;

  1. [root@node5 ~]# mount 10.0.10.31:/data/www-data /mnt
  2. [root@node5 ~]# ls /mnt
  3. css fonts img index.html js

因為事先準備了一些文件,所以就可以看到效果,已經成功掛載過來了說明主機可以掛載;

創建一個rc,並定義兩個容器數量,配置文件如下:


  1. cat >nginx_pod_volume_nfs.yaml<<-EOF
  2. apiVersion: v1
  3. kind: ReplicationController
  4. metadata:
  5. name: nginx
  6. spec:
  7. replicas: 2
  8. selector:
  9. app: web01
  10. template:
  11. metadata:
  12. name: nginx
  13. labels:
  14. app: web01
  15. spec:
  16. containers:
  17. - name: nginx
  18. image: reg.docker.tb/harbor/nginx
  19. ports:
  20. - containerPort: 80
  21. volumeMounts:
  22. - mountPath: /usr/share/nginx/html
  23. readOnly: false
  24. name: nginx-data
  25. volumes:
  26. - name: nginx-data
  27. nfs:
  28. server: 10.0.10.31
  29. path: "/data/www-data"
  30. EOF
創建容器:

  1. [root@node5 test_418]# kubectl create -f nginx_pod_volume_nfs.yaml
  2. replicationcontroller "nginx" created

檢查一下服務是否正在運行:


  1. [root@node5 test_418]# kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-64zrd 1/1 Running 0 15s
  4. nginx-f0z39 1/1 Running 0 15s
  5. [root@node5 test_418]# kubectl get rc
  6. NAME DESIRED CURRENT READY AGE
  7. nginx 2 2 1 8s
此時已經成功運行了兩個容器了,但是無法外部訪問,這裏還要再添加一個service;

創建一個Service,負責對外提供負載;


  1. cat >nginx_service.yaml<<-EOF
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: nginx-service
  6. spec:
  7. externalIPs:
  8. - 10.0.10.135
  9. ports:
  10. - port: 8000
  11. targetPort: 80
  12. protocol: TCP
  13. selector:
  14. app: web01
  15. EOF

檢查一下service是否成功運行:


  1. [root@node5 test_418]# kubectl get svc
  2. NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. kubernetes 10.254.0.1 <none> 443/TCP 17d
  4. my-mysql 10.254.93.211 10.0.10.135 3306/TCP 7d
  5. nginx-service 10.254.155.182 10.0.10.135 8000/TCP 4s

打開瀏覽器,訪問一下:

http://10.0.10.135:8000/

技術分享圖片

此處是一個集群哦!由兩個容器提供,哪怕刪除其中一個都可以訪問;只是因為配置文件中配置了復制份數為2,所以刪除任意一個又會很快創建出一個來,最重要的是不用你管理它自動就加入到些集群中;

註:其實這個方式跟本地掛載的方式差不多,只是把遠程的目錄掛載到Kubernetes主機上再掛載到容器裏,這個在實驗環境中發現:


  1. [root@node5 test_418]# mount|grep "10.0.10.31"
  2. 10.0.10.31:/data/www-data on /var/lib/kubelet/pods/65f7cd9e-23ec-11e7-b0e2-000c29d4cebd/volumes/kubernetes.io~nfs/nginx-data type nfs4 (rw,relatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.10.135,local_lock=none,addr=10.0.10.31)
  3. 10.0.10.31:/data/www-data on /var/lib/kubelet/pods/65f7db49-23ec-11e7-b0e2-000c29d4cebd/volumes/kubernetes.io~nfs/nginx-data type nfs4 (rw,relatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.10.135,local_lock=none,addr=10.0.10.31)

很明顯看到兩個Pod容器都掛載了一相同的目錄,而此目錄就是掛載遠程NFS服務器的目錄;

Kubernetes創建掛載共享存儲的容器