1、什么是Volumns?
k8s中的volumns跟docker中的volumns有点类似,都是用于挂载应用的数据。但是docker中的volumns通常只挂载在主机的目录,其生命周期无法管理。而K8S中的Volumns则独立于任何容器,其与pod有着相同的生命周期。同时pod中的容器可以共享该Volumns。因此,当容器在pod中重启的时候,数据依然会被保留。如pod被删除了,数据也会被删除。
2、Volumns的类型
2.1 emptyDir
emptyDir类型在pod被分配到Node的时候被创建,并存储在Node主机上的一个目录。如它的名字一样,初始化为一个空目录,pod中的容器都可以读取该目录。emptyDir类型与pod有着相同的生命周期,pod销毁,emptyDir也会被销毁。
apiVersion: v1
kind: Pod
metadata:
name: mysql-pd
spec:
containers:
- image: easyboys/k8sdemo:mysql5.6
name: k8s-mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-persistent-storage
volumes:
- name: mysql-persistent-storage
emptyDir: {}
2.2 hostPath
hostPath类型就是挂载在主机的一个文件或者目录上,即时pod被删除,volumns的数据也不会被删除。如需要读取本机某些应用程序的数据,如docker的内部文件,此时就需要hostPath。
-
apiVersion: v1 kind: Pod metadata: name: mysql-pd spec: containers: - image: easyboys/k8sdemo:mysql5.6 name: k8s-mysql volumeMounts: - mountPath: /var/lib/mysql name: mysql-persistent-storage volumes: - name: mysql-persistent-storage hostPath: path:/mysql
3、Mysql k8s部署Volumns
下面通过Mysql 挂载volumns在演示上面两种类型。
3.1 创建一个mysql-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-mysql-deployment
spec:
replicas: 1
selector:
matchLabels:
name: k8s-mysql
template:
metadata:
labels:
name: k8s-mysql
spec:
containers:
- name: mysql
image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: mysql
# volumeMounts:
# - name: mysql-persistent-storage
# mountPath: /var/lib/mysql
# volumes:
# - name: mysql-persistent-storage
# hostPath:
---
kind: Service
apiVersion: v1
metadata:
name: k8s-mysql-service
spec:
type: NodePort
ports:
- port: 5000
targetPort: 3306
nodePort: 32000
selector:
name: k8s-mysql
上面的yaml为mysql配置了root用户的密码为password,对外暴露端口为32000
3.1.1 查看运行状态
3.1.2 Navicat连接mysql
如上图所示连接成功。
3.2 修改mysql-deploy.yaml中Container的Volumns类型为emptyDir
containers:
- name: mysql
image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-persistent-storage
volumes:
- name: mysql-persistent-storage
hostPath:
path:/mysql
在删除该pod的时候,先创建一个数据库,用于验证pod被删除后重新构建的时候该数据库是否存在。
重启mysql对应的pod
kubectl replace --force -f mysql-deploy.yaml
观察数据库:
新建的数据库已经不在。
3.3 修改mysql-deploy.yaml中Container的Volumns类型为hostPath
containers:
- name: mysql
image: registry.cn-shenzhen.aliyuncs.com/luozhilian/k8s:mysql5.6
env:
- name: MYSQL_ROOT_PASSWORD
value: password
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-persistent-storage
volumes:
- name: mysql-persistent-storage
hostPath: /var/lib/mysql
重复上面步骤,先创建一个数据库,再重启mysql的pod,发现新建数据库依然存在。
4、ConfigMap
configmap可以将配置文件与容器分离,偏于容器的迁移。修改configmap能够动态更新容器中对应的配置文件。
4.1 ConfigMap的创建方式
ConfigMap的创建方式有很多种,下面只介绍常用的几种:
通过yaml创建configmap:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
namespace: netcore
data:
name: lzl
通过已有文件创建:
创建一个config.txt,内容为name=lzl,再执行以下命令
kubectl create configmap myconfig -n netcore --from-file=config.txt
查看confimap内容:
kubectl get configmap myconfig -n netcore -o yaml
4.2 使用ConfigMap数据定义容器环境变量
1、创建configmap
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
namespace: netcore
data:
name: lzl
2、创建pod,制定容器的env参数:
apiVersion: v1
kind: Pod
metadata:
name: dapi-test-pod
namespace: netcore
spec:
containers:
- name: test-container
image: registry.cn-shenzhen.aliyuncs.com/dormi330/busybox
command: [ "/bin/sh", "-c", "env" ]
env:
- name: user_name #环境变量名称
valueFrom:
configMapKeyRef:
name: my-config #configmap的名称
key: username #configmap中key的名称
restartPolicy: Never
3、pod启动成功查看logs日志
上述所述,环境变量已生效。
4.3使用ConfigMap中数据填充数据卷
还是用上面所示的configmap(my-config),创建以下pod:
apiVersion: v1
kind: Pod
metadata:
name: configcolume-pod
namespace: netcore
spec:
containers:
- name: test-container
image: easyboys/k8sdemo:v1 #用的是我自己的netcoreapi镜像
volumeMounts:
- name: config-colume #挂载的volumes名称
mountPath: /etc/config
ports:
- containerPort: 5000
volumes:
- name: config-colume #volumes名称,与上面保持一致
configMap:
name: my-config #已有的configmap名称
restartPolicy: Never
进入容器中 /etc/config目录下
kubectl exec -it --namespace netcore configcolume-pod /bin/sh
/etc/config 下多了一个username文件,内容为lzl,表明挂载成功。
5、AspNetCore 利用ConfigMap挂载Appsettings.json
推荐圣杰博客 https://www.cnblogs.com/sheng-jie/p/Using-ConfigMap-with-NETCore.html