🤑

kubernetesのステートフルセットを利用して障害に強いpodを作成する②

2021/03/21に公開

はじめに

くーばねてすを倒すために今回はkubernetesのステートフルセットを利用して障害に強いpodを作成する方法を調べた!(^^)/

概要

■テスト環境
■作りたいやつ
■マニフェスト作成
■ステートフルセットを削除しても永続ボリュームが残ってるか検証する

をまとめた(^^)/

■テスト環境

今回はローカル(Windowsさん)にminikubeをインストールして
テストしてみた!
https://kubernetes.io/ja/docs/setup/learning-environment/minikube/
https://minikube.sigs.k8s.io/docs/start/
↑ここを参考にローカルに環境を作った(^^)/

■やりたいこと

今回はMySQLサーバーをステートフルセットを利用して整合性のとれるpodと永続ボリュームをいくつか構築してデータがきちんと保護されているか確認する。

■マニフェスト作成

https://kubernetes.io/ja/docs/tasks/run-application/run-replicated-stateful-application/
↑を参考にした。
ステートフルセットを使用するときの特徴
①ClusterIP: None、ヘッドレスモードを使用すること 
②serviceName: ステートフルセットが連携するサービス名を記述すること
③template: マウントポイントを指定すること
④volumeClaimTemplates: レプリカ数の設定だけでセットで永続ボリュームが作成される

①ヘッドレスサービスのserviceを起動する。

①ClusterIP: None、ヘッドレスモードを使用すること
ヘッドレスサービスを利用しないとステートフルセットが利用できないので、serviceのマニフェストを作成する。ヘッドレスサービスにするために「clusterIP: None」と設定する。

mysql-services.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql-sts
spec:
  ports:
  - name: mysql
    port: 3306
  clusterIP: None
  selector:
    app: mysql-sts

設定したサービスを起動する。

$  kubectl apply -f .\mysql-services.yaml
service/mysql created

②レプリカを持つステートフルセットを起動する。

statefulSet.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql-sts     # serviceのラベルと一致させること
  serviceName: mysql     # serviceNameを指定すること
  replicas: 3    # レプリカ数の設定で連動する永続ボリュームも作成される
  template:     # podテンプレート
    metadata:
      labels:
        app: mysql-sts     # serviceのラベルと一致させること
    spec:
      containers:
      - name: mysql
        image: mysql:5.7
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: qwerty
        ports:
        - name: mysql
          containerPort: 3306
        volumeMounts:       # マウントポイントを指定すること
        - name: pvc
          mountPath: /var/lib/mysql
          subPath: data
        resources:
          requests:
            cpu: 500m
            memory: 1Gi
        livenessProbe:     #Mysql稼働チェック
          exec:
            command: ["mysqladmin", "ping"]
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
  volumeClaimTemplates:    # 永続ボリューム要求テンプレート
  - metadata:
      name: pvc
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

ステートフルセットを起動する

$ kubectl apply -f .\statefulSet.yml                                             statefulset.apps/mysql created

service、ステートフルセット、pod、PVC、PVが作成されているか確認する。

$ kubectl get svc  # service                                                                                                                                                     NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    3d16h
mysql        ClusterIP   None         <none>        3306/TCP   3d15h
$ kubectl get sts     # ステートフルセット                                                                                                                                              NAME    READY   AGE
mysql   3/3     2m3s
$ kubectl get po    # pod                                                                                                                                                NAME      READY   STATUS    RESTARTS   AGE
mysql-0   1/1     Running   0          2m17s
mysql-1   1/1     Running   0          85s
mysql-2   1/1     Running   0          78s
$ kubectl get pvc   # 永続ボリューム要求                                                                                                                                              NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-mysql-0   Bound    pvc-31e68565-a134-4143-8f26-fd7e0ce6e0d8   10Gi       RWO            standard       2m38s
pvc-mysql-1   Bound    pvc-e0455e8e-26a1-4db2-8e5f-c63340474e74   10Gi       RWO            standard       106s
pvc-mysql-2   Bound    pvc-1ef1292c-5d21-46db-8665-64b8783ac656   10Gi       RWO            standard       99s
$ kubectl get pv    # 永続ボリューム                                                                                                                                           NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pvc-1ef1292c-5d21-46db-8665-64b8783ac656   10Gi       RWO            Delete           Bound    default/pvc-mysql-2   standard                104s
pvc-31e68565-a134-4143-8f26-fd7e0ce6e0d8   10Gi       RWO            Delete           Bound    default/pvc-mysql-0   standard                2m43s
pvc-e0455e8e-26a1-4db2-8e5f-c63340474e74   10Gi       RWO            Delete           Bound    default/pvc-mysql-1   standard                111s

