kubernetesのステートフルセットを利用して障害に強いpodを作成する②
はじめに
くーばねてすを倒すために今回はkubernetesのステートフルセットを利用して障害に強いpodを作成する方法を調べた!(^^)/
概要
■テスト環境
■作りたいやつ
■マニフェスト作成
■ステートフルセットを削除しても永続ボリュームが残ってるか検証する
をまとめた(^^)/
■テスト環境
今回はローカル(Windowsさん)にminikubeをインストールして
テストしてみた!
↑ここを参考にローカルに環境を作った(^^)/
■やりたいこと
今回はMySQLサーバーをステートフルセットを利用して整合性のとれるpodと永続ボリュームをいくつか構築してデータがきちんと保護されているか確認する。
■マニフェスト作成
ステートフルセットを使用するときの特徴
①ClusterIP: None、ヘッドレスモードを使用すること
②serviceName: ステートフルセットが連携するサービス名を記述すること
③template: マウントポイントを指定すること
④volumeClaimTemplates: レプリカ数の設定だけでセットで永続ボリュームが作成される
①ヘッドレスサービスのserviceを起動する。
①ClusterIP: None、ヘッドレスモードを使用すること
ヘッドレスサービスを利用しないとステートフルセットが利用できないので、serviceのマニフェストを作成する。ヘッドレスサービスにするために「clusterIP: None」と設定する。
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
②レプリカを持つステートフルセットを起動する。
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サーバー)に書き込みをする
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