目次
ToggleGKE使用時の課題
・どうやって、Podsの間にデータファイルを共有し、利用出来るか?
・どんな時に、Podがエラーとなったり、削除されたり、データに影響があるのか?
上記の課題は、Cloud Storageなどのストレージサービスを利用したら解決できますが、処理パフォーマンスが必要な場合Persistent Diskを利用しなければなりません。
Persistent Diskを使う方法を紹介いたします。
実施手順
・Persistent Disk作成
・Persistent Diskフォーマット
・準備できたPersistent Diskを使ってGKE中にストレージを作成
・GKEのストレージマウントのPod作成
※本手順はGCPやgcloudを利用する経験がある前提とします。
1.Persistent Disk作成
# Persistent Disk作成 gcloud compute disks create --size=10GB --zone=asia-northeast1-b sample-gce-nfs-disk
注意:利用されるGKEクラスタのZoneと同じ指定をしてください。
2.Persistent Diskフォーマット
本記事は、GCEを使ってディスクをフォーマット化(初期化)する方法を紹介します。
# Persistentディスク付けのインスタンスを作成する gcloud compute instances create work-vm --zone=asia-northeast1-b \ --machine-type=f1-micro --disk=name=sample-gce-nfs-disk # GCEインスタンスにSSHする gcloud compute ssh --zone=asia-northeast1-b work-vm # 付けるディスク確認 $ sudo lsblk > NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT > sda 8:0 0 10G 0 disk > `-sda1 8:1 0 10G 0 part / > sdb 8:16 0 10G 0 disk # sdbは下記のコマンドに入れて、フォーマットする sudo mkfs.ext4 -m 0 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/sdb # フォーマットはこれで完了です。これからのコマンドの実施は任意 # マウント先のフォルダを作成 sudo mkdir -p /mnt/disks/sdb # マウント実施 sudo mount -o discard,defaults /dev/sdb /mnt/disks/sdb # 全てユーザに読み書きげ権限付与 sudo chmod a+w /mnt/disks/sdb
3.準備できたPersistent Diskを使ってGKE中にストレジを作成
persistentvolume ├── README.md ├── postgres.deployment.yaml └── pvc-demo.yaml
定義Yamlファイルを準備します。
apiVersion: v1 kind: PersistentVolume metadata: name: sample-volume-pv spec: storageClassName: "" capacity: storage: 10G accessModes: - ReadWriteOnce gcePersistentDisk: pdName: sample-gce-nfs-disk fsType: ext4 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: sample-volume-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10G
accessModesについては下記の3つがあります。
– ReadWriteOnce:読み書きできる1つマウント
– ReadOnlyMany:読み込み専用の権限で複数マウント可能
– ReadWriteMany:読み書きできる複数マウント。GCEのPersistent Diskはこのオプションを適用できない。このオプションを利用したい場合、別の記事でNFSでマウントする方法を紹介します。
# ストレージ作成実施 kubectl apply -f pvc-demo.yamlGKEのストレージ確認
4.GKEのストレジマウントのPod作成
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: postgres spec: replicas: 1 template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:latest imagePullPolicy: "IfNotPresent" ports: - containerPort: 5432 env: - name: POSTGRES_USER value: postgres - name: POSTGRES_PASSWORD value: magicPass - name: PGDATA value: /var/lib/postgresql/data/pgdata volumeMounts: - mountPath: /var/lib/postgresql/data name: postgres-volume volumes: - name: postgres-volume persistentVolumeClaim: claimName: sample-volume-pvc
このデプロイメント定義は作成したPersistent Diskを使って、データベースの物理ファイルを保存する。
# deploy postgres on gke kubectl apply -f postgres.deployment.yaml
デプロイ後の確認
5.Persistent Disk機能の確認
- Postgresの中にテーブル作成
- Postgresのデプロイを削除
- Postgresを再デプロイ(以前のPersistent Disk付き)
- 作成したテーブルの確認
Postgresの中にテーブル作成
# Podリスト表示 kubectl get pods > NAME READY STATUS RESTARTS AGE > nfs-server-c6d9c8755-pvjlz 1/1 Running 0 147m > postgres-55d84bc864-nwmgh 1/1 Running 0 113s # SSH to pod kubeclt exec -it postgres-55d84bc864-nwmgh /bin/bash # Connect to Postgres psql --host=localhost --user=postgres # Create a table sql > CREATE TABLE account( user_id serial PRIMARY KEY, username VARCHAR (50) UNIQUE NOT NULL, password VARCHAR (50) NOT NULL, email VARCHAR (355) UNIQUE NOT NULL, created_on TIMESTAMP NOT NULL, last_login TIMESTAMP ); sql > \d account; Table "public.account" Column | Type | Collation | Nullable | Default ------------+-----------------------------+-----------+----------+------------------------------------------ user_id | integer | | not null | nextval('account_user_id_seq'::regclass) username | character varying(50) | | not null | password | character varying(50) | | not null | email | character varying(355) | | not null | created_on | timestamp without time zone | | not null | last_login | timestamp without time zone | | | Indexes: "account_pkey" PRIMARY KEY, btree (user_id) "account_email_key" UNIQUE CONSTRAINT, btree (email) "account_username_key" UNIQUE CONSTRAINT, btree (username) sql > \q; # exit ssh exit
Postgresのデプロイ削除
kubectl delete deployment postgres
Postgresを再デプロイ
# deploy postgres on gke kubectl apply -f postgres.deployment.yaml
作成したテーブルの確認
# Podリスト表示 kubectl get pods > NAME READY STATUS RESTARTS AGE > nfs-server-c6d9c8755-pvjlz 1/1 Running 0 147m > postgres-55d84bc864-fpsv5 1/1 Running 0 113s # SSH to pod kubeclt exec -it postgres-55d84bc864-fpsv5 /bin/bash # Connect to Postgres psql --host=localhost --user=postgres -- 以前作成したテーブルの確認 sql > \d account; Table "public.account" Column | Type | Collation | Nullable | Default ------------+-----------------------------+-----------+----------+------------------------------------------ user_id | integer | | not null | nextval('account_user_id_seq'::regclass) username | character varying(50) | | not null | password | character varying(50) | | not null | email | character varying(355) | | not null | created_on | timestamp without time zone | | not null | last_login | timestamp without time zone | | | Indexes: "account_pkey" PRIMARY KEY, btree (user_id) "account_email_key" UNIQUE CONSTRAINT, btree (email) "account_username_key" UNIQUE CONSTRAINT, btree (username) sql > \q; # exit ssh exit
本記事の利用ソースコードはこちら
https://github.com/itdevsamurai/gke/tree/master/persistentvolume
最後までお読みいただき、ありがとうございます。