Kubernetes apiVersion: networking.k8s.io/v1 Проблема с «Проникновением»

#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.

Изменения включают:

  1. Серверное serviceName поле переименовано в service.name
  2. Числовые внутренние servicePort поля переименованы в service.port.number
  3. Строковые внутренние servicePort поля переименованы в service.port.name
  4. 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 -}}