Oracle Cloud Hangout Cafe Season7 #1「Kubnernetes 超入門」(2023年6月7日開催)

2023年12月14日(木)
市川 豊
第2弾の連載第1回では、2023年6月7日に開催された 「Oracle Cloud Hangout Cafe Season7 #1『Kubnernetes 超入門』」の発表内容に基づいて紹介していきます。

Kubernetesクラスタ構築&アプリケーションデプロイ

ここからは、これまで掴んだ内容を基にKubernetesクラスタを構築して、サンプルアプリケーションとしてWordPressを動かす流れを見ていきます。

クラスタ構築

Kubernetesのクラスタ構築は、以下にあるような全てを1から構築する方法やKubeadmのようなクラスタ構築ツールを利用する方法、マネージドサービスを利用する方法があります。

セッション時に実施したデモでは、Oracle Container Engine for Kubernetes(以降、OKEと略称)を利用しました。クイック作成によるクラスタ構築の手順についてはチュートリアルをご参照ください。

WordPressを動かしてみる

Kubernetesクラスタ上にWordPress環境を構築します。デモ環境構築で必要となるマニフェストは、こちらを参照してください。

デモ環境概要図
ブロックボリュームをストレージとするNFSサーバを構築し、WordPressとMySQLからのデータを保存できるようにします。そして、ブラウザから外部接続してWordPressを利用できるようにします。その際、これまで学んできたDeployment、Service、PersisitentVolume、PersistentVolumeClaim、Secretを利用して環境を構築します。

デモ環境概要図

Secretの作成
MySQLのパスワードを格納するSecretを作成します。

Secretの作成

1$ kubectl create secret generic mysql --from-literal=password=mysql-p@ssw0d

NFSサーバの作成
NFSサーバの作成に入る前に、以下を見ていきます。

  • Kubernetesクラスタ上におけるデータの一時性と永続性
  • PersistentVolumeとPersistentVolumeClaimの仕組み
  • StorageClassによるDynamic Provisioning

Kubernetesクラスタ上におけるデータの一時性と永続性
ここでは、データの一時性(Temporary)をPodが削除または再デプロイされると同時にデータが消える意味とします。コンテナ内の書き込みレイヤーのボリュームにデータを保存したり、Pod内のボリューム(emptyDir)にデータを保存するとPodが削除、再デプロイされると同時にデータも削除されるため、データを永続できません。

データの一時性

ここでは、永続性(Persistent)をPodが削除または再デプロイされてもデータは消えない意味とします。hostPathをマニフェストに定義してノードにあるローカルディスクにデータを保存、またはPersistentVolume / PersistentVolumeClaimを利用してローカルディスクや外部のストレージにデータを保存できます。Podが削除、再デプロイされてもデータはローカルディスク及び外部のストレージにあるため、データの永続を担保できます。

データの永続性

PersistentVolumeとPersistentVolumeClaimの仕組み
事前にストレージを準備して、そのストレージをPersistentVolumeに紐づけます。そして、そのPersistentVolumeをPersistentVolumeClaim を利用して要求します。下図では5GiBを要求しています。実際、払い出されるボリュームは要求されている5GiBに近い20GiBのボリュームとなります。要求容量よりも15GiB多いボリュームとなるので PersistentVolumeの容量は設計時に考慮が必要です。

PersistentVolumeとPersistentVolumeClaimの仕組み

StorageClassによるDynamic Provisioning
PersistentVolumeClaimが発行されたタイミングで、動的にPersistentVolumeをプロビジョニングできるStorageClassという機能があります。デモ環境のPersistentVolumeとブロックボリュームの作成も、この機能を利用しています。

StorageClassによるDynamic Provisioning

ここから、NFSサーバの構築を見ていきます。OKEではCSIボリューム・プラグインを利用して、ブロックボリュームのPersistentVolumeClaimを仕様に従って定義、適用することで PersistentVolumeとブロックボリュームをプロビジョニングできます。先ほど説明したStorageClassの仕組みを利用しています。

NFSサーバの作成

以下、マニフェストファイルです。oci-bvストレージ・クラスの定義(provisioner: blockvolume.CSI.oraclecloud.com)で指定されたCSIプラグインを使用して、ブロック・ボリュームを動的にプロビジョニングできます。

01apiVersion: v1
02kind: PersistentVolumeClaim
03metadata:
04  name: nfs-pvc
05spec:
06  storageClassName: "oci-bv"
07  accessModes:
08    - ReadWriteOnce
09  resources:
10    requests:
11      storage: 50Gi

マニフェストを適用します。

1$ kubectl apply -f nfs-pvc.yaml

