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

Deployment&Serviceの作成
WordPressとMySQLのDeployment、WordPressからMySQLに接続するServiceと外部からWordPressのPodにアクセスするServiceをLoadBalancerタイプで作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
#MySQLのrootパスワードを参照する定義
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 3306
name: mysql
#Podのマウントパス定義
volumeMounts:
- name: mysql-local-storage
mountPath: /var/lib/mysql
#mysql-pvc」を指定する定義
volumes:
- name: mysql-local-storage
persistentVolumeClaim:
claimName: mysql-pvc
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress:5.6.2
name: wordpress
env:
#Service名「mysql-service」を定義
- name: WORDPRESS_DB_HOST
value: mysql-service
#MySQLのデータベースパスワードを参照する定義
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 80
name: wordpress
#Podのマウントパス定義
volumeMounts:
- name: wordpress-local-storage
mountPath: /var/www/html
#「wordpress-pvc」を指定する定義
volumes:
- name: wordpress-local-storage
persistentVolumeClaim:
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にアクセスするための定義です。
apiVersion: v1
kind: Service
metadata:
name: mysql-service
labels:
app: mysql
spec:
type: ClusterIP
ports:
- protocol: TCP
port: 3306
targetPort: 3306
selector:
app: mysql
「type: LoadBalancer」を指定することにより、Control Planeのコンポーネントであるcloud-controller-managerとOCIのリソースが連携して、このServiceにEXTERNAL-IPを適用します。
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
annotations:
service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "100"
labels:
app: wordpress
spec:
#type: LoadBalancerを定義
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
selector:
app: wordpress
マニフェストを適用します。
$ kubectl apply -f mysql.yaml $ kubectl apply -f mysql-service.yaml $ kubectl apply -f wordpress.yaml $ kubectl apply -f wordpress-service.yaml
Podのステータスを確認します。
$ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-8585f7cbd7-9hz79 1/1 Running 0 25h nfs-server-5c9d68c76c-kxq4d 1/1 Running 0 26h wordpress-76f698c64-2qh8m 1/1 Running 0 25h
Serviceのステータスを確認し、wordpress-serviceにあるEXTERNAL-IPをブラウザでアクセスしてWordPressの初期画面が表示されれば完了です。
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP,12250/TCP 34d mysql-service ClusterIP 10.96.94.102 3306/TCP 26h nfs-service ClusterIP 10.96.211.52 2049/TCP,20048/TCP,111/TCP 26h wordpress-service LoadBalancer 10.96.251.162 150.230.xxx.xxx 80:32516/TCP 25h
ブラウザを起動して、http://EXTERNAL-IP/wp-admin/install.phpにアクセスします。
Podのスケールアウトとイン
WordPressのPodを10個増やしてスケールアウトしてみます。マニフェストファイルのreplicasで定義した後に適用もできますが、以下のようにコマンドでも実行できます。
$ kubectl scale deployment wordpress --replicas 10
WordPressのPodが10個あることを確認します。
$ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-c468c5548-bh6t5 1/1 Running 0 6m41s nfs-server-754d98f49b-zmfld 1/1 Running 0 10m wordpress-74d8c99c7f-6dhzg 1/1 Running 0 104s wordpress-74d8c99c7f-kg96k 1/1 Running 0 104s wordpress-74d8c99c7f-m2dg7 1/1 Running 0 104s wordpress-74d8c99c7f-mjrsm 1/1 Running 0 6m19s wordpress-74d8c99c7f-nzxkd 1/1 Running 0 104s wordpress-74d8c99c7f-pbr57 1/1 Running 0 104s wordpress-74d8c99c7f-pfrfz 1/1 Running 0 104s wordpress-74d8c99c7f-qqtdc 1/1 Running 0 104s wordpress-74d8c99c7f-rknbm 1/1 Running 0 105s wordpress-74d8c99c7f-svhpj 1/1 Running 0 104s
WordPressのPodを1個にスケールインします。
$ kubectl scale deployment wordpress --replicas 1 $ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-c468c5548-bh6t5 1/1 Running 0 6m41s nfs-server-754d98f49b-zmfld 1/1 Running 0 10m wordpress-74d8c99c7f-mjrsm 1/1 Running 0 6m19s
オブジェクトの削除
これまでマニフェストを適用して構築したWordPress環境は、オブジェクトをすべて削除することでアンインストールできます。
WordPressとMySQLのDeploymen、Serviceを削除します。以下は適用したマニフェストファイルを指定して削除しています。
$ kubectl delete -f wordpress-service.yaml $ kubectl delete -f wordpress.yaml $ kubectl delete -f mysql-service.yaml $ kubectl delete -f mysql.yaml
WordPressとMySQLのPersistentVolume、PersistentVolumeClaimを削除します。以下は各オブジェクト名を指定して削除しています。
$ kubectl delete service nfs-service $ kubectl delete deployment nfs-server $ kubectl delete pvc nfs-pvc
Secretを削除します。
$ kubectl delete secret mysql
削除できたことを確認します。
$ kubectl get secrets No resources found in default namespace. $ kubectl get pods No resources found in default namespace. $ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1443/TCP,12250/TCP 25h $ kubectl get pv,pvc No resources found
オブジェクトは、適用したマニフェストまたはオブジェクト名を指定することで削除できます。
おわりに
これまでのアプリケーション開発における環境の背景から、仮想マシンとコンテナの違いやコンテナ単体としてのBuild/Ship/Runを見てきました。そして、コンテナ単体ではできないことを実現するコンテナオーケストレーションの概要と各コンポーネントを見てきました。最後に、Kubernetesクラスタ上でアプリケーションを動かす例として、WordPressの環境を構築する例を見てきました。Kubernetesクラスタ上でアプリケーションを稼働させるイメージを掴めたでしょうか。
本連載記事の内容はKubernetesの一側面ではありますが、これからKubernetesを始める上でお役に立てれば幸いです。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Kubernetes上のコンテナをIngressでインターネットに公開するまで
- StatefulSetとPersistentVolumeを使ってステートフルアプリケーションを動かす
- コンテナを使いこなすための心強い味方!「Kubernetes」(中編)
- KubernetesのDiscovery&LBリソース(その1)
- KubernetesのWorkloadsリソース(その1)
- Kubernetesの基礎
- kustomizeやSecretを利用してJavaアプリケーションをデプロイする
- Oracle Cloud Hangout Cafe Season5 #3「Kubernetes のセキュリティ」(2022年3月9日開催)
- KubernetesのマニフェストをMagnumで実行する
- KubernetesのDiscovery&LBリソース(その2)



