исключение при запуске как pnet основной работник docker контейнер пытается установить секрет из переменной env в Kubernetes - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь установить секреты в рабочем приложении pnet core (3.0 SDK), которое запускается в контейнере в Kubernetes. Я могу заставить приложение использовать секретные переменные среды, когда я запускаю его с помощью Visual Studio 2019 в локальном контейнере docker и в контейнере на локальном экземпляре kubernetes на Windows. Это контейнер Linux.

Однако при развертывании его в AKS при запуске приложение не запускается. Он вылетает с ошибкой:

Error response from daemon: OCI runtime create failed: container_linux.go:346: starting container process caused process_linux.go:449: container init caused setenv: invalid argument: unknown

Я уверен, что секреты раскрыты правильно, как показано ниже.

Я выполняю это, определяя свои секреты с помощью yaml похоже на это ниже. Развертывание осуществляется Azure Devops. Значения токена __ заменяются одной из задач конвейера. Я могу проверить значения на странице секретов экземпляров AKS на панели мониторинга и убедиться, что они были правильно развернуты.

apiVersion: v1
kind: Secret
metadata:
  name: paymentservicesettings
type: Opaque
data:
  dbconnectionstring: __dbconnectionstringbase64__
  storagebaseurl: __storagebaseurlbase64__
  storageconnectionstring: __storageconnectionstringbase64__
  baseuri: __baseuribase64__
  subscriptionkey: __subscriptionkeybase64__
  userid: __useridbase64__
  usersecret: __usersecretbase64__

, где valuesbase64 - строки в кодировке Base 64.

Я запускаю это с помощью команды kubectl apply -f appsettings.yml. Я вижу, что настройки определены правильно, когда я проверяю их через панель инструментов.

Затем я определяю развертывание следующим образом:

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  generation: 1
  labels:
    run: payment-service
  name: payment-service
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      run: payment-service
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        run: payment-service
    spec:
      containers:
      - image: org.azurecr.io/payment-service:__tagBuildId__    // **this tag is auto replaced for every deployment** 
        imagePullPolicy: IfNotPresent
        name: payment-service
        env:
        - name: "ASPNETCORE_ENVIRONMENT"
          value: "Kubernetes"
        - name: "dbconnectionstring"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: dbconnectionstring

        - name: "storagebaseurl"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: storagebaseurl

        - name: "storageconnectionstring"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: storageconnectionstring

        - name: "baseuri"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: baseuri

        - name: "subscriptionkey"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: subscriptionkey

        - name: "userid"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: userid

        - name: "usersecret"
          valueFrom:
            secretKeyRef:
              name: paymentservicesettings
              key: usersecret

      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      imagePullSecrets:
      - name: acr-auth

При первом развертывании службы, она тянет правильно, а затем пытается запустить. К сожалению, тогда кажется, что он не может найти переменные env и вылетает. Поскольку pods cra sh, я не могу отладить, чтобы выяснить, почему они это делают.

Я смотрел на попытку отладки через Azure Dev Devs, но похоже, что это в настоящее время не поддерживается для рабочих служб.

Я пытался убедиться, что у меня есть как можно больше кода обработки исключений на стороне C#, чтобы предотвратить сбои при запуске, но это не имеет никакого значения

Кто-нибудь может подсказать, почему блоки ломаются и что я могу с этим поделать?

спасибо

1 Ответ

1 голос
/ 21 января 2020

Спасибо за вашу помощь всем.

Оказывается, это была проблема с секретным преобразованием в base64.

Я использовал для этого скрипт, который выглядел так:

$value = "https://www.google.com"
$bytes = [System.Text.Encoding]::Unicode.GetBytes($value);
$base64Value = [System.Convert]::ToBase64String($bytes);
echo $base64Value;

Похоже, что если кодировка не указана, PowerShell по умолчанию кодирует значения с использованием кодировки UTF-16.

Когда я исправляю сценарий, чтобы применить принудительное кодирование UTF-8:

   $value = "https://www.google.com"   
   **$enc = [System.Text.Encoding]::UTF8**
   $bytes = $enc.GetBytes($value)
   $base64Value = [System.Convert]::ToBase64String($bytes);
   echo $base64Value;

работает как положено.

Я написал подробности об этом здесь:

https://www.spacelinx.com/2020/01/21/startup-exception-for-aspnet-core-worker-docker-container-attempting-to-set-secret-from-env-variable-in-kubernetes/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...