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

Использование частного реестра Docker с Helm в ошибке Kubernetes

это, вероятно, довольно просто, но я как бы потерялся здесь, поэтому любая помощь будет оценена.

Я выполнил инструкции по настройке частного реестра докеров здесь: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

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

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: esrhost/node-hello
  imagePullSecrets:
  - name: regcred

Теперь, когда я пытаюсь воспроизвести это в диаграмме Helm, я получаю следующую ошибку:

me@me:~/projects/helm-test/init-test$ helm install --name node-hello . --set service.type=NodePort
Error: release node-hello failed: Deployment in version "v1beta2" cannot be handled as a Deployment: v1beta2.Deployment: Spec: v1beta2.DeploymentSpec: Template: v1.PodTemplateSpec: Spec: v1.PodSpec: ImagePullSecrets: []v1.LocalObjectReference: readObjectStart: expect { or n, parsing 696 ...ecrets":["... at {"apiVersion":"apps/v1beta2","kind":"Deployment","metadata":{"labels":{"app":"init-test","chart":"init-test-0.1.0","heritage":"Tiller","release":"node-hello"},"name":"node-hello-init-test","namespace":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"init-test","release":"node-hello"}},"template":{"metadata":{"labels":{"app":"init-test","release":"node-hello"}},"spec":{"containers":[{"image":"esrhost/node-hello:stable","imagePullPolicy":null,"livenessProbe":{"httpGet":{"path":"/","port":"http"}},"name":"init-test","ports":[{"containerPort":8080,"name":"http","protocol":"TCP"}],"readinessProbe":{"httpGet":{"path":"/","port":"http"}},"resources":null}],"imagePullSecrets":["regcred {}"]}}}}

Проблема определенно связана с imagePullSecrets.

Мой values.yaml следующий:

 replicaCount: 1

 image:
   repository: esrhost/node-hello
   tag: stable
   pullpolicy: ifnotpresent
   # .Values.image.repoSecret
   repoSecret: regcred

 service:
   type: ClusterIP
   port: 8080

 ingress:
   enabled: false
   annotations: {}
     # kubernetes.io/ingress.class: nginx
     # kubernetes.io/tls-acme: "true"
   path: /
   hosts:
     - chart-example.local
   tls: []
   #  - secretName: chart-example-tls
   #    hosts:
   #      - chart-example.local

 resources: {}

 nodeSelector: {}

 tolerations: []

 affinity: {}

По сути, единственное, что у меня есть не по умолчанию, - это мой репозиторий и переменная repoSecret, которую я использую в следующем файле шаблона deployment.yaml:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: {{ template "init-test.fullname" . }}
  labels:
    app: {{ template "init-test.name" . }}
    chart: {{ template "init-test.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: {{ template "init-test.name" . }}
      release: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ template "init-test.name" . }}
        release: {{ .Release.Name }}
    spec:
      containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 8080
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
      imagePullSecrets:
        - {{ .Values.image.repoSecret }}
{{ toYaml .Values.resources | indent 12 }}
    {{- with .Values.nodeSelector }}
      nodeSelector:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.affinity }}
      affinity:
{{ toYaml . | indent 8 }}
    {{- end }}
    {{- with .Values.tolerations }}
      tolerations:
{{ toYaml . | indent 8 }}
    {{- end }}

Как видите, я добавил spec-> template-> spec-> imagePullSecrets и присвоил переменную .Values.image.repoSecret.

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

TL; DR - Добавлен реестр докеров в K8s - работает с kubectl. То же самое добавлено в диаграмму Helm nginx по умолчанию - не работает. Сбивать с толку.

Я предполагаю, что вы используете кластер Kubernetes версии 1.9. * Или даже выше.

Поэтому вам нужно отредактировать свой deployment.yaml файл и заменить apiVersion: apps/v1beta2 с участием apiVersion: apps/v1, как старый apiVersion устарел, начиная с Kubernetes v1.9.0 в соответствии с версиями Журнал изменений.

Вы можете проверить поддерживаемые api-versions в вашем кластере Kubernetes, используя следующую команду:

kubectl api-versions

Обсуждалась аналогичная проблема Вот.