Привет, %username%
! Очередная рубрика факапов и человеческого фактора.
Попался мне в руки кластер k8s и надо там много чего переделать. Работаю с Helm’ом и решил попробовать werf.
При генерации шаблона чарта с помощью
werf helm create mychartname
Создается примерно вот такая структура
├── Chart.yaml
├── charts
├── operator.yaml
├── templates
│ ├── NOTES.txt
│ ├── _helpers.tpl
│ ├── deployment.yaml
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── service.yaml
│ ├── serviceaccount.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
Где в файлике templates/ingress.yaml
появляется вот такая вот структура (вырезка):
{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
При попытке проверить встроенным в helm литером, возникает вот такой варнинг:
[WARNING] templates/ingress.yaml: networking.k8s.io/v1beta1 Ingress is deprecated in v1.19+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
Ну я возьми и поправь это на apiVersion: networking.k8s.io/v1
.
При попытке установить чарт с помощью Helm’а или с помощью werf’а будет вылетать вот такая ошибка:
Error: UPGRADE FAILED: error validating "": error validating data: [ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "serviceName" in io.k8s.api.networking.v1.IngressBackend, ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "servicePort" in io.k8s.api.networking.v1.IngressBackend]
Быстрый гуглеж приводит тебя к тому, что ты решаешь поправить вот это:
{{- range .paths }}
- path: {{ .path }}
backend:
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
На вот это:
{{- range .paths }}
- path: {{ .path }}
backend:
service:
name: {{ $fullName }}
port: {{ $svcPort }}
{{- end }}
И как результат у тебя нихера не работает! А работать начинает только тогда, когда ты вернёшь всё в зад – пофиксишь обратно apiVersion
и пофиксишь обратно описание backend’а.
Причина по которой не работали внесенные мною изменения довольно простая: надо читать документацию. Поясню: в новой спецификации для apiVersion: networking.k8s.io/v1
в разделе backend
необходимо указывать немного по другому информацию о порте – примерно вот так:
{{- range .paths }}
- path: {{ .path }}
backend:
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
name: {{ $svcName }}
{{- end }}
Т.е. раньше в поле port
согласно новой спецификации передается объект, а не число как раньше и у этого объекта имеются поля (выдержка из документации):
name <string>
– Name is the name of the port on the Service. This is a mutually exclusive setting with “Number”;number <integer>
– Number is the numerical port number (e.g. 80) on the Service. This is a mutually exclusive setting with “Name”;
Итого получаем тот факт, что у меня ушло дохрена времени на то, что можно было бы решить простейшим чтением документации и спецификации ingress’a.
За сим откланяюсь! Не совершай моих ошибок!
Если у тебя есть вопросы, комментарии и/или замечания – заходи в чат, а так же подписывайся на канал.