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 超入門』」の発表内容に基づいて紹介していきます。

Deployment&Serviceの作成

WordPressとMySQLのDeployment、WordPressからMySQLに接続するServiceと外部からWordPressのPodにアクセスするServiceをLoadBalancerタイプで作成します。

Deployment & Serviceの作成

01apiVersion: apps/v1
02kind: Deployment
03metadata:
04  name: mysql
05  labels:
06    app: mysql
07spec:
08  replicas: 1
09  selector:
10    matchLabels:
11      app: mysql
12  template:
13    metadata:
14      labels:
15        app: mysql
16    spec:
17      containers:
18        - image: mysql:5.6
19          name: mysql
20          #MySQLのrootパスワードを参照する定義
21          env:
22            - name: MYSQL_ROOT_PASSWORD
23              valueFrom:
24                secretKeyRef:
25                  name: mysql
26                  key: password
27          ports:
28            - containerPort: 3306
29              name: mysql
30          #Podのマウントパス定義
31          volumeMounts:
32            - name: mysql-local-storage
33              mountPath: /var/lib/mysql
34      #mysql-pvc」を指定する定義
35      volumes:
36        - name: mysql-local-storage
37          persistentVolumeClaim:
38            claimName: mysql-pvc
01apiVersion: apps/v1
02kind: Deployment
03metadata:
04  name: wordpress
05  labels:
06    app: wordpress
07spec:
08  replicas: 1
09  selector:
10    matchLabels:
11      app: wordpress
12  template:
13    metadata:
14      labels:
15        app: wordpress
16    spec:
17      containers:
18        - image: wordpress:5.6.2
19          name: wordpress
20          env:
21          #Service名「mysql-service」を定義
22          - name: WORDPRESS_DB_HOST
23            value: mysql-service
24          #MySQLのデータベースパスワードを参照する定義
25          - name: WORDPRESS_DB_PASSWORD
26            valueFrom:
27              secretKeyRef:
28                name: mysql
29                key: password
30          ports:
31            - containerPort: 80
32              name: wordpress
33          #Podのマウントパス定義
34          volumeMounts:
35            - name: wordpress-local-storage
36              mountPath: /var/www/html
37      #「wordpress-pvc」を指定する定義
38      volumes:
39        - name: wordpress-local-storage
40          persistentVolumeClaim:
41            claimName: wordpress-pvc

下表は、Pod内にあるコンテナ(WordPress / MySQL)の定義概要です。

定義 説明
containers ・image:
 イメージレジストリ指定
・env:
 環境変数指定、ここでは環境変数としてMYSQL_ROOT_PASSWORDを定義し、Secretsに登録したパスワードを参照
・containerPort:
 コンテナのポート番号を指定
・volumeMounts:
 PersistentVolumeClaimで要求するvolumeをマウントするコンテナ側のディレクトリを指定
・volumes:
 連携する PersistentVolumeClaimを指定

次に、Serviceを作成します。WordPress PodからこのServiceを経由して、MySQL Podにアクセスするための定義です。

01apiVersion: v1
02kind: Service
03metadata:
04  name: mysql-service
05  labels:
06    app: mysql
07spec:
08  type: ClusterIP
09  ports:
10    - protocol: TCP
11      port: 3306
12      targetPort: 3306
13  selector:
14    app: mysql

「type: LoadBalancer」を指定することにより、Control Planeのコンポーネントであるcloud-controller-managerとOCIのリソースが連携して、このServiceにEXTERNAL-IPを適用します。

01apiVersion: v1
02kind: Service
03metadata:
04  name: wordpress-service
05  annotations:
06    service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
07    service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
08    service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
09  labels:
10    app: wordpress
11spec:
12  #type: LoadBalancerを定義
13  type: LoadBalancer
14  ports:
15    - protocol: TCP
16      port: 80
17      targetPort: 80
18  selector:
19    app: wordpress

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

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

Podのステータスを確認します。

1$ kubectl get pods
2 
3NAME                           READY   STATUS    RESTARTS   AGE
4mysql-8585f7cbd7-9hz79         1/1     Running   0          25h
5nfs-server-5c9d68c76c-kxq4d    1/1     Running   0          26h
6wordpress-76f698c64-2qh8m      1/1     Running   0          25h

