0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Kubernetesで起動するnginxにconfigを頑張って注入する

Posted at

nginxの公式Dockerコンテナイメージ、他のイメージよろしく/docker-entrypoint.d/になんかしらshell scriptなどを置くと実行する機能があります。

でも現状の実装ではファイル実体でなくsymlinkを置かれたときに無視1されます。今使ってるKubernetes実装k0sはConfigMapをvolume mountするとsymlinkを置くので読んでもらえない。

なので本家にPRを投げたんだけど、それはそれとして現状でどうすればいいかやってみた。

したかったこと

単純にConfigMapを/etc/nginx/conf.d/にmountするとdefault.confがなくなって動かなくなる2ので、/etc/nginx/conf.d/ の中身を保持したまま設定ファイルを追加したい3

どうしたか

  • /etc/nginx/conf.d/の中身を保存するemptyDirボリュームを作る
  • initコンテナ/etc/nginx/conf.d/の中身を組み立てる。
    • nginxコンテナを起動して/etc/nginx/conf.d/をemptyDirボリュームにコピる
    • Volume mountしたConfigMapの中身をemptyDirボリュームにコピるbusyboxコンテナを起動
  • 前段で作ったemptyDirボリュームを/etc/nginx/conf.d/にマウントしてnginxを起動する。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.23.3
        name: nginx
        ports:
        - containerPort: 80
          name: http
        volumeMounts:
        - name: contents
          mountPath: /usr/share/nginx/html
          readOnly: true
        - name: confd
          mountPath: /etc/nginx/conf.d
      initContainers:
      - name: copy configmap
        image: busybox:1.34.1
        command:
        - cp
        - -r # copy directories recursively
        - -L # always follow symbolic links in SOURCE
        - -T # treat DEST as a normal file
        - /config/
        - /confd/
        volumeMounts:
        - name: config
          mountPath: /config
        - name: confd
          mountPath: /confd
      - name: copy nginx conf
        image: nginx:1.23.3
        command:
        - cp
        - -r # copy directories recursively
        - -L # always follow symbolic links in SOURCE
        - -T # treat DEST as a normal file
        - /etc/nginx/conf.d/
        - /confd/
        volumeMounts:
        - name: confd
          mountPath: /confd
      volumes:
      - name: confd
        emptyDir: {}
      - name: contents
        persistentVolumeClaim:
          claimName: nginx-contents-pvc
      - name: config
        configMap:
          name: nginx-config

注意点

initコンテナでcpするとき、-Tをつけないと期待しないディレクトリが生成されてはまった4

  1. find-followがついていないことによる。

  2. default.confは80/tcpでlistenして/usr/share/nginx/htmlの中身を返す単純なhttp serverの単純な設定が入っているだけなので、その設定も含めて書くなら上書きしてもいい。

  3. /docker-entrypoint.d/にshell script置いたConfigMapを0744でmountして実行してくれるなら、それでなんとかできる。

  4. cp でコピー先ディレクトリのあり/なし - Qiita

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?