今天这个章节 要来实作 Deploy a single instance Mysql use StatefulSet Task
已有 k8s 执行个体
再这个章节将会使用 minikube
1 建立对应到本机硬碟的 PersistentVolume 与可用的 PersistentVolumeClaim 给 Mysql
2 给 Mysql 的 Secret 来存放 MYSQL_ROOT_PASSWORD
3 建立一个 headless Service 给 Mysql 来存取与一个 mysql 的 Deployment
建立一个 mysql-pv.yaml 档案如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
第1部份 建立一个 PersistentVolume
设定容量为 20Gi
挂载点为 /mnt/data
读取模式是 ReadWriteOnce
第2部份 建立一个 PersistentVolumeClaim
名称设定为 mysql-pv-claim
读取模式是 ReadWriteOnce
设定需求容量为 20Gi
建立指令如下:
kubectl apply -f mysql-pv.yaml
查讯指令如下:
kubectl describe pvc mysql-pv-claim
建立 mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: cGFzc3dvcmQ=
建立一个 Secret 名称为 mysql-secret
设定型态为 key value Pair 且使用 Base64 编码
设定值为 mysql-root-password: cGFzc3dvcmQ=
这边 mysql-root-password 的值是使用以下指令产生
echo -n 'password' | base64
建立指令如下
kubectl apply -f mysql-secret.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
第1部份 建立一个 headless Service
设定名称为 mysql
设定对接的 port 3306
设定 ClusterIP 为 None
设定 selector 为 app: mysql
上面这个设定让 mysql 这个 headless Service 对应到 labels 为 app: mysql 的 Pod
第2部份 建立一个 Deployment
设定名称为 mysql
设定 selector 对应的条件是找到 labels 为 app: mysql 的 Pod
重点的部份在於
1 template container 的环境参数 MYSQL_ROOT_PASSWORD 使用 mysql-secret 这个 Secret 内部的 mysql-root-password 值
2 template container 的 containerPort 设立为 3306
3 volumes 从 mysql-pv-name 这个 Persistent-Volume-Claim 取得并设立名称为 mysql-persistent-storage
4 template container volumeMount 把 mysql-persistent-storage 挂载到 /var/lib/mysql
建立指令如下:
kubectl apply -f mysql-deployment.yaml
查看 deployment 指令
kubectl describe deployment mysql
因为是 headless Service 所以 ClusterIP 会变成 Pod IP
并且 Service 名称在 Cluster 内也会解析成 Pod IP
所以目前可以在 Cluster 内透过 Service Name mysql 连线到 Pod
连线验证指令如下
kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
kubectl delete secret mysql-secret
这边很特别的是因为 PersistentVolume 是本机的 Disk
所以无法做 scale up
因为当 scale up 这类的 PersistentVolume 无法挂载的 Pod上
另外一点是这边的 Deployment strategy 设定成 Recreate
这样一来在更新这个 Pod 的时候, 就不会采用 Rolling Update
而会先删除旧的 Pod 再产生一个新的 Pod
<<: [Day 20] 2D 批次渲染 (二) - BURN OUT
>>: [day26] - Angular Component to Web Component
上一篇我们设计了 I2C Master 的状态机,那麽我们今天要来引用上次完成的状态机模块来实现 I...
此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 在执行测试脚本时,如测试脚本失败时...
Instantiate实例化,用於将物件生成至场景中。(参考unity手册) 适合用在复制一样的物件...
紧张紧张,刺激刺激,从去年下半年才参加UI/UX设计班的菜逼八,今年居然就自不量力的参加传说中的铁人...
封装(Encapsulation)和协定的资料单位(PDU) 大家普遍认为(特别是在Cisco/CC...