IT 铁人赛 k8s 入门30天 -- day16 k8s Task Deploy a single instance Mysql use StatefulSet

前言

今天这个章节 要来实作 Deploy a single instance Mysql use StatefulSet Task

Prequest

已有 k8s 执行个体

再这个章节将会使用 minikube

布署目标

1 建立对应到本机硬碟的 PersistentVolume 与可用的 PersistentVolumeClaim 给 Mysql

2 给 Mysql 的 Secret 来存放 MYSQL_ROOT_PASSWORD

3 建立一个 headless Service 给 Mysql 来存取与一个 mysql 的 Deployment

建立 PersistentVolume 与 PersistentVolumeClaim

建立一个 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 来存放 MYSQL_ROOT_PASSWORD

建立 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 

建立一个 headless Service 给 Mysql 来存取与一个 mysql 的 Deployment

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

【Day23】I2C Master(Write)的实现

上一篇我们设计了 I2C Master 的状态机,那麽我们今天要来引用上次完成的状态机模块来实现 I...

自动化测试,让你上班拥有一杯咖啡的时间 | Day 28 - cypress 截图与影片

此系列文章会同步发文到个人部落格,有兴趣的读者可以前往观看喔。 在执行测试脚本时,如测试脚本失败时...

18.unity实例化(上)(Instantiate)

Instantiate实例化,用於将物件生成至场景中。(参考unity手册) 适合用在复制一样的物件...

Day1 参赛前言

紧张紧张,刺激刺激,从去年下半年才参加UI/UX设计班的菜逼八,今年居然就自不量力的参加传说中的铁人...

IP资料单元(Datagram)或封包(Packet)?

封装(Encapsulation)和协定的资料单位(PDU) 大家普遍认为(特别是在Cisco/CC...