初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

1. StatufulSet を使った MySQL を定義　※いまここ
2. MySQL のデータ格納用に内部ストレージを割り当て
3. 設定ファイルを Master、Slave 用に設定し配置
4. バックアップ用に外部ストレージを割り当て
5. Master-Slave 間でデータを同期

### StatefulSet を使った MySQL を定義

以前写経で学んだ、 ConfigMap / Secret マニュフェストを使って、MySQL のコンフィグ情報を各 yaml ファイルに定義します。

```yaml:cm.yaml
apiVersion: v1
data:
  MYSQL_DATABASE: mattermost
  MYSQL_USER: myuser
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: common-env
```

```yaml:secret.yaml
apiVersion: v1
data:
  MYSQL_PASSWORD: bXlwYXNzd29yZA==
  MYSQL_ROOT_PASSWORD: cm9vdHBhc3N3b3Jk
kind: Secret
metadata:
  creationTimestamp: null
  name: common-env
```

```yaml:mysql-sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  selector:
    matchLabels:
      app: mysql
  updateStrategy:
    type: RollingUpdate
  replicas: 2
  template:
    metadata:
      labels:
        app: mysql
    spec:
      initContainers:
      - name: init-mysql
        image: k8spracticalguide/mysql:5.7.22
        command: ["bash", "/mnt/scripts/setup.sh"]
        volumeMounts:
        - name: confd
          mountPath: /mnt/conf.d
        - name: scripts
          mountPath: /mnt/scripts
        - name: initdb
          mountPath: /mnt/initdb
      containers:
      - name: mysql
        image: k8spracticalguide/mysql:5.7.22
        envFrom:
        - configMapRef:
            name: common-env
        - secretRef:
            name: common-env
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
        - name: initdb
          mountPath: /docker-entrypoint-initdb.d
        - name: confd
          mountPath: /etc/mysql/conf.d
        - name: backup
          mountPath: /mnt/backup
      volumes:
      - name: initdb
        emptyDir: {}
      - name: confd
        emptyDir: {}
      - name: scripts
        configMap:
          name: mysql-scripts
      - name: backup
        persistentVolumeClaim:
          claimName: backup-mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 1Gi
```

```console:マニュフェストを適用
$ kubectl apply -f cm.yaml -f secret.yaml -f mysql-sts.yaml
configmap/common-env created
secret/common-env created
statefulset.apps/mysql created
```

```console:適用されているのを確認
$ kubectl get statefulsets
NAME    READY   AGE
mysql   2/2     74s

$ kubectl get po
NAME      READY   STATUS    RESTARTS   AGE
mysql-0   1/1     Running   0          77s
mysql-1   1/1     Running   0          73s
```

#### Headless Service を定義する

```yaml:mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
  - port: 3306
    name: mysql
  clusterIP: None  # None にすることで Headless Serviceになる
  selector:
    app: mysql
```

```console:適用されているのを確認
$ kubectl apply -f mysql-svc.yaml
service/mysql created

$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP    24h
mysql        ClusterIP   None         <none>        3306/TCP   7s
```

### ちゃんと動いているか確認する

```console
$ kubectl get po -o wide
NAME      READY   STATUS    RESTARTS   AGE     IP          NODE             NOMINATED NODE   READINESS GATES
mysql-0   1/1     Running   0          5m3s    10.1.1.9    docker-desktop   <none>           <none>
mysql-1   1/1     Running   0          4m59s   10.1.1.10   docker-desktop   <none>           <none>

 kubectl run -ti --image=k8spracticalguide/busybox:1.28 dns-test --restart=Never --rm /bin/sh
If you don't see a command prompt, try pressing enter.

/ # nslookup mysql-0.mysql
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      mysql-0.mysql
Address 1: 10.1.1.9 mysql-0.mysql.default.svc.cluster.local
/ # nslookup mysql-1.mysql
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      mysql-1.mysql
Address 1: 10.1.1.10 mysql-1.mysql.default.svc.cluster.local
```

## 次は 3.7.5 章をやっていきます。

1. StatufulSet を使った MySQL を定義
2. MySQL のデータ格納用に内部ストレージを割り当て ※次回
3. 設定ファイルを Master、Slave 用に設定し配置
4. バックアップ用に外部ストレージを割り当て
5. Master-Slave 間でデータを同期


# 最後に

前回うまくできなかったので、ご迷惑おかけしてしまいました。
次回以降はもっと大胆にうまくできることを祈りながら、**写経** がんばります

# 今までの投稿
1. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Pod編](https://qiita.com/nodokaodayaka/items/04d8bc3c9c40443c1cd3)
2. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）NameSpace 編](https://qiita.com/nodokaodayaka/items/73bc1c939a665aaa4b7b)
3. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Label 編](https://qiita.com/nodokaodayaka/items/fd5284475fb1ba920559)
4. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ReplicaSet 編](https://qiita.com/nodokaodayaka/items/fc9f749f123649a2dbd9)
5. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Deployment 編](https://qiita.com/nodokaodayaka/items/2c9d4eefec40d4896126)
6.  [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Service 編](https://qiita.com/nodokaodayaka/items/28955bd813eaf512baf5)
7. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ConfigMap 編](https://qiita.com/nodokaodayaka/items/09c7627eaa913da78cf8)
8. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Secret 編](https://qiita.com/nodokaodayaka/items/8bc1a5963a7c7c177010)
9. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）操作編](https://qiita.com/nodokaodayaka/items/09cb848164e4a1855c83)
10. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編](https://qiita.com/nodokaodayaka/items/ae95e04b064b7600f6af) 
11. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート２](https://qiita.com/nodokaodayaka/items/fa87fd7a3733957e7aca) 
12. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（Label操作）](https://qiita.com/nodokaodayaka/items/8f1892eb1627d0717180)
13. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（OwnerReference 操作）](https://qiita.com/nodokaodayaka/items/b4ad326be41626da9b2e)
14. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト編](https://qiita.com/nodokaodayaka/items/8d212a5f1eeb2685f51c)
15. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト(ConfigMap)編](https://qiita.com/nodokaodayaka/items/7dd2f3885d8e957ffaad)
16. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編](https://qiita.com/nodokaodayaka/items/71c6f7d469cf2f277d3d)
17. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート２](https://qiita.com/nodokaodayaka/items/2663e1931bd1ec007785)
18. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート３](https://qiita.com/nodokaodayaka/items/9ad45aa52d76bcb844d7)
19. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート４](https://qiita.com/nodokaodayaka/items/e6ef632223f9ac2cc99e)
20. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート１（NodePort）](https://qiita.com/nodokaodayaka/items/754a32235cf7e648e8f9)
21. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート２（LoadBalancer）](https://qiita.com/nodokaodayaka/items/79df5bbefbb0e1a938bd)
22. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート３（Ingress）](https://qiita.com/nodokaodayaka/items/f4433cce735f967c294e)
23. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編](https://qiita.com/nodokaodayaka/items/ae7dc8d442280b5bb9ab)
24. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編パート２](https://qiita.com/nodokaodayaka/items/beead2c136d591fe18d6)