Kubernetes apiVersion:networking.k8s.io/v1 'Ingress'问题



在执行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 issue https://github.com/kubernetes/kubernetes/issues/90077提到

networking.k8s.io/v1beta1 == 1.14 to 1.18
networking.k8s.io/v1 = 1.19+

所以我猜它应该工作对吧?

我已将API Version更改为

apiVersion: extensions/v1beta1 or
apiVersion: networking.k8s.io/v1beta1

但在YAML

的另一部分失败
backend:
service:
name: {{ template "fullname" $ }}-srv
port:
number: 80

和错误

验证数据错误:ValidationError(Ingress.spec.rules[0].http.paths[0].backend):未知字段"service"在io.k8s.api.extensions.v1beta1.IngressBackend

我被告知相同的YAML在macOS上使用相同的kubectl版本(我没有访问权限来验证)。你知道我哪里做错了吗?

谢谢,Prabal

我想补充一下,根据K8弃用指南,Ingressnetworking.k8s.io/v1beta1API版本不再作为v1.22使用。

变更包括:

  1. 后端serviceName字段重命名为service.name
  2. 数字后端servicePort字段重命名为service.port.number
  3. 字符串后端servicePort字段重命名为service.port.name
  4. pathType现在需要为每个指定的路径。选项有Prefix, Exact和implemationspecific。

意思是我们需要做以下改变:

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

您可以使用以下命令来检查networking.k8s.io/v1版本的Ingress类型在您的集群中是否可用。

kubectl api-resources #List the API resources that are available.
kubectl api-versions  #List the API versions that are available.

对于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

您可以运行helm create mychart并比较您的图表与生成的图表之间的差异。

(这是一个快速的解决方案,但是,最好的方法是阅读文档)

你应该在你的入口尝试一些东西。基于环境值的Yaml ->珠江三角洲,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 -}}

最新更新