---
apiVersion: v1
kind: ConfigMap
metadata:
  name: q18
  labels:
    question.kontest.amsy.dev: "18"
data:
  question: |-
    Nginxの設定ファイルをConfigMapとして定義してnginxコンテナにマウントしています。
    このConfigMapは任意のタイミングで更新されます。
    更新されたConfigMapの内容をnginxプロセスに反映するために、
    nginx-controllerコンテナから定期的にnginx -s reload コマンドを使って
    nginxプロセスに対してOSシグナルを送信して設定ファイルの再読込を行います。
    この方式を実現するためにはnginx-controllerコンテナからnginxコンテナのプロセス(PID)が見えている必要があります。
    nginx-controllerコンテナからnginxコンテナで動作しているnginxプロセスが見えるようにマニフェストを変更してください。
    
    参考) nginxに読み込ませるConfigMap、問題分の通り任意のタイミングで内容が更新されます。
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: nginx-config
    data:
      default.conf: |-
        server {
          listen       80;
          listen  [::]:80;
          server_name  localhost;
      
      
          location / {
              root   /usr/share/nginx/html;
              index  index.html index.htm;
          }
        
          error_page   500 502 503 504  /50x.html;
          location = /50x.html {
              root   /usr/share/nginx/html;
          }
        }
  hint: |-
    https://kubernetes.io/ja/docs/tasks/configure-pod-container/share-process-namespace/
  base_content.yaml: |-
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.19
          volumeMounts:
            - name: pid-share
              mountPath: /var/run
            - name: nginx-config
              mountPath: /etc/nginx/conf.d
        - name: nginx-controller
          image: nginx:1.19
          volumeMounts:
            - name: pid-share
              mountPath: /var/run
              readOnly: true
          command: 
            - "/bin/bash"
            - "-c"
            - "while :; do sleep 3600; nginx -s reload; done"
      volumes:
        - name: pid-share
          emptyDir: {}
        - name: nginx-config
          configMap:
            name: nginx-config
  answer.yaml: |-
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
      shareProcessNamespace: true
      containers:
        - name: nginx
          image: nginx:1.19
          volumeMounts:
            - name: pid-share
              mountPath: /var/run
            - name: nginx-config
              mountPath: /etc/nginx/conf.d
        - name: nginx-controller
          image: nginx:1.19
          volumeMounts:
            - name: pid-share
              mountPath: /var/run
              readOnly: true
          command: 
            - "/bin/bash"
            - "-c"
            - "while :; do sleep 3600; nginx -s reload; done"
      volumes:
        - name: pid-share
          emptyDir: {}
        - name: nginx-config
          configMap:
            name: nginx-config
  comment: |-
    【解説 by カサレアル】
    名前空間の理解は、Kubernetesに限らずコンテナに関わる領域では非常に重要です。そもそもコンテナはプロセス名前空間で実現されています。異なるプロセス名前空間同士では、プロセスID（PID）は共有されません。
    spec.shareProcessNamespace を true に指定すると、Pod内のコンテナ間でプロセス名前空間が共有されます。これにより、他のコンテナで動いているプロセスのPIDを取得できるようになります。
    ただし、コンテナのプロセスがPID 1で実行されなくなることには注意してください。イメージによってはPID 1以外を拒否するものがあったり、PID 1が前提になっっているものがあります。
  author: |-
    Ryoma Fujiwara (@RYoMa_0923)
