ConfigMap は Pod の外から設定データ(環境変数やファイル)を注入するための仕組み。設定を Pod と分離して管理できることに価値がある。
ConfigMap はキーとバリューで構成されていて、複数の方法で作成できる。また、複数の方法で Pod に設定データを注入できる。
Configure a Pod to Use a ConfigMap
今回は ConfigMap を利用して nginx の設定をカスタマイズしてみる。nginx のコンテナイメージは、/etc/nginx/conf.d/
配下のファイルを読み込む作りになっているので、ここにファイルを作成する。
なお、検証環境は次のとおり。
$ kubectl version Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.2", GitCommit:"59603c6e503c87169aea6106f57b9f242f64df89", GitTreeState:"clean", BuildDate:"2020-01-18T23:30:10Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"} Server Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:07:13Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"}
まず ConfigMap を作成する。キーをファイル名、値をファイルの中身にする。
nginx-conf.yaml
apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: |- server { listen 80; server_tokens on; location / { root /usr/share/nginx/html; index index.html index.htm; } }
ConfigMap を作成する。
$ kubectl create -f nginx-conf.yaml configmap/nginx-config created $ kubectl get configmaps NAME DATA AGE nginx-config 1 8s
Pod の設定(nginx.yaml)。ConfigMap をファイルにするために volumes
に configMap を指定する。
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: conf mountPath: /etc/nginx/conf.d/ volumes: - name: conf configMap: name: nginx-config
次に Pod を生成する。ファイルが生成されているのを確認する。
$ kubectl create -f nginx.yaml pod/nginx created $ kubectl exec -it nginx -- cat /etc/nginx/conf.d/nginx.conf server { listen 80; server_tokens on; location / { root /usr/share/nginx/html; index index.html index.htm; }
アクセスしてみると、設定が効いている(server_token on
によってレスポンスヘッダーに nginx のバージョンが含まれる)ことがわかる。
$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 6s 192.168.130.51 ip-172-30-0-112 <none> <none> $ curl -v 192.168.130.51:80 * Rebuilt URL to: 192.168.130.51:80/ * Trying 192.168.130.51... * TCP_NODELAY set * Connected to 192.168.130.51 (192.168.130.51) port 80 (#0) > GET / HTTP/1.1 > Host: 192.168.130.51 > User-Agent: curl/7.52.1 > Accept: */* > < HTTP/1.1 200 OK < Server: nginx/1.17.8
上記例ではキーとバリューの関係がわかりやすいように yaml に設定をべた書きした。しかし自分の感覚では yaml ファイルに設定をベタ書きするのは正気の沙汰ではない。やっぱり nginx の設定だけを分離したい。
nginx.conf
server { listen 80; server_tokens on; location / { root /usr/share/nginx/html; index index.html index.htm; } }
--from-file
を利用すると、ファイルから ConfigMap を生成できる。(--from-file
は複数も指定できる。)
$ kubectl create configmap nginx-config --from-file=nginx.conf configmap/nginx-config created $ kubectl describe configmaps nginx-config Name: nginx-config Namespace: default Labels: <none> Annotations: <none> Data ==== nginx.conf: ---- server { listen 80; server_tokens on; location / { root /usr/share/nginx/html; index index.html index.htm; } } Events: <none>