Help us understand the problem. What is going on with this article?

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

GKEのストレージ確認
gcp_gke_kubernetes_persistent_disk_devsamurai_001.png

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

デプロイ後の確認
gcp_gke_kubernetes_persistent_disk_devsamurai_002.png

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

最後まで読んで頂き、どうも有難う御座います!
DevSamurai 橋本

関連記事GKE上にNFSを構築する方法

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした