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)