livenessProbe с секретом не работает в Куберне - PullRequest
1 голос
/ 05 февраля 2020

Я пытаюсь передать livenessProbe в свой файл yaml для развертывания kubernetes для проверки работоспособности моего приложения. Итак, я создал секрет со значением токена и передачей, как показано ниже

      livenessProbe:
        httpGet:
          path: test/actuator/health
          port: 9001
          httpHeaders:
          - name: Authorization
            valueFrom:
              secretKeyRef:
                name: actuator-token
                value: token

, но я получаю приведенную ниже ошибку

error: error validating "deployment.yaml": error validating data: [ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): unknown field "valueFrom" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].livenessProbe.httpGet.httpHeaders[0]): missing required field "value" in io.k8s.api.core.v1.HTTPHeader, ValidationError(Deployment.spec.template.spec.containers[0].readinessProbe.httpGet.httpHeaders): invalid type for io.k8s.api.core.v1.HTTPGetAction.httpHeaders: got "map", expected "array"]; if you choose to ignore these errors, turn validation off with --validate=false

Пожалуйста, предложите и оцените help.

Также дайте нам знать, что это лучший способ обработки токенов, поскольку я не хочу указывать значение токена непосредственно в моем файле развертывания yaml.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

httpHeaders поддерживает только value, а поле name не обрабатывает valueFrom

$ kubectl explain pod.spec.containers.livenessProbe.httpGet.httpHeaders

KIND:     Pod
VERSION:  v1

RESOURCE: httpHeaders <[]Object>

DESCRIPTION:
     Custom headers to set in the request. HTTP allows repeated headers.

     HTTPHeader describes a custom header to be used in HTTP probes

FIELDS:
   name <string> -required-
     The header field name

   value        <string> -required-
     The header field value

Вы можете попробовать использовать переменную env, например.

spec:
  containers:
  - name: mycontainer
    image: myimage
    env:
      - name: MY_SECRET
        valueFrom:
          secretKeyRef:
            name: actuator-token
            key: token
    livenessProbe:
        httpGet:
          path: test/actuator/health
          port: 9001
          httpHeaders:
          - name: Authorization
            value: $SECRET
0 голосов
/ 06 мая 2020

Не уверен, что ответ @DT сработает, документации для этой функции нет.

Также я провел несколько тестов, и приведенный ниже пример не работает для меня:

spec:
  containers:
  - name: mycontainer
    image: myimage
    env:
      - name: TOKEN
        value: '12345'
    livenessProbe:
      httpGet:
        path: /v1/health
        port: 80
        httpHeaders:
        - name: Authorization
          value: Apikey $TOKEN

I ' Я получаю 401 для моего приложения, потому что оно не может заменить переменную env значением заголовка. Я даже пробовал много других опций с одинарными / двойными кавычками, с квадратными скобками, но ни один из них не работал.

В противном случае вы можете использовать exec вместо httpGet, но для этого требуется, чтобы в вашем * была установлена ​​curl. 1024 * image.

spec:
  containers:
  - name: mycontainer
    image: myimage
    env:
      - name: TOKEN
        value: '12345'
    livenessProbe:
      exec:
        command:
        - bash
        - -c
        - 'curl --fail http://localhost/v1/health --header "Authorization: Apikey $TOKEN"'
    initialDelaySeconds: 30
    periodSeconds: 15

Если вы хотите использовать valueFrom из своего секрета, вам не нужно декодировать переменную внутри контейнера. Я буду уже декодирован.

Если вы не можете добавить пакет curl в ваше изображение, лучше подумайте о написании собственного скрипта на основе языка, разработанного вашим приложением. Вот пример для js: https://blog.sixeyed.com/docker-healthchecks-why-not-to-use-curl-or-iwr/

Также проверьте этот вопрос, есть аналогичный ответ Как использовать аутентификацию basi c в тесте живучести HTTP в Kubernetes

...