用ConfigMap在Kubernetes中描述运行软件的配置

总结/概述

可以通过Kubernetes的ConfigMap来编写和作为卷挂载nginx.conf等配置文件。
文档在这附近。

    • Configure a Pod to Use a ConfigMap | Kubernetes

 

    Volumes | Kubernetes

实际的YAML文件在Gist上。

什么是问题。

在Kubernetes中运行的Docker容器中,如何插入每个应用程序使用的配置文件,这是一个问题。
例如,如何管理nginx.conf等配置文件。
有几种方法。

    • Dockerイメージの中に入れておく

ADDした状態でdocker buildしておく

ファイルにしておいてコンテナにVolumeとしてマウントする

デプロイするホストのディレクトリをマウントする
永続ディスクを作成してそこに配置しておいてマウントする

どこかのストレージに置いておいてダウンロードする

周围感觉很普遍(需要出处)。

然而,每个选项都有它自己的困难之处。

    • Dockerイメージの中に入れておく

例えばNginxの公式イメージをそのまま使えない

docker build, docker pushして使う必要があって面倒

ファイルにしておいてコンテナにVolumeとしてマウントする

ファイルを置くNodeの状態を管理しないといけない
設定を変更するたびにストレージを変更するのは面倒

どこかのストレージに置いておいてダウンロードする

権限とか考えないといけなくて面倒

不论选择哪个,都会有优劣之分的感觉。

在这种情况下,ConfigMap

在Kubernetes中,存在一个称为ConfigMap的东西,简单来说就是可以存储键值对的东西。
它类似于环境变量,但也可以拥有像上面所写的配置文件。
更重要的是,ConfigMap可以作为卷进行挂载。
文件

使用ConfigMap定义设置文件。

YAML中可以定义包含换行的字符串。
有关YAML的基础知识-任务注释

使用管道符(|),即使包含换行符,也可以将其作为一个标量值来处理。就像这样。

message: |
  hello
  world

虽然有一些像+或-之类的小差异,但大体上应该没有问题。

尝试使用ConfigMap定义/etc/nginx/nginx.conf和/etc/nginx/virtualhost/virtualhost.conf。在data部分下分别以nginx.conf和virtualhost.conf作为内容进行描述。

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-conf
data:
  nginx.conf: |
    user nginx;
    worker_processes  3;
    error_log  /var/log/nginx/error.log;
    events {
      worker_connections  10240;
    }
    http {
      log_format  main
              'remote_addr:$remote_addr\t'
              'time_local:$time_local\t'
              'method:$request_method\t'
              'uri:$request_uri\t'
              'host:$host\t'
              'status:$status\t'
              'bytes_sent:$body_bytes_sent\t'
              'referer:$http_referer\t'
              'useragent:$http_user_agent\t'
              'forwardedfor:$http_x_forwarded_for\t'
              'request_time:$request_time';

      access_log    /var/log/nginx/access.log main;

      server {
          listen       80;
          server_name  _;

          location / {
              root   html;
              index  index.html index.htm;
          }
      }
      include /etc/nginx/virtualhost/virtualhost.conf;
    }
  virtualhost.conf: |
    upstream app {
      server localhost:8080; # localhost:8080で受け付けるWebアプリがあるとして
      keepalive 1024;
    }

    server {
      listen 80 default_server;
      server_name _;
      root /usr/local/app;

      access_log /var/log/nginx/app.access_log main;
      error_log /var/log/nginx/app.error_log;

      location / {
        proxy_pass http://app/;
        proxy_http_version 1.1;
      }
    }

试着将按照这种方式定义的ConfigMap应用到官方的nginx镜像中。

---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /etc/nginx # /etc/nginxにvolumesのnginx-confをmountする
          readOnly: true
          name: nginx-conf
        - mountPath: /var/log/nginx
          name: log
      volumes:
      - name: nginx-conf # volumeMountsで/etc/nginxにmountするやつ
        configMap: 
          name: nginx-conf # ConfigMapのnginx-confを/etc/nginx以下に配置する
          items:
            - key: nginx.conf # nginx-confのkey
              path: nginx.conf # nginx.confというファイル名
            - key: virtualhost.conf
              path: virtualhost/virtualhost.conf # ディレクトリを掘ることも可能
      - name: log
        emptyDir: {}

---
apiVersion: v1 
kind: Service # nginxにアクセスする用のservice
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

部署,验证操作

尝试在Kubernetes上部署,并确认ConfigMap作为文件是否存在。

$ kubectl create namespace nginx-sample
namespace "nginx-sample" created

$ kubectl --namespace=nginx-sample apply -f ./nginx-sample.yaml
configmap "nginx-conf" created
deployment "nginx" created
service "nginx" created

$ kubectl --namespace=nginx-sample get po
NAME                    READY     STATUS    RESTARTS   AGE
nginx-d78988cbc-js2fx   1/1       Running   0          10s

由于到目前为止已经成功启动,因此当使用 kubectl exec 查看文件时,可以确认它们被正确地部署了。

$ kubectl exec  --namespace=nginx-sample -it nginx-d78988cbc-js2fx -c nginx -- ls -lhR /etc/nginx/
/etc/nginx/:
total 4.0K
lrwxrwxrwx 1 root root   17 Mar 11 01:38 nginx.conf -> ..data/nginx.conf
drwxr-xr-x 2 root root 4.0K Mar 11 01:38 virtualhost

/etc/nginx/virtualhost:
total 0
lrwxrwxrwx 1 root root 38 Mar 11 01:38 virtualhost.conf -> ../..data/virtualhost/virtualhost.conf

尝试确认nginx.conf的设置是否正确应用。

$ curl $(minikube service --namespace=nginx-sample nginx --url) -I # localhost:8080で動くサービスがないのでエラーになるけど気にしない
HTTP/1.1 502 Bad Gateway
Server: nginx/1.13.9
Date: Sun, 18 Mar 2018 08:07:08 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive

$ kubectl exec --namespace=nginx-sample -it nginx-d78988cbc-js2fx -- cat /var/log/nginx/app.access_log  # logの中見を見る
remote_addr:172.17.0.1  time_local:18/Mar/2018:08:07:08 +0000   method:HEAD     uri:/   host:192.168.99.100     status:502      bytes_sent:0    referer:-       useragent:curl/7.54.0     forwardedfor:-  request_time:0.000

我确认了日志的格式与我指定的log_format相同。

广告
将在 10 秒后关闭
bannerAds