Назад | Перейти на главную страницу

Kubernetes + kustomize: как использовать var в configMapGenerator?

В моем kustomization.yaml У меня есть:

configMapGenerator:
  - name: nginx-config
    files:
      - nginx.conf
vars:
  - name: PHP_FPM
    objref:
      kind: Service
      name: app-service
      apiVersion: v1
    fieldref:
      fieldpath: metadata.name

А потом в nginx.conf У меня есть:

    location = /index.php {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $(PHP_FPM):9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /app/index.php;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }

Когда я бегу kustomize var не заменяется:

❯ kustomize build kubernetes/overlays/staging | grep fastcgi_pass
2020/06/07 18:25:05 well-defined vars that were never replaced: PHP_FPM
            fastcgi_pass $(PHP_FPM):9000;

Как я могу ввести свое название службы в nginx.conf?

По тому, что Nginx не поддерживает переменные в файле конфигурации, файл должен быть скорректирован, прежде чем он будет применен к контейнеру Nginx.

Kustomize варс разрешено только в конкретные места и ConfigMap.data на данный момент не входит в их число.

Ошибка сообщает вам, что PHP_FPM переменная определяется в kustomization.yaml но никогда не использовался для замены. Link1 Link2

Тем не менее, проблему можно было решить, настроив nginx.conf контент с использованием Init Container а затем установите его на Main container.

Пример:

kustomization.yaml:

resources:
- cm-init-pod.yaml
- svc.yaml

patches:
- patch.yaml

configMapGenerator:
  - name: mymap
    files:
      - nginx.conf
vars:
  - name: PHP_FPM
    objref:
      kind: Service
      name: app-service
      apiVersion: v1
    fieldref:
      fieldpath: metadata.name

cm-init-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: cm-vol-pod 
  labels:
    app: nginx
spec:
  containers:
    - name: nginx 
      image: nginx

nginx.conf:

blalb-a
bla-bla
backend ##PHP_FPM##
bl-abla
bla-bla

svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

patch.yaml

apiVersion: v1
kind: Pod
metadata:
  name: cm-vol-pod 
spec:
  containers:
    - name: nginx 
      image: nginx
      command: [ "bash", "-c", "nginx -g \"daemon off;\""  ]
      volumeMounts:
      - name: ed
# this is not a real nginx.conf so I've put it next to the original one
        mountPath: /etc/nginx/nginx.conf1 
        subPath: nginx.conf
  initContainers:
    - name: init
      image: nginx
      command: [ "/bin/sh", "-c", "cp /mnt/cm/nginx.conf /mnt/ed/nginx.conf && sed -i 's/##PHP_FPM##/$(PHP_FPM)/' /mnt/ed/nginx.conf" ]
      volumeMounts:
      - name: cm
        mountPath: /mnt/cm
      - name: ed
        mountPath: /mnt/ed
  volumes:
    - name: cm
      configMap:
        name: mymap
    - name: ed
      emptyDir: {}

Полученные результаты:

$ kustomize build | kubectl apply -f -
# or kubectl apply -k ./

configmap/mymap-k2hbfmf776 created
service/app-service created
pod/cm-vol-pod created

$ kubectl exec -it cm-vol-pod -- bash

root@cm-vol-pod:/# cat /etc/nginx/nginx.conf1

blalb-a
bla-bla
backend app-service
bl-abla
bla-bla

Давайте все уберем

$ kustomize build | kubectl delete -f -

# or

$ kubectl delete -k ./

configmap "mymap-k2hbfmf776" deleted
service "app-service" deleted
pod "cm-vol-pod" deleted