#kubernetes #kubernetes-ingress
#kubernetes #kubernetes- вход
Вопрос:
Требуется ваше руководство по проблеме при выполнении файла Kubernetes YAML. Моя версия kubectl выглядит следующим образом:
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.0", GitCommit:"af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38", GitTreeState:"clean", BuildDate:"2020-12-08T17:59:43Z", GoVersion:"go1.15.5", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.14", GitCommit:"89182bdd065fbcaffefec691908a739d161efc03", GitTreeState:"clean", BuildDate:"2020-12-18T12:02:35Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
Это последняя версия, загруженная с сайта Kubernetes
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows
YAML имеет apiVersion: networking.k8s.io/v1 вид: Вход и ошибка при запуске YAML
no matches for kind "Ingress" in version "networking.k8s.io/v1"
Проблема с Kubernetes https://github.com/kubernetes/kubernetes/issues/90077 упоминает , что
networking.k8s.io/v1beta1 == 1.14 to 1.18
networking.k8s.io/v1 = 1.19
Так что, я думаю, это должно работать правильно?
Я изменил версию API на
apiVersion: extensions/v1beta1 or
apiVersion: networking.k8s.io/v1beta1
но сбой в другом разделе YAML
backend:
service:
name: {{ template "fullname" $ }}-srv
port:
number: 80
с ошибкой
ошибка проверки данных: ошибка проверки (Ingress.spec.rules[0].http.paths[0].серверная часть): неизвестное поле «service» в io.k8s.api.extensions.v1beta1.IngressBackend
Мне сообщили, что тот же YAML работает на macOS с той же версией kubectl (у меня нет доступа, чтобы проверить это). Но есть какие-нибудь мысли о том, где я могу ошибаться?
Спасибо, Прабал
Ответ №1:
Я хотел бы добавить, что, согласно руководству по устареванию K8, версии networking.k8s.io/v1beta1
API Ingress
is больше не обслуживаются с версии v1.22.
Изменения включают:
- Серверное
serviceName
поле переименовано вservice.name
- Числовые внутренние
servicePort
поля переименованы вservice.port.number
- Строковые внутренние
servicePort
поля переименованы вservice.port.name
pathType
теперь требуется для каждого указанного пути. Параметры являются префиксными, точными и специфичными для реализации.
Это означает, что нам нужно внести следующие изменения, чтобы перейти от этого:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: stackoverflw
namespace: stacker
spec:
rules:
- host: example.com
http:
paths:
- backend:
serviceName: stacker
servicePort: 80
К этому (пример):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: stackoverflw
namespace: stacker
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: stacker
port:
number: 80
Ответ №2:
Для networking.k8s.io/v1beta1
этого должно быть
backend:
serviceName: {{ template "fullname" $ }}-srv
servicePort: 80
Как получить документацию:
kubectl explain --api-version=networking.k8s.io/v1beta1 ingress.spec.rules.http.paths.backend
Комментарии:
1. Это помогает мне решить мою проблему. Спасибо, @zerms.
2. Я действительно не понимаю, как помогает использование устаревшей версии, проблема здесь в том, что версия без бета-версии не работает, даже если вы используете версию K8s 1.19
3. @123123d операционная система использует 1.18
Ответ №3:
Вы можете использовать приведенные ниже команды, чтобы проверить, доступен ли вид Ingress
в версии networking.k8s.io/v1
или нет в вашем кластере.
kubectl api-resources #List the API resources that are available.
kubectl api-versions #List the API versions that are available.
Ответ №4:
Вы можете запустить helm create mychart
и сравнить различия между вашей диаграммой и сгенерированной диаграммой.
(Это быстрое решение, однако лучший способ сделать это — прочитать документацию)
Ответ №5:
вы должны попробовать что-то в своем ingress.yaml на основе значения env либо -> prd, stg и т. Д
{{- if eq .Values.app.env "prd" }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: {{ .Values.health_check.httpGet.path }}
name: {{ .Values.app.env }}-{{ .Values.global.project }}-{{ .Values.app.component }}-{{ .Values.app.type }}-health
namespace: {{ .Values.namespace }}
spec:
ingressClassName: {{ (pluck .Values.app.env .Values.ingress.class | first) }}
rules:
- host: {{ .Values.ingress.internal.host }}
http:
paths:
- path: {{ .Values.ingress.internal.path }}
pathType: ImplementationSpecific
backend:
service:
name: {{ $.Values.app.env }}-{{ $.Values.global.project }}-{{ $.Values.app.component }}-{{ $.Values.app.type }}
port:
number: {{ $.Values.service.externalPort }}
{{- end }}
{{ end -}}