GKEの中で永続ディスク(Persistent Disk)の利用方法
GKE使用時の課題
- どうやって、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ファイルを準備します。
pvc-demo.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でマウントする方法を紹介します。
GKE中のストレージを作成
# ストレージ作成実施
kubectl apply -f pvc-demo.yaml
4.GKEのストレジマウントのPod作成
postgres.deployment.yaml
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を使って、データベースの物理ファイルを保存する。
デプロイPostgres
# 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/dssolutioninc/dss_gke/tree/master/persistentvolume
最後まで読んで頂き、どうも有難う御座います!
DSS 橋本
関連記事GKE上にNFSを構築する方法
Author And Source
この問題について(GKEの中で永続ディスク(Persistent Disk)の利用方法), 我々は、より多くの情報をここで見つけました https://qiita.com/devs_hd/items/481a61f9e74f0f2758ec著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .