こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
前回、シンプルなWorpress環境をGKE上に構築致しました。
PV/PVCやConfigMap,Secrets等を使用していない為、本番環境には絶対に向かない構成ではありますが、Kubernetes触りたての方が勉強の為に構築するにはいい塩梅の環境になっているかなと自負してたりします。
今回は上記の構成であることに変わりはないのですが、yamlに環境変数を直接書いている状態をやめて、ConfigMapに転記していきたいと思います。
構築する環境
但し、ConfigMapを使い環境変数をpodにアタッチしています。
用意したファイル一覧
★前回から差分の無いファイルは記載しておりません。
wordpress-configmap.yaml
metadata.nameに書かれている名前がConfigMapとして作成されます。
この例で言うとwordpress-configmap.yamlをKubernetesに渡すとwp-cmというConfigMapが生成されます。
apiVersion: v1
kind: ConfigMap
metadata:
name: wp-cm
data:
WORDPRESS_DB_HOST: mysql-clusterip
WORDPRESS_DB_USER : devuser
WORDPRESS_DB_PASSWORD : password
WORDPRESS_DB_NAME : gke-wordpress-database
mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mysql-cm
data:
MYSQL_USER : devuser
MYSQL_PASSWORD : password
MYSQL_ROOT_PASSWORD : password
MYSQL_DATABASE : gke-wordpress-database
wordpress-pod.yaml
spec.containers.envFrom.configMapRef.nameにある"wp-cm"はwordpress-configmap.yamlでデプロイされるConfigMapを指します。
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress
spec:
containers:
- name: wordpress-con
image: wordpress:php8.1-apache
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: wp-cm
mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql
spec:
containers:
- name: mysql-con
image: mysql:8.0-debian
ports:
- containerPort: 3306
envFrom:
- configMapRef:
name: mysql-cm
構築
ConfigMapからデプロイしていきます。
$ kubectl apply -f wordpress-configmap.yaml
configmap/wp-cm created
$ kubectl apply -f mysql-configmap.yaml
configmap/mysql-cm created
Kuberenets上にあるConfigMapはpod等と同様にkubectl getやdescribeで取得することが可能です。
$ kubectl get cm -o wide
NAME DATA AGE
kube-root-ca.crt 1 11m
mysql-cm 4 46s
wp-cm 4 75s
$ kubectl describe cm wp-cm
Name: wp-cm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
WORDPRESS_DB_HOST:
----
mysql-clusterip
WORDPRESS_DB_NAME:
----
gke-wordpress-database
WORDPRESS_DB_PASSWORD:
----
password
WORDPRESS_DB_USER:
----
devuser
BinaryData
====
Events: <none>
$ kubectl describe cm mysql-cm
Name: mysql-cm
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
MYSQL_DATABASE:
----
gke-wordpress-database
MYSQL_PASSWORD:
----
password
MYSQL_ROOT_PASSWORD:
----
password
MYSQL_USER:
----
devuser
BinaryData
====
Events: <none>
podやservice等をデプロイしていきます
$ kubectl apply -f wordpress-pod.yaml
Warning: Autopilot set default resource requests for Pod default/wordpress-pod, as resource requests were not specified. See http://g.co/gke/autopilot-defaults
pod/wordpress-pod created
$ kubectl apply -f mysql-pod.yaml
Warning: Autopilot set default resource requests for Pod default/mysql-pod, as resource requests were not specified. See http://g.co/gke/autopilot-defaults
pod/mysql-pod created
$ kubectl apply -f mysql-clusterip.yaml
service/mysql-clusterip created
$ kubectl apply -f wordpress-loadbalancer.yaml
service/wordpress-loadbalancer created
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/mysql-pod 1/1 Running 0 2m37s 10.112.0.130 gk3-my-pool-1-51c2fff1-cf9x <none> <none>
pod/wordpress-pod 1/1 Running 0 3m4s 10.112.0.131 gk3-my-pool-1-51c2fff1-cf9x <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.112.128.1 <none> 443/TCP 16m <none>
service/mysql-clusterip ClusterIP 10.112.128.189 <none> 3306/TCP 2m15s app=mysql
service/wordpress-loadbalancer LoadBalancer 10.112.129.17 34.72.240.175 60000:31724/TCP 2m1s app=wordpress
Webブラウザでもアクセス・操作出来ることも確認出来ました。
ConfigMapの別の取り込み方法
wordpress-pod.yaml及びmysql-pod.yamlについて、上記の記載方法だけではなく以下の様な記載の仕方でもOKです。
上記の方法はConfigMapを丸っと取り込む方法。以下はConfigMapの各環境変数を1つずつ取り込んでいるイメージです。必要でない環境変数がConfigMapにあったり、複数のConfigMapから環境変数を入れこむ場合はこちらを使用することになると思います。
apiVersion: v1
kind: Pod
metadata:
name: wordpress-pod
labels:
app: wordpress
spec:
containers:
- name: wordpress-con
image: wordpress:php8.1-apache
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
valueFrom:
configMapKeyRef:
name: wp-cm
key: WORDPRESS_DB_HOST
- name: WORDPRESS_DB_USER
valueFrom:
configMapKeyRef:
name: wp-cm
key: WORDPRESS_DB_USER
- name: WORDPRESS_DB_PASSWORD
valueFrom:
configMapKeyRef:
name: wp-cm
key: WORDPRESS_DB_PASSWORD
- name: WORDPRESS_DB_NAME
valueFrom:
configMapKeyRef:
name: wp-cm
key: WORDPRESS_DB_NAME
apiVersion: v1
kind: Pod
metadata:
name: mysql-pod
labels:
app: mysql
spec:
containers:
- name: mysql-con
image: mysql:8.0-debian
ports:
- containerPort: 3306
env:
- name: MYSQL_USER
valueFrom:
configMapKeyRef:
name: mysql-cm
key: MYSQL_USER
- name: MYSQL_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql-cm
key: MYSQL_PASSWORD
- name: MYSQL_ROOT_PASSWORD
valueFrom:
configMapKeyRef:
name: mysql-cm
key: MYSQL_ROOT_PASSWORD
- name: MYSQL_DATABASE
valueFrom:
configMapKeyRef:
name: mysql-cm
key: MYSQL_DATABASE