это, вероятно, довольно просто, но я как бы потерялся здесь, поэтому любая помощь будет оценена.
Я выполнил инструкции по настройке частного реестра докеров здесь: 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
Обсуждалась аналогичная проблема Вот.