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の作成

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

日本オラクル株式会社

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

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