「Oracle Cloud Hangout Cafe (OCHaCafe)」ダイジェスト2 1

Deployment&Serviceの作成

Deployment&Serviceの作成

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

Deployment & Serviceの作成

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にアクセスします。

WordPressの初期画面

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を始める上でお役に立てれば幸いです。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る