PersistentVolumeClaim確認すると、oci-bvストレージ・クラスの定義にvolumeBindingMode: WaitForFirstConsumerが含まれているため、PVCのステータスはPendingとなります。

1$ kubectl get pvc
2 
3NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
4nfs-pvc   Pending                                      oci-bv         1m

この後、NFSサーバのDeploymentを適用することで、StatusがBoundに変わります。

01apiVersion: apps/v1
02kind: Deployment
03metadata:
04  name: nfs-server
05spec:
06  replicas: 1
07  selector:
08    matchLabels:
09      role: nfs-server
10  template:
11    metadata:
12      labels:
13        role: nfs-server
14    spec:
15      containers:
16      - name: nfs-server
17        image: gcr.io/google_containers/volume-nfs:0.8
18        ports:
19          - name: nfs
20            containerPort: 2049
21          - name: mountd
22            containerPort: 20048
23          - name: rpcbind
24            containerPort: 111
25        securityContext:
26          privileged: true
27        volumeMounts:
28          - mountPath: /exports
29            name: nfs-local-storage
30      volumes:
31        - name: nfs-local-storage
32          persistentVolumeClaim:
33            claimName: nfs-pvc  #事前に作成した、PersistentVolumeClaim を指定

マニフェストを適用します。

1$ kubectl apply -f nfs-server.yaml

NFSサーバのPodが作成されると、PersistentVolumeClaimのステータスがPendingからBoundに変わり、ブロックボリュームと紐づいているPersistentVolumeにバインドされたことになります。

1$ kubectl get pvc
2 
3NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
4nfs-pvc   Bound    csi-3ce3f735-04a8-4b22-a768-7ae794d200a7   50Gi       RWO            oci-bv         141m

WordPressとMySQLから接続するNFSサーバのServiceを作成します。

01apiVersion: v1
02kind: Service
03metadata:
04  name: nfs-service
05spec:
06  ports:
07    - name: nfs
08      port: 2049
09    - name: mountd
10      port: 20048
11    - name: rpcbind
12      port: 111
13  selector:
14    role: nfs-server

マニフェストを適用します。

1$ kubectl apply -f nfs-service.yaml

確認します。

1$ kubectl get services
2 
3NAME               TYPE          CLUSTER-IP      EXTERNAL-IP       PORT(S)                       AGE
4kubernetes         ClusterIP     10.96.0.1       <none>            443/TCP,12250/TCP             33d
5nfs-service        ClusterIP     10.96.211.52     <none>           2049/TCP,20048/TCP,111/TCP    167m
6</none></none>

PersistentVolume&PersistentVolumeClaimの作成
WordPressとMySQLからNFS サーバのストレージにアクセスできるようにします。

PersistentVolumeとPersistentVolumeClaimの作成

WordPressとMySQLのPodから紐づけるPersistentVolumeとPersistentVolumeClaimを作成します。PersistentVolumeのマニフェストでは、NFSサーバのServiceオブジェクトのClusterIPを設定することでアクセスできるようになる仕組みです。

01apiVersion: v1
02kind: PersistentVolume
03metadata:
04  name: mysql-pv
05  labels:
06    type: local
07spec:
08  storageClassName: mysql
09  capacity:
10    storage: 10Gi
11  accessModes:
12    - ReadWriteMany
13  nfs:
14    server: xx.xx.xx.xx #「nfs-service」のCLUSTER-IPを定義
15    path: /
01apiVersion: v1
02kind: PersistentVolumeClaim
03metadata:
04  name: mysql-pvc
05  labels:
06    app: wordpress
07    tier: mysql
08spec:
09  storageClassName: mysql
10  accessModes:
11    - ReadWriteMany
12  resources:
13    requests:
14      storage: 5Gi
01apiVersion: v1
02kind: PersistentVolume
03metadata:
04  name: wordpress-pv
05  labels:
06    type: local
07spec:
08  storageClassName: wordpress
09  capacity:
10    storage: 10Gi
11  accessModes:
12    - ReadWriteMany
13  nfs:
14    server: xx.xx.xx.xx #「nfs-service」のCLUSTER-IPを定義
15    path: /
01apiVersion: v1
02kind: PersistentVolumeClaim
03metadata:
04  name: wordpress-pvc
05  labels:
06    app: wordpress
07    tier: wordpress
08spec:
09  storageClassName: wordpress
10  accessModes:
11    - ReadWriteMany
12  resources:
13    requests:
14      storage: 5Gi

下表は、マニフェストの定義項目の概要です。

