1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

順を追ってkubernetes上でWordPressを展開する

Last updated at Posted at 2020-10-11

順を追ってkubernetes上でWordPressを展開してみます。

動作環境

kubernetesクラスタはDocker Desktop for Macを利用して、Macのローカル環境で動かしています。kubernetesのバージョンは1.18.6、ノードはmasterのみです。

$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   57d   v1.18.6

コンポーネントの構成

今回展開する構成は下記の通りです。

Components.png

アイコン: https://github.com/kubernetes/community/tree/master/icons

WordPressの展開

Manifestファイルを作成しながら、リソースを展開していきます。
Manifestファイル作成の過程で、CKACKADの試験テクニックとしてよく使うkubectlコマンドの--dry-run=clientオプションを使って雛形を生成しながらリソースを展開していきます。

DBユーザのパスワード用のSecret

DBユーザのパスワードをSecretリソースで展開します。
下記のコマンドでManifestファイルを生成します。パスワードは必要に応じて変更してください。

$ kubectl create secret generic wordpress --from-literal=db-password=wordpress-password --dry-run=client -o yaml > wp-secret.yaml

下記のようなManifestファイル(wp-secret.yaml)が生成されます。

apiVersion: v1
data:
  db-password: d29yZHByZXNzLXBhc3N3b3Jk
kind: Secret
metadata:
  creationTimestamp: null
  name: wordpress

このままでも問題ありませんが、不要な部分を削除して下記のように整形しておきます。

apiVersion: v1
data:
  db-password: d29yZHByZXNzLXBhc3N3b3Jk
kind: Secret
metadata:
  name: wordpress

DB用のPersistent Volume Claim

DB(MySQL)のPodにマウントするVolumeを作成するため、Persistent Volume Claimを作成します。Persistent Volume ClaimはkubectlからManifestの雛形を作成できないので、ドキュメントを参考にManifestファイル(mysql-pvc.yaml)を作成します。容量は適宜変更してください。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

なお、Docker Desktop for Macのkubernetes環境の場合、Dynamic Volume Provisioningにより、Persistent Volumeは自動的に作成されます。

MySQLのDeployment

WordPressのDBとしてMySQLコンテナを展開します。
Deploymentを利用してPodを展開することにします。

まずkubectlでManifestファイルの雛形を作成します。

$ kubectl create deployment mysql --image=mysql --dry-run=client -o yaml > mysql-deployment.yaml

下記のようなManifestファイルの雛形(mysql-deployment.yaml)が作成されます。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mysql
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql
        name: mysql
        resources: {}
status: {}

次に不要な部分を削除し、MySQLコンテナの起動に必要な環境変数を設定します。環境変数のうち、MYSQL_PASSWORDは、先ほど作成したSecretリソースから読み込むようにします。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql
          name: mysql
          env:
            - name: MYSQL_RANDOM_ROOT_PASSWORD
              value: "yes"
            - name: MYSQL_DATABASE
              value: wordpress
            - name: MYSQL_USER
              value: wordpress
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress
                  key: db-password

ここでは、rootユーザではなく、wordpressという専用のDBユーザを利用するように設定しています。

次にDBのデータの永続化のために、先ほど作成したPersistent Volume ClaimをマウントするようにManifestファイルを変更します。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: mysql
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql
          name: mysql
          env:
            - name: MYSQL_RANDOM_ROOT_PASSWORD
              value: "yes"
            - name: MYSQL_DATABASE
              value: wordpress
            - name: MYSQL_USER
              value: wordpress
            - name: MYSQL_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress
                  key: db-password
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-volume
      volumes:
        - name: mysql-volume
          persistentVolumeClaim:
            claimName: mysql-pvc

MySQL用のService

先ほど展開したMySQLのDeployment(Pod)にkubernetesクラスタ内から直接アクセスすることも可能ですが、Serviceを経由してアクセスするように設定します。

ServiceのManifestファイルの雛形を作成するために、一度これまで作成してきたManifestファイルからリソースを作成します。

$ ls
mysql-deployment.yaml	mysql-pvc.yaml		wp-secret.yaml
$ kubectl apply -f .
deployment.apps/mysql created
persistentvolumeclaim/mysql-pvc created
secret/wordpress created

次にMySQLのDeploymentを公開するためのServiceのManifestファイルの雛形を作成します。

$ kubectl expose deployment mysql --name=mysql-service --port=3306 --dry-run=client -o yaml > mysql-service.yaml

下記のようなManifestファイルの雛形(mysql-service.yaml)が作成されます。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: mysql
  name: mysql-service
spec:
  ports:
  - port: 3306
    protocol: TCP
    targetPort: 3306
  selector:
    app: mysql