■ステートフルセットを削除しても永続ボリュームが残ってるか検証する

①mysql-0(MySQLサーバー)に書き込みをする

podに入って
kubectl exec -it mysql-0 bash                                                ``` ```
```^^:書き込みをする
root@mysql-0:/# mysql -u root -pqwerty
mysql> create database hello;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |     ←入れた
| mysql              |
| performance_schemsa |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
exit(podをでる)

②ステートフルセット、serviceを削除する

$ kubectl.exe delete -f statefulSet.yml                                          statefulset.apps "mysql" deleted
$ kubectl.exe delete -f mysql-services.yaml                                     service "mysql" deleted

③残っているものを確認する

service、ステートフルセット、podが削除されているか確認する。

$ kubectl get svc,sts,po                                                                                                                                            NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   3d17h
# 削除されている

永続ボリューム要求と永続ボリュームは残っているか確認する。

$ kubectl get pvc                                                                                                                                                   NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-mysql-0   Bound    pvc-31e68565-a134-4143-8f26-fd7e0ce6e0d8   10Gi       RWO            standard       52m
pvc-mysql-1   Bound    pvc-e0455e8e-26a1-4db2-8e5f-c63340474e74   10Gi       RWO            standard       51m
pvc-mysql-2   Bound    pvc-1ef1292c-5d21-46db-8665-64b8783ac656   10Gi       RWO            standard       51m
$ kubectl get pv                                                                                                                                                    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
pvc-1ef1292c-5d21-46db-8665-64b8783ac656   10Gi       RWO            Delete           Bound    default/pvc-mysql-2   standard                51m
pvc-31e68565-a134-4143-8f26-fd7e0ce6e0d8   10Gi       RWO            Delete           Bound    default/pvc-mysql-0   standard                52m
pvc-e0455e8e-26a1-4db2-8e5f-c63340474e74   10Gi       RWO            Delete           Bound    default/pvc-mysql-1   standard                52m

④ステートフルセットを復元してmysql-0ポッドに永続ボリュームが引き継がれているか確認する。

service、ステートフルセットを再デプロイする

$ kubectl apply -f .\mysql-services.yaml                                     service/mysql created
$ kubectl apply -f .\statefulSet.yml                                             statefulset.apps/mysql created

確認する。

$ kubectl get svc,sts,po                                                                                                                                                NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    3d17h
service/mysql        ClusterIP   None         <none>        3306/TCP   64s

NAME                     READY   AGE
statefulset.apps/mysql   3/3     51s

NAME          READY   STATUS    RESTARTS   AGE
pod/mysql-0   1/1     Running   0          51s
pod/mysql-1   1/1     Running   0          46s
pod/mysql-2   1/1     Running   0          44s

先ほどのmysql-0のpodにはいる

$ kubectl exec -it mysql-0 bash                                                

先ほどいじった内容が生きているか確認する。

root@mysql-0:/# mysql -u root -pqwerty
略
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hello              |  ←いた
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

ちなみに他のpodは?

$ kubectl exec -it mysql-1 bash                                                 
---
root@mysql-1:/# mysql -u root -pqwerty
略
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

ちゃんと独立した永続ボリュームがあるようだ(^^)/

まとめ

フィーーーー!

Discussion