定義 説明
name,labels 多数のPersistentVolumeがある場合に識別しやすくなるため、設定を推奨
storageClassName PersistentVolumeのStorageClassを指定
PersistentVolumeClaimは紐づけるPersistentVolumeの storageClassNameを指定
※このstorageClassはDynamicProvisioningではなく、単純に設定した値のPersistentVolumeと PersistentVolumeClaimを紐づける
storage クラウドプロバイダーの機能と連携して、ロードバランサやディスクボリュームなどのリソースを管理する
accessModes ・ReadWriteOnce(RWO):
 単一ノードからRead/Write
・ReadOnlyMany(ROX):
 複数ノードからRead
・ReadWriteMany(RWX):
 複数ノードからRead/Write
persistentVolumeReclaimPolicy ・Delete:
 PersistentVolumeの実体が削除される
・Retain:
 指定しない場合はRetain、PersistentVolumeの実体は削除せずに保持、他のPersistentVolumeClaimにより、このPersistentVolumeは再マウントされない
・Recycle:
 PersistentVolumeのデータを削除(rm –rf ./*) し再利用可能にする
他のPersistentVolumeClaimにより再マウントされる
nfs nfs-serviceのIP アドレスを入力してNFS サーバを指定

マニフェストを適用します。

1$ kubectl apply -f mysql-pv.yaml
2$ kubectl apply -f mysql-pvc.yaml
3$ kubectl apply -f wordpress-pv.yaml
4$ kubectl apply -f wordpress-pvc.yaml

Bound状況を確認します。

01$ kubectl get pvc,pv
02 
03NAME                                   STATUS     VOLUME                                    CAPACITY   ACCESS  MODES   STORAGECLASS   AGE
04persistentvolumeclaim/mysql-pvc        Bound      mysql-pv                                  10Gi       RWX             mysql          25h
05persistentvolumeclaim/nfs-pvc          Bound      csi-3ce3f735-04a8-4b22-a768-7ae794d200a7  50Gi       RWO             oci-bv         26h
06persistentvolumeclaim/wordpress-pvc    Bound      wordpress-pv                              10Gi       RWX             wordpress      25h
07 
08NAME                                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE
09persistentvolume/csi-3ce3f735-04a8-4b22-a768-7ae794d200a7  50Gi       RWO            Delete           Bound    default/nfs-pvc        oci-bv                  26h
10persistentvolume/mysql-pv                                  10Gi       RWX            Retain           Bound    default/mysql-pvc      mysql                   25h
11persistentvolume/wordpress-pv                              10Gi       RWX            Retain           Bound    default/wordpress-pvc  wordpress               25h
日本オラクル株式会社

Oracle Groundbreaker Advocate
Principal Cloud Solution Engineer

これまで、インフラエンジニア、フロントエンドエンジニアとして官公庁のシステム基盤を中心としたサーバの設計構築、運用保守、Webシステム開発を担当。技術教育者として専門学校でクラウド技術やOSS(Linux、Docker、Kubernetes)の授業を担当し、企業様向けプライベートトレーニング講師も担当。 アドボケート/エバンジェリストとしてミートアップ、カンファレンスで登壇。現在は、クラウドネイティブ技術を中心とするソリューションエンジニアとして活動。クラウドネイティブ技術に関連するコミュニティの運営にも積極的に参加。

Community:
Oracle Cloud Hangout Cafe メンバー (#ochacafe)
CloudNative Days Tokyo 実行委員会メンバー (#CNDT)

Book:
著書「Dockerコンテナ開発・環境構築の基本」(インプレス)
共著「RancherによるKubernetes活用完全ガイド」(インプレス)、「コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤」(翔泳社)

連載バックナンバー

仮想化/コンテナ技術解説
第6回

Oracle Cloud Hangout Cafe Season 4 #5「Kubernetesのオートスケーリング」(2021年8月4日開催)

2024/5/29
第2弾の連載第6回では、2021年8月4日に開催された「Oracle Cloud Hangout Cafe Season4 #5『Kubernetesのオートスケーリング』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第5回

Oracle Cloud Hangout Cafe Season4 #4「Observability 再入門」(2021年9月8日開催)

2024/4/23
第2弾の連載第5回では、2021年9月8日に開催された「Oracle Cloud Hangout Cafe Season4 #4『Observability 再入門』」の発表内容に基づいて紹介していきます。
仮想化/コンテナ技術解説
第4回

Oracle Cloud Hangout Cafe Season6 #4「Pythonで作るAPIサーバー」(2022年12月7日開催)

2024/3/21
第2弾の連載第4回では、2022年12月7日に開催された 「Oracle Cloud Hangout Cafe Season6 #4『Pythonで作るAPIサーバー』」の発表内容に基づいて紹介していきます。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています