赞
踩
目录
咱们在使用Docker的时候经常会用到数据卷对目录进行挂载。例如Docker内跑了一个ngx,然后把html页面给挂出来,这样就可以很轻松的在宿主机上对其内容进行修改。但是在k8s中这个方式不可行。咱们知道如果pod突然挂掉了,k8s会试图对其进行重启,但是超过5分钟这个阈值还没起来的话,k8s会在其他的节点上起一个同样的,新的pod出来,这也就是问题所在。例如: 咱们原先的pod里有mysql,并且对宿主机挂载了数据卷,他挂掉后被k8s重启在了其它机器上,那他原本挂载的数据怎么办?
所以k8s在这里加了一层,叫做存储层。其在本层是开放的,你可以选择性的使用NFS、CephFS、GlusterFS等。以NFS举例,他会在一台机器上创建一个数据存储目录,并挂载到其它的每一台节点上,这样可以保证其每一台机器上数据的一致性。此时如果pod挂掉后重启在别的节点上也没有关系,因为大家存储的数据都是一样的。
yum install -y nfs-utils
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
mkdir -p /nfs/data
systemctl enable rpcbind --now
systemctl enable nfs-server --now
exportfs -r
效果:
exportfs
检查确认一下,有哪些目录可以进行挂载(这里的IP是主节点的IP地址):
showmount -e 192.168.150.201
执行以下命令挂载 nfs 服务器上的共享目录到本机路径 /root/nfsmount :
mkdir -p /nfs/data
注意写主节点的IP地址:
mount -t nfs 192.168.150.201:/nfs/data /nfs/data
在主节点上随便弄点什么:
然后去从节点上查看:
mkdir -p /nfs/data/nginx-pv
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: nginx-pv-demo
- name: nginx-pv-demo
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx-pv-demo
- template:
- metadata:
- labels:
- app: nginx-pv-demo
- spec:
- containers:
- - image: nginx
- name: nginx
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- nfs:
- server: 192.168.150.201
- path: /nfs/data/nginx-pv
kubectl apply -f [文件名]
然后等这两个新的pod起来:
因为这两个pod都挂载到了 /nfs/data/nginx-pv ,所以修改这里的话就相当于是把它俩都改了:
然后到pod里面去看看有没有一起修改(注意自己的pod名称):
kubectl exec -it nginx-pv-demo-6546658598-4kx4w -- bash
修改成功!
PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置
PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格
如果只使用上述方式会存在三个问题:
- 需要挂载的目录需要自己去手动创建
- 在删除pod后,所挂载的目录不会被自动删除
- 对每一个pod所挂载的目录没有空间大小的限制
静态供应,nfs主节点:
- mkdir -p /nfs/data/01
- mkdir -p /nfs/data/02
- mkdir -p /nfs/data/03
创建PV(pv.yaml):
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv01-10m
- spec:
- capacity:
- storage: 10M
- accessModes:
- - ReadWriteMany
- storageClassName: nfs
- nfs:
- path: /nfs/data/01
- server: 192.168.150.201
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv02-1gi
- spec:
- capacity:
- storage: 1Gi
- accessModes:
- - ReadWriteMany
- storageClassName: nfs
- nfs:
- path: /nfs/data/02
- server: 192.168.150.201
- ---
- apiVersion: v1
- kind: PersistentVolume
- metadata:
- name: pv03-3gi
- spec:
- capacity:
- storage: 3Gi
- accessModes:
- - ReadWriteMany
- storageClassName: nfs
- nfs:
- path: /nfs/data/03
- server: 192.168.150.201
kubectl apply -f pv.yaml
创建完成可以查看:
kubectl get pv
创建PVC(pvc.yaml):
- kind: PersistentVolumeClaim
- apiVersion: v1
- metadata:
- name: nginx-pvc
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 200Mi
- storageClassName: nfs
创建Pod绑定PVC(dep2.yaml):
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: nginx-deploy-pvc
- name: nginx-deploy-pvc
- spec:
- replicas: 2
- selector:
- matchLabels:
- app: nginx-deploy-pvc
- template:
- metadata:
- labels:
- app: nginx-deploy-pvc
- spec:
- containers:
- - image: nginx
- name: nginx
- volumeMounts:
- - name: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- persistentVolumeClaim:
- claimName: nginx-pvc
然后我们去测试一下:
cd /nfs/data/02/
echo 'this is van'>index.html
抽取应用配置,并且可以自动更新
写一个简单的redis配置文件:
echo 'appendonly yes'>redis.conf
创建成k8s的配置集:
kubectl create cm redis-conf --from-file=redis.conf
查看:
kubectl get cm
查看配置集具体内容:
kubectl get cm redis-conf -oyaml
- apiVersion: v1
- kind: Pod
- metadata:
- name: redis
- spec:
- containers:
- - name: redis
- image: redis
- command:
- - redis-server
- - "/redis-master/redis.conf" #指的是redis容器内部的位置
- ports:
- - containerPort: 6379
- volumeMounts:
- - mountPath: /data
- name: data
- - mountPath: /redis-master
- name: config
- volumes:
- - name: data
- emptyDir: {}
- - name: config
- configMap:
- name: redis-conf
- items:
- - key: redis.conf
- path: redis.conf
kubectl exec -it redis -- bash
Secret 对象类型用来保存敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 将这些信息放在 secret 中比放在 Pod 的定义或者 容器镜像 中来说更加安全和灵活。
比如咱们要去docker里pull一个自己的私有镜像,在pull之前必须要先 docker login ,每次这样登录会出现安全问题,所以就有了 Secret :
- ##命令格式
- kubectl create secret docker-registry regcred \
- --docker-server=<你的镜像仓库服务器> \
- --docker-username=<你的用户名> \
- --docker-password=<你的密码> \
- --docker-email=<你的邮箱地址>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。