k8s volume mysql_k8s-Volumes(6)

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 查看运行状态

c3039769910cd003244360f12aa94a4d.png

3.1.2 Navicat连接mysql

105c1f6d039ae9e88b4385592cae5f66.png

79f47ed3903583e20fa59fbb8571330d.png

如上图所示连接成功。

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被删除后重新构建的时候该数据库是否存在。

b1330c54d75f941320f0792f12de01b1.png

重启mysql对应的pod

kubectl replace --force -f mysql-deploy.yaml

观察数据库:

a79c71ebc795406937ae8e830d3d1839.png

新建的数据库已经不在。

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

5fe3e7371cfd78fabd30745603ec760b.png

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日志

1228f5e9d69de3843225f688c4b5eba5.png

上述所述,环境变量已生效。

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

7e020e5903ce0d8de83c49e869b4a385.png

/etc/config 下多了一个username文件,内容为lzl,表明挂载成功。

5、AspNetCore 利用ConfigMap挂载Appsettings.json

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值