iT邦幫忙

2021 iThome 鐵人賽

DAY 16
1
DevOps

k8s 入門學習 30天系列 第 16

IT 鐵人賽 k8s 入門30天 -- day16 k8s Task Deploy a single instance Mysql use StatefulSet

  • 分享至 

  • xImage
  •  

前言

今天這個章節 要來實作 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


上一篇
IT 鐵人賽 k8s 入門30天 -- day15 k8s Workload 簡介
下一篇
IT 鐵人賽 k8s 入門30天 -- day17 Run automated tasks with cron jobs
系列文
k8s 入門學習 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言