おうちk8sにwordpressを入れてみた記事を以前書きました。
helm installで構築したのですが、まあカスタマイズが上手くいかない。
実はingressを設けて、このwordpressをブラウザで表示させようとしましたが、それだけなのに、とんでもなくハマりました。
その記事はおいおい書くとして、今回はカスタマイズしやすいようにもう自分でwordpressのhelm Chartを作ってしまおうと思いました。
この記事ではそのことについて書いておきます。
「helmとは」については以下👇の記事でも記載したので興味あれば読んでちょ
で、今回は実際にブラウザで確認する前に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を立ち上げてみる
参考にしたサイトは以下
実装
ファイル構成は以下になりました。
最終的なコードは以下。
✅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が立ち上がったと思ったけど、すぐにエラーでリスタートを繰り返すようになっていた。
次回は、そこら辺を解決していった内容を記載していきます。