Serviceのステータスを確認し、wordpress-serviceにあるEXTERNAL-IPをブラウザでアクセスしてWordPressの初期画面が表示されれば完了です。

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           34d
5mysql-service        ClusterIP     10.96.94.102   <none>            3306/TCP                    26h
6nfs-service          ClusterIP     10.96.211.52   <none>            2049/TCP,20048/TCP,111/TCP  26h
7wordpress-service    LoadBalancer  10.96.251.162  150.230.xxx.xxx   80:32516/TCP                25h</none></none></none>

ブラウザを起動して、http://EXTERNAL-IP/wp-admin/install.phpにアクセスします。

WordPressの初期画面

Podのスケールアウトとイン
WordPressのPodを10個増やしてスケールアウトしてみます。マニフェストファイルのreplicasで定義した後に適用もできますが、以下のようにコマンドでも実行できます。

1$ kubectl scale deployment wordpress --replicas 10

WordPressのPodが10個あることを確認します。

01$ kubectl get pods
02 
03NAME                          READY   STATUS    RESTARTS   AGE
04mysql-c468c5548-bh6t5         1/1     Running   0          6m41s
05nfs-server-754d98f49b-zmfld   1/1     Running   0          10m
06wordpress-74d8c99c7f-6dhzg    1/1     Running   0          104s
07wordpress-74d8c99c7f-kg96k    1/1     Running   0          104s
08wordpress-74d8c99c7f-m2dg7    1/1     Running   0          104s
09wordpress-74d8c99c7f-mjrsm    1/1     Running   0          6m19s
10wordpress-74d8c99c7f-nzxkd    1/1     Running   0          104s
11wordpress-74d8c99c7f-pbr57    1/1     Running   0          104s
12wordpress-74d8c99c7f-pfrfz    1/1     Running   0          104s
13wordpress-74d8c99c7f-qqtdc    1/1     Running   0          104s
14wordpress-74d8c99c7f-rknbm    1/1     Running   0          105s
15wordpress-74d8c99c7f-svhpj    1/1     Running   0          104s

WordPressのPodを1個にスケールインします。

1$ kubectl scale deployment wordpress --replicas 1
2 
3$ kubectl get pods
4 
5NAME                          READY   STATUS    RESTARTS   AGE
6mysql-c468c5548-bh6t5         1/1     Running   0          6m41s
7nfs-server-754d98f49b-zmfld   1/1     Running   0          10m
8wordpress-74d8c99c7f-mjrsm    1/1     Running   0          6m19s

オブジェクトの削除
これまでマニフェストを適用して構築したWordPress環境は、オブジェクトをすべて削除することでアンインストールできます。

WordPressとMySQLのDeploymen、Serviceを削除します。以下は適用したマニフェストファイルを指定して削除しています。

1$ kubectl delete -f wordpress-service.yaml
2$ kubectl delete -f wordpress.yaml
3$ kubectl delete -f mysql-service.yaml
4$ kubectl delete -f mysql.yaml

WordPressとMySQLのPersistentVolume、PersistentVolumeClaimを削除します。以下は各オブジェクト名を指定して削除しています。

1$ kubectl delete service nfs-service
2$ kubectl delete deployment nfs-server
3$ kubectl delete pvc nfs-pvc

Secretを削除します。

1$ kubectl delete secret mysql

削除できたことを確認します。

01$ kubectl get secrets
02No resources found in default namespace.
03 
04$ kubectl get pods
05No resources found in default namespace.
06 
07$ kubectl get services
08 
09NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
10kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP,12250/TCP   25h
11 
12$ kubectl get pv,pvc
13 
14No resources found</none>

オブジェクトは、適用したマニフェストまたはオブジェクト名を指定することで削除できます。

おわりに

これまでのアプリケーション開発における環境の背景から、仮想マシンとコンテナの違いやコンテナ単体としてのBuild/Ship/Runを見てきました。そして、コンテナ単体ではできないことを実現するコンテナオーケストレーションの概要と各コンポーネントを見てきました。最後に、Kubernetesクラスタ上でアプリケーションを動かす例として、WordPressの環境を構築する例を見てきました。Kubernetesクラスタ上でアプリケーションを稼働させるイメージを掴めたでしょうか。

本連載記事の内容はKubernetesの一側面ではありますが、これからKubernetesを始める上でお役に立てれば幸いです。

日本オラクル株式会社

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メルマガ会員のサービス内容を見る

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