Deployment&Serviceの作成
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.1 443/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.1 443/TCP,12250/TCP 25h
$ kubectl get pv,pvc
No resources found
オブジェクトは、適用したマニフェストまたはオブジェクト名を指定することで削除できます。
おわりに
これまでのアプリケーション開発における環境の背景から、仮想マシンとコンテナの違いやコンテナ単体としてのBuild/Ship/Runを見てきました。そして、コンテナ単体ではできないことを実現するコンテナオーケストレーションの概要と各コンポーネントを見てきました。最後に、Kubernetesクラスタ上でアプリケーションを動かす例として、WordPressの環境を構築する例を見てきました。Kubernetesクラスタ上でアプリケーションを稼働させるイメージを掴めたでしょうか。
本連載記事の内容はKubernetesの一側面ではありますが、これからKubernetesを始める上でお役に立てれば幸いです。
- この記事のキーワード