在上一次的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服务器操作:
yum install rpcbind nfs-utils -y
mkdir -p /data/www-data
添加共享目录配置:
cat >/etc/exports<
/data/www-data 10.0.10.0/24(rw,sync)
EOF
添加到开机启动:
chkconfig rpcbind on
chkconfig nfs on
service nfs start
service rpcbind start
检查一下配置:
[root@nfs ~]# exportfs
/data/www-data 10.0.10.0/24
再回到kubernetess机器上要安装一个包:
yum install nfs-utils -y
完成后就可以用命令检查nfs目享的目录了;
[root@node5 ~]# showmount -e 10.0.10.31
Export list for 10.0.10.31:
/data/www-data 10.0.10.0/24
尝试挂载一下;
[root@node5 ~]# mount 10.0.10.31:/data/www-data /mnt
[root@node5 ~]# ls /mnt
css fonts img index.html js
因为事先准备了一些文件,所以就可以看到效果,已经成功挂载过来了说明主机可以挂载;
创建一个rc,并定义两个容器数量,配置文件如下:
cat >nginx_pod_volume_nfs.yaml<
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 2
selector:
app: web01
template:
metadata:
name: nginx
labels:
app: web01
spec:
containers:
- name: nginx
image: reg.docker.tb/harbor/nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
readOnly: false
name: nginx-data
volumes:
- name: nginx-data
nfs:
server: 10.0.10.31
path: "/data/www-data"
EOF
创建容器:
[root@node5 test_418]# kubectl create -f nginx_pod_volume_nfs.yaml
replicationcontroller "nginx" created
检查一下服务是否正在运行:
[root@node5 test_418]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-64zrd 1/1 Running 0 15s
nginx-f0z39 1/1 Running 0 15s
[root@node5 test_418]# kubectl get rc
NAME DESIRED CURRENT READY AGE
nginx 2 2 1 8s
此时已经成功运行了两个容器了,但是无法外部访问,这里还要再添加一个service;
创建一个Service,负责对外提供负载;
cat >nginx_service.yaml<
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
externalIPs:
- 10.0.10.135
ports:
- port: 8000
targetPort: 80
protocol: TCP
selector:
app: web01
EOF
检查一下service是否成功运行:
[root@node5 test_418]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 443/TCP 17d
my-mysql 10.254.93.211 10.0.10.135 3306/TCP 7d
nginx-service 10.254.155.182 10.0.10.135 8000/TCP 4s
打开浏览器,访问一下:
http://10.0.10.135:8000/
此处是一个集群哦!由两个容器提供,哪怕删除其中一个都可以访问;只是因为配置文件中配置了复制份数为2,所以删除任意一个又会很快创建出一个来,最重要的是不用你管理它自动就加入到些集群中;
注:其实这个方式跟本地挂载的方式差不多,只是把远程的目录挂载到Kubernetes主机上再挂载到容器里,这个在实验环境中发现:
[root@node5 test_418]# mount|grep "10.0.10.31"
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)
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服务器的目录;