创建mysql的命名空间
kubectl create namespace dev-mysql
创建四个yuml文件
[root@master mysql]# touch mysql-pv.yaml
[root@master mysql]# touch mysql-pvc.yaml
[root@master mysql]# touch mysql-deployment.yaml
[root@master mysql]# touch mysql-service.yaml
mysql-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv1
namespace: dev-mysql
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain # 手动删除
storageClassName: local-storage #表明这个pv所属的storageClass
local:
path: /k8sVolume/mysqlVolume/mypv1/home/k8s/mysql/k8sVolume/mysqlVolume/mypv1 #节点上卷的完整路径。(必须是存在的路径,不然容器无法创建,deployment会报错)可以是目录或块设备(磁盘、分区…)。
nodeAffinity: #节点亲和性配置,限制从哪些节点上可以访问此卷
required:
nodeSelectorTerms: #数组类型
- matchExpressions: #数组类型
- key: kubernetes.io/hostname #字符串类型。被标签选择器应用的label key
operator: In #字符串类型。表示键与一组值的关系。有效的操作符有In, NotIn, Exists, DoesNotExist。Gt, Lt。
values: #一个字符串数组,如果操作符为In或NotIn,则values数组必须非空。如果操作符是Exists或DoesNotExist, values数组必须为空。如果操作符为Gt或Lt,则values数组必须只有一个元素,该元素将被解释为整数。
- master #所在节点的主机名
mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvclocal
namespace: dev-mysql
spec:
accessModes: #访问模式 申领在请求具有特定访问模式的存储时,使用与卷相同的访问模式约定。
- ReadWriteMany
volumeMode: Filesystem #卷模式
resources:
requests:
storage: 4Gi
storageClassName: local-storage # 此处须显式设置空字符串或指定值,否则会被设置为默认的 StorageClass
mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-deployment #指定deployment的名字
namespace: dev-mysql
labels:
app: mysql-labels-app
spec: #规约
replicas: 3 #pod的副本数量,就是希望创建多少个pod的副本.可选字段。它的默认值是1。
selector: #selector 字段定义 Deployment 如何查找要管理的 Pods。必须匹配 .spec.template.metadata.labels,否则请求会被 API 拒绝。
matchLabels:
app: mysql-pod
template: #Deployment Pod 模板;它和 Pod 的语法规则完全相同。 只是这里它是嵌套的,因此不需要 apiVersion 或 kind。
metadata:
labels:
app: mysql-pod
spec: #pod模板规约
containers: #容器
- name: mysql #容器的名称
image: mysql:5.7 #容器使用的镜像
ports:
- containerPort: 3306
volumeMounts:
- name: mypv1 #pv的name
mountPath: /var/lib/mysql #容器内对应的路径。MySQL的数据都在这个里面,需要持久化的也就是这个路径下的内容
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumes:
- name: mypv1 #pv的name
persistentVolumeClaim:
claimName: mypvclocal
restartPolicy: Always #Deployment 中的 Pod 模板必须指定适当的标签和适当的重新启动策略。只有 .spec.template.spec.restartPolicy 等于 Always 才是被允许的,这也是在没有指定时的默认设置
mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql-service
namespace: dev-mysql
spec:
ports:
- port: 3306
nodePort: 30060
selector:
app: mysql-pod # 该 Service 会将所有具有标签 app: mysql-labels-app暴露到一个抽象的 Service 端口上(targetPort:容器接收流量的端口;port:可任意取值的抽象的 Service 端口,其他 Pod 通过该端口访问 Service
type: NodePort
更新/创建在yaml中定义的对象
kubectl apply -f mysql-pv.yaml -n dev-mysql
kubectl apply -f mysql-pvc.yaml -n dev-mysql
kubectl apply -f mysql-deployment.yaml -n dev-mysql
kubectl apply -f mysql-service.yaml -n dev-mysql
初始化pod需要一段时间
kubectl get pods -n dev-mysql -o wide
初始化完毕查询一下端口
kubectl get svc -n dev-mysql
链接一下:
注意一下链接的端口号,不是3306.