wordpressの自作Helm Chartを作った話(案の定k8sが上手くいかない #5)

スポンサーリンク
個人開発
スポンサーリンク

おうちk8sにwordpressを入れてみた記事を以前書きました。

helm installで構築したのですが、まあカスタマイズが上手くいかない。

実はingressを設けて、このwordpressをブラウザで表示させようとしましたが、それだけなのに、とんでもなくハマりました。

その記事はおいおい書くとして、今回はカスタマイズしやすいようにもう自分でwordpressのhelm Chartを作ってしまおうと思いました。

この記事ではそのことについて書いておきます。

「helmとは」については以下👇の記事でも記載したので興味あれば読んでちょ

https://apao-m-appare99999.com/?p=1478

で、今回は実際にブラウザで確認する前にhelmで自作Chartどうやって作ったん?ってところまで書こうと思っています。

今回参考にした本は「実践Helm─自作アプリをKubernetesクラスタに簡単デプロイ!」です。

そもそもHelmのChartって?

ChartはHelmで利用するパッケージのテンプレートです。

Chartはtgz形式で圧縮されており、Helm Chartリポジトリーから取得できます。

自作Chartの場合、重要になるのは、

  • Chart.yaml
  • value.yaml
  • templateディレクトリ

です。

  • Chart.yamlはChartの説明やソースリポジトリーなどの情報が記載されている
  • value.yamlはtemplateディレクトリ配下のマニフェストファイルに使用する変数を定義している
  • templateディレクトリ配下にはマニフェストファイル群が配置されるようになっている

自作Helm Chartの作り方

では、Helm Chartを作っていきます。

作成コマンドは以下です。

$ helm create testwordpress
Creating testwordpress

作成されたChartのディレクトリーの確認

$ tree testwordpress/
testwordpress/
├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── hpa.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   ├── serviceaccount.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

4 directories, 10 files

デフォルトで入っているtemplates配下のファイルを削除(今回はフルスクラッチで作るため)

$ rm -rf testwordpress/templates/*

試しにwordpressを立ち上げてみる

参考にしたサイトは以下

Kubernetes: Local Volumeの検証 - Qiita
Kubernetes Local Volume の概要 Kubernetesではv1.10からBetaとしてLocal Volumeがサポートされました。Local Volumeとは、Kubern…

実装

ファイル構成は以下になりました。

最終的なコードは以下。

✅depoyment.yaml

※パスワード等はシークレットを使わず直接書いてます(よろしくないですが)

---

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: test-wordpress
  labels:
    app: test-wordpress
  namespace: wp
spec:
  selector:
    matchLabels:
      app: test-wordpress
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: test-wordpress
    spec:
      containers:
      - image: wordpress:6.7.0-apache
        name: wordpress-container
        env:
        - name: WORDPRESS_DB_HOST
          value: test-wp-mysql
        - name: WORDPRESS_DB_PASSWORD
          value: testpassword
        - name: WORDPRESS_DB_USER
          value: testuser
        - name: WORDPRESS_DB_NAME
          value: wordpress
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: test-wordpress-pvc

✅service.yaml

apiVersion: v1
kind: Service
metadata:
  name: test-wordpress-service
  namespace: wp
  labels:
    app: test-wordpress
  creationTimestamp: null
spec:
  selector:
    app: test-wordpress
  type: ClusterIP
  ports:
  - name: wordpress
    port: 80
    protocol: TCP
    targetPort: 80

✅pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: test-wordpress-pv
  namespace: wp
spec:
  capacity:
    storage: 1Gi  # PVC のサイズに合わせる
  accessModes:
    - ReadWriteOnce  # PVC のアクセスモードに合わせる
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/data  # 実際のパスに変更
  nodeAffinity:
    required:
      nodeSelectorTerms:
        - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
                - k8s-worker2  # PV を使用するノードを指定

✅pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-wordpress-pvc
  namespace: wp
  labels:
    app: test-wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage

✅sc-lv.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
  namespace: wp
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

pv用にk8s-worker2にディレクトリを作る

root@k8s-worker2:~# mkdir -p /mnt/data

起動は以下のコマンド

$ helm install testwordpress ./testwordpress

確認

applyした各値を確認。

$ kubectl get svc -n wp | grep -E "NAME|test-wordpress-service"
NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
test-wordpress-service   ClusterIP   10.99.94.192     <none>        80/TCP     4d
$ kubectl get sc -n wp | grep -E "NAME|local-storage"
NAME                  PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-storage         kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false                  4d
$ kubectl get pv -n wp | grep -E "NAME|test-wordpress-pv"
NAME                   CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM                        STORAGECLASS          VOLUMEATTRIBUTESCLASS   REASON   AGE
test-wordpress-pv      1Gi        RWO            Retain           Bound      wp/test-wordpress-pvc        local-storage         <unset>                          4d
$ kubectl get pvc -n wp | grep -E "NAME|test-wordpress"
NAME                 STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS          VOLUMEATTRIBUTESCLASS   AGE
test-wordpress-pvc   Bound    test-wordpress-pv   1Gi        RWO            local-storage         <unset>                 4d
$ kubectl get pod -n wp | grep -E "NAME|test-wordpress"
NAME                             READY   STATUS    RESTARTS   AGE
test-wordpress-c945d569-zmxnr    1/1     Running   0          4d

k8s-worker2にてマウントしたファイルがあるかを確認

root@k8s-worker2:~# ls /mnt/data
index.php        wp-admin              wp-config.php  wp-links-opml.php  wp-settings.php
license.txt      wp-blog-header.php    wp-content     wp-load.php        wp-signup.php
readme.html      wp-comments-post.php  wp-cron.php    wp-login.php       wp-trackback.php
wp-activate.php  wp-config-sample.php  wp-includes    wp-mail.php        xmlrpc.php

まだ完了していなかった

上記の表記だと、wordpressのpodのAGEは4dだけど、これは後ほど確認した値だから。

実は、wordpressのpodが立ち上がったと思ったけど、すぐにエラーでリスタートを繰り返すようになっていた。

次回は、そこら辺を解決していった内容を記載していきます。

タイトルとURLをコピーしました