status:
  loadBalancer: {}

不要な部分を削除して下記のように整形しておきます。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: mysql
  name: mysql-service
spec:
  ports:
    - port: 3306
      protocol: TCP
      targetPort: 3306
  selector:
    app: mysql

上記のServiceを展開しておきます。

$ kubectl apply -f mysql-service.yaml
service/mysql-service created

ここまででDBの展開が完了しました。

WordPressのDeployment

WordPressのコンテナを展開します。
DBと同じくDeploymentを利用してPodを展開します。

まずkubectlを利用して、Manifestファイルの雛形を作成します。

$ kubectl create deployment wordpress --image=wordpress --dry-run=client -o yaml > wp-deployment.yaml

下記のようなManifestファイルの雛形(wp-deployment.yaml)が作成されます。

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: wordpress
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: wordpress
    spec:
      containers:
      - image: wordpress
        name: wordpress
        resources: {}
status: {}

不要な部分を削除しつつ、WordPressの実行に必要な環境変数を設定します。
MySQLのDeploymentと同じくDBのパスワード(WORDPRESS_DB_PASSWORD)はSecretから読み込みます。またWordPressのホスト名(WORDPRESS_DB_HOST)は、先ほど作成したMYSQLのService名(mysql-service)を指定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: wordpress
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
        - image: wordpress
          name: wordpress
          env:
            - name: WORDPRESS_DB_HOST
              value: mysql-service
            - name: WORDPRESS_DB_USER
              value: wordpress
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: wordpress
                  key: db-password
            - name: WORDPRESS_DB_NAME
              value: wordpress

ここまで作成したら、WordPressのDeploymentを展開します。

$ kubectl apply -f wp-deployment.yaml 
deployment.apps/wordpress created

WordPress用のService

最後に作成したWordPressのDeploymentをServiceとして公開します。
kubectlコマンドでServiceのManifestファイルの雛形を作成します。

$ kubectl expose deployment wordpress --port=80 --dry-run=client -o yaml > wp-service.yaml

下記のようなManifestファイルの雛形(wp-service.yaml)が作成されます。

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: wordpress
  name: wordpress
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: wordpress
status:
  loadBalancer: {}

不要な部分を削除してManifestファイルを整形します。

apiVersion: v1
kind: Service
metadata:
  labels:
    app: wordpress
  name: wordpress-service
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: wordpress

作成したManifestファイルでServiceを展開します。

$ kubectl apply -f wp-service.yaml 
service/wordpress-service created

作成されたリソースの確認

ここまでの手順でWordPressの展開が完了しました。
作成されたリソースを確認しておきます。

$ kubectl get deployments,pods,services,secrets
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql       1/1     1            1           43m
deployment.apps/wordpress   1/1     1            1           13m

NAME                             READY   STATUS    RESTARTS   AGE
pod/mysql-76d48947b-88dz7        1/1     Running   0          43m
pod/wordpress-666b48f5bd-vncmh   1/1     Running   0          13m

NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubernetes          ClusterIP   10.96.0.1       <none>        443/TCP    57d
service/mysql-service       ClusterIP   10.97.95.189    <none>        3306/TCP   29m
service/wordpress-service   ClusterIP   10.111.138.76   <none>        80/TCP     2m23s

NAME                         TYPE                                  DATA   AGE
secret/default-token-4tvq2   kubernetes.io/service-account-token   3      57d
secret/wordpress             Opaque                                1      43m

WordPressへのアクセス

最後に展開されたWordPressへアクセスしてみます。
ここではkubectlport-forwardサブコマンドにてポートフォワードをしてアクセスします。ローカルのポートは必要に応じて変更してください。ここでは8080ポートを利用します。

$ kubectl port-forward service/wordpress-service 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

ブラウザからhttp://localhost:8080へアクセスして、WordPress画面が表示されたアクセス成功です。
Screen Shot 2020-10-10 at 23.41.57.png
また言語選択をして、サイトタイトル入力画面に遷移したら、DBへのアクセスも成功しています。
Screen Shot 2020-10-10 at 23.45.10.png

以上でkubernetes上へのWordPressの展開は完了です。

Clean up

展開したリソースが不要になったら、削除しておきます。

$ ls               
mysql-deployment.yaml	mysql-service.yaml	wp-secret.yaml
mysql-pvc.yaml		wp-deployment.yaml	wp-service.yaml
$ kubectl delete -f .
deployment.apps "mysql" deleted
persistentvolumeclaim "mysql-pvc" deleted
service "mysql-service" deleted
deployment.apps "wordpress" deleted
secret "wordpress" deleted
service "wordpress-service" deleted
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?