6.k8s-service
一、定義
Service的概念
kubernetes service定義了這樣一種抽象: 一個pod的邏輯分組, 一種可以訪問它們的策略--通常稱為微服務。 這一組pod能夠被service訪問到, 通常是通過Label Selector
Service 能夠提供負載均衡的能力, 但是在使用上有以下限制:
- 只提供4層負載均衡能力, 而沒有7層功能呢, 但有時我們可能需要更多的匹配規則來轉發請求, 這點上4層負載均衡是不支援的
二、代理模式分類
Service的型別
service在k8s中有以下四種類型
-
Clusterlp:預設型別, 自動分配一個僅Cluster內部訪問的虛擬Ip
-
NodePort: 在ClusterIP基礎上為Service在每臺機器上繫結一個埠, 這樣就可以通過
:NodePort來訪問該服務 -
LoadBalancer: 在NodePort的基礎上, 藉助cloud provider建立一個外部負載均衡, 並將請求轉發到
:NodePort (這裡需要引入雲供應商的負載均衡) -
ExternalName: 把叢集外部的服務引入到叢集內部來, 在叢集內部直接使用。 沒有任何型別代理被建立,這隻有kubernetes1.7或更高版本的kube-dns才支援
流程: client訪問到節點是通過iptables 轉發的,iptables 規則是通過kube-proxy寫入的 ,apiserver通過監控kube-proxy進行服務和端點資訊的發現 ,kube-proxy會通過標籤去判斷端點是否寫入到svc的端點中去 ,
VIP和Service代理
在kubernetes叢集中, 每個Node執行一個kube-proxy程序。kube-proxy負責為service實現了一種VIP(虛擬IP)的形式,而不是externalName的形式。 在kubernetesv1.0版本, 代理完全在userpace。 在kubernetes1.1版本中 , 新增了iptales代理, 但並部署預設的執行模式。 從kubernetesv1.2 起, 預設就是iptalbes代理, 在kubernetesv1.8.0-beta.0中, 添加了ipvs代理
在kubernetes1.14版本開始預設使用ipvs代理
在kubernetesv1.4版本開始預設使用ipvs代理
在kubernetesv1.9 版本, service是4層(tcp/udp over ip)的概念。 在kubernetesv1.1版本中, 新增了Ingress API(beta版), 用來表示7層(http)服務
!為何不使用round-robin DNS? 因為在客戶端進行快取,並沒有清楚快取
代理模式的分類
-
userspace代理模式
-
iptables代理模式
-
ipvs代理模式
這種模式, kube-proxy會監控kubernetes Service物件和endpoints, 呼叫netlink介面以相應地建立ipvs規則並定期kubernetes service物件和endpoints物件同步ipvs規則, 以確保ipvs狀態與期望一致 。 訪問服務時 , 流量將被重定向到其中一個後端Pod
與iptables類似, ipvs與netfilter的hook功能, 但使用雜湊表作為底層資料結構並在核心空間中工作。 這意味著ipvs可以更快地重定向流量, 並且在同步代理規則時具有更好的效能。 此外, ipvs為負載均衡演算法提供了更多選項, 例如:
-
rr: 輪訓排程
-
lc:最小連線數
-
dh:目標雜湊
-
sh:源雜湊
-
sed:最短期望延遲
-
nq:不排隊排程
-
ClusterIP
clusterIP主要在每個node節點使用iptables, 將發向clusterIP對應埠的資料, 轉發到kube-proxy中, 然後kube-proxy自己內部實現有負載均衡的方法,並可以查詢到這個service下對應pod的地址和埠, 進而把資料轉發給對應的pod的地址和埠
為了實現圖上的功能, 主要需要以下幾個元件的協同工作:
- apiserver使用者通過kubectl命令向ipaserver傳送建立service的命令, ipaserver接收到請求後將資料儲存到etcd中
- Kube-proxy kubernetes的每個節點中都有一個叫做kube-proxy的程序, 這個程序負責感知service, pod變化, 並將變化的資訊寫入本地的iptables規則中
- iptables使用NAT等技術將virtuallP的流量轉發值endpoint中
建立myapp-deployment.yaml檔案
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: myapp
release: stabel
template:
metadata:
labels:
app: myapp
release: stabel
env: test
spec:
containers:
- name: myapp
image: hub.syuee.com/library/syuee-nginx:v2
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
readinessProbe:
httpGet:
port: 80
path: /api/server
initialDelaySeconds: 1
periodSeconds: 2
livenessProbe:
httpGet:
port: 80
path: /
initialDelaySeconds: 1
periodSeconds: 3
timeoutSeconds: 4
initContainers:
- name: init-myapp
image: busybox
command: ['sh','-c','until nslookup syuee-web-svc; do echo waiting for syuee-web-svc; sleep 2; done;']
建立Service資訊vim myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
Headless Service
有時不需要或不想要負載均衡, 以及單獨的Service IP。 遇到這種情況, 可以通過指定Cluster IP(spec.clusterIP)的值“Node”來建立Headless Service。 這類Service 並不會分配Cluster IP, kube-proxy不會處理它們, 而且平臺也不會為它們進行負載均衡和路由
Vim myapp-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-headless
namespace: default
spec:
selector:
app: myapp
clusterIP: "None"
ports:
- port: 80
targetPort: 80
檢視coreDNS的IP地址
kubectl get pod -n kube-system -o wide
需要安裝dig命令: yum install bind-utils
dig -t A myapp-headless.default.svc.cluster.local. @10.244.4.4
Node Port
nodePort的原理在於node上開了一個埠, 將向該埠的流量匯入到kube-proxy, 然後由kube-proxy進一步給對應的pod
apiVersion: v1
kind: Service
metadata:
name: myapp-node
namespace: default
spec:
type: NodePort
selector:
app: myapp
release: stabel
ports:
- name: http
port: 80
targetPort: 80
查詢流程
iptables -t nat -nvL
KUBE-NODEPORTS
ipvsadm -Ln
LoadBalancer
loadBalancer和nodePort其實是同一種方式。 區別在於loadBalancer和nodePort多了一步, 就是可以呼叫cloud provider去建立LB來向節點導流
ExternalName
這種型別的Service通過返回CANME和它的值, 可以將服務對映到externalName欄位的內容(例如:hub.atguigu.com)。ExternalName Service是Service的特例, 它沒有selector, 也沒有定義任何的埠和Endpoint ,相反的,對於執行在叢集外部的服務, 它通過返回該外部服務的別名這種方式來提供服務。
apiVersion: v1
kind: Service
metadata:
name: my-service-1
namespace: default
spec:
type: ExternalName
externalName: my.detabase.example.com
當查詢主機my-service.default.svc.cluster.local(SVC_NAME.NAMESPACE.svc.cluster.local)時, 叢集的DNS服務將返回一個值my.database.example.com的CNAME記錄,訪問這個服務的工作方式和其他的相同, 唯一不同的是重定向發生在DNS層, 而且不會進行代理或轉發
lngress-Niginx github 地址:http://github.com/kubernetes/ingress-nginx
ingress-Niginx官方網站:https://kubernetes.github.io/ingress-nginx/
下載映象及版本
pollyduan/ingress-nginx-controller:v0.35.0
jettech/kube-webhook-certgen:v1.2.2
上傳到自己的本地倉庫Registry
### hub.syuee.com本地倉庫IP地址
### 為映象打個tag
# docker tag pollyduan/ingress-nginx-controller:v0.35.0 hub.syuee.com/library/ingress-nginx-controller:v0.35.0
# docker tag jettech/kube-webhook-certgen:v1.2.2 hub.syuee.com/library/kube-webhook-certgen:v1.2.2
### 推送到本地倉庫
# docker push hub.syuee.com/library/ingress-nginx-controller:v0.35.0
# docker push hub.syuee.com/library/kube-webhook-certgen:v1.2.2
### 檢視映象
# docker images | grep ingress
拉取安裝yaml 檔案 這裡部署的是0.35.0
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/cloud/deploy.yaml
修改所有的image
image: k8s.gcr.io/ingress-nginx/controller:v0.35.0@sha256:fc4979d8b8443a831c9789b5155cded454cb7de737a8b727bc2ba0106d2eae8b
---> image: hub.syuee.com/library/ingress-nginx-controller:v0.35.0
image: docker.io/jettech/kube-webhook-certgen:v1.2.2
---> image: hub.syuee.com/library/kube-webhook-certgen:v1.2.2
部署Ingress-Nginx
kubectl apply -f deploy.yaml
檢視執行結果
kubectl get pods -n ingress-nginx
建立ingress 規則
編寫ingress-app.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: wwww1.syuee.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
執行檔案和檢視結果
# kubectl apply -f ingress-app.yml
# kubectl get ingress -A
修改主機域名解析
這裡以Windows為例,在C:\Windows\System32\drivers\etc目錄下,開啟hosts檔案進行編輯,在最末一行新增:
192.168.31.74 www1.syuee.com
如遇到無法訪問
2 修改kube-proxy配置引數。追加:
--proxy-mode=ipvs --masquerade-all=true
3 如果以上均正常還是無法訪問,則檢視 ingress-nginx pod被排程到的node宿主機。
kubectl get pods -n ingress-nginx -o wide
則hosts中dns配置中使用其中一個ingress-nginx pod的node ip 域名
/windows/system32/drivers/etc/hosts
三、lngress
部署Ingress-Nginx
kubectl apply -f deploy.yaml
Ingress HTTP代理訪問
deployment,Service,Ingress Yaml檔案
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dm
spec:
replicas: 2
selector:
matchLabels:
name: nginx-dm
template:
metadata:
labels:
name: nginx-dm
spec:
containers:
- name: nginx-dm
image: hub.syuee.com/library/syuee-nginx:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
name: nginx-dm
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-mynginx
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www1.syuee.com
http:
paths:
- path: #路徑 如/ /index
backend:
serviceName: nginx-svc
servicePort: 80
多個域名
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-mynginx1
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www1.syuee.com
http:
paths:
- path: #路徑 如/ /index
backend:
serviceName: nginx-svc1
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-mynginx2
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: www2.syuee.com
http:
paths:
- path: #路徑 如/ /index
backend:
serviceName: nginx-svc2
servicePort: 80
如遇到無法訪問
2 修改kube-proxy配置引數。
--proxy-mode=ipvs --masquerade-all=true
3 如果以上均正常還是無法訪問,則檢視 ingress-nginx pod被排程到的node宿主機。
kubectl get pods -n ingress-nginx -o wide
則hosts中dns配置中使用其中一個ingress-nginx pod的node ip 域名
/windows/system32/drivers/etc/hosts
/etc/hosts
Ingress HTTPS代理訪問
建立證書, 以及cert 儲存方式
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=NGINXSVC/o=NGINXSVC"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
Deployment,Service, Ingress Yaml檔案
apiVersion: exensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
spec:
tls:
- hosts:
- foo.bar.com
secretName: tls-secret
rules:
- host: foo.bar.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
Nginx 進行BasicAuth
安裝http伺服器這裡需要http支援
yum -y install httpd
新建目錄
mkdir basic-auth
建立認證檔案 檔名為auth 使用者名稱foo
htpasswd -c auth foo
kubectl create secret generic basic-auth --from-file=auth
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-with-auth
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
rules:
- host: www4.syuee.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
Nginx 進行重寫
名稱 | 描述 | 值 |
---|---|---|
nginx-ingress.kubernetes.io/rewrite-target | 必須重定向流量的目標URL | 串 |
Nginx-ingress.kubernetes.io/ssl-redirect | 指示位置部分是否僅可訪問SSL(當ingress包含證書時預設True) | 布林 |
nginx.ingress.kubernetes.io/force-ssl-redirect | 即便ingress未啟用TLS, 也強制重定向到HTTPS | 布林 |
nginx.ingress.kubernetes.io/app-root | 定義Controller必須重定向的應用程式根, 如果它在‘/s'上下文中 | 串 |
nginx.ingress.kubernetes.io/use-regex | 指示ingress上定義的路徑是否使用正則表示式 | 布林 |
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-test
annotations:
nginx.ingress.kubernetes.io/rewrite-target: http://foo.bar.com:31795/hostname.html
spec:
rules:
- host: foo10.bar.com
http:
paths:
- path: /
backend:
serviceName: nginx-svc
servicePort: 80
四、endpoint
endpoint是k8s叢集中的一個資源物件,儲存在etcd中,用來記錄一個service對應的所有pod的訪問地址。service配置selector,endpoint controller才會自動建立對應的endpoint物件;否則,不會生成endpoint物件.
例如,k8s叢集中建立一個名為hello的service,就會生成一個同名的endpoint物件,ENDPOINTS就是service關聯的pod的ip地址和埠。
一個 Service 由一組 backend Pod 組成。這些 Pod 通過 endpoints
暴露出來。 Service Selector 將持續評估,結果被 POST 到一個名稱為 Service-hello 的 Endpoint 物件上。 當 Pod 終止後,它會自動從 Endpoint 中移除,新的能夠匹配上 Service Selector 的 Pod 將自動地被新增到 Endpoint 中。 檢查該 Endpoint,注意到 IP 地址與建立的 Pod 是相同的。現在,能夠從叢集中任意節點上使用 curl 命令請求 hello Service <CLUSTER-IP>:<PORT>
。 注意 Service IP 完全是虛擬的,它從來沒有走過網路,如果對它如何工作的原理感到好奇,可以閱讀更多關於 服務代理 的內容。
Endpoints是實現實際服務的端點集合。
Kubernetes在建立Service時,根據Service的標籤選擇器(Label Selector)來查詢Pod,據此建立與Service同名的EndPoints物件。當Pod的地址發生變化時,EndPoints也隨之變化。Service接收到請求時,就能通過EndPoints找到請求轉發的目標地址。
Service不僅可以代理Pod,還可以代理任意其他後端,比如執行在Kubernetes外部Mysql、Oracle等。這是通過定義兩個同名的service和endPoints來實現的。
在實際的生產環境使用中,通過分散式儲存來實現的磁碟在mysql這種IO密集性應用中,效能問題會顯得非常突出。所以在實際應用中,一般不會把mysql這種應用直接放入kubernetes中管理,而是使用專用的伺服器來獨立部署。而像web這種無狀態應用依然會執行在kubernetes當中,這個時候web伺服器要連線kubernetes管理之外的資料庫,有兩種方式:一是直接連線資料庫所在物理伺服器IP,另一種方式就是藉助kubernetes的Endpoints直接將外部伺服器對映為kubernetes內部的一個服務。
簡單認為:動態儲存pod名字與pod ip對應關係的list,並提供將請求轉發到實際pod上的能力
[root@k8s-master ~]# pwd
/root
[root@k8s-master ~]# cat deployment-hello.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello
spec:
replicas: 4
template:
metadata:
labels:
run: hello
spec:
containers:
- name: hello
image: tomcat:8 #確保node節點上有該映象且可正常執行,注意是node節點機器上,不是master機器
imagePullPolicy: IfNotPresent ##Always,IfNotPresent,Never
ports:
- name: http
containerPort: 8080
[root@k8s-master ~]# cat service-hello.yaml
apiVersion: v1
kind: Service
metadata:
name: service-hello
labels:
name: service-hello
spec:
type: NodePort #這裡代表是NodePort型別的,另外還有ingress,LoadBalancer
ports:
- port: 80 #這裡的埠和clusterIP(kubectl describe service service-hello中的IP的port)對應,即在叢集中所有機器上curl 10.98.166.242:80可訪問釋出的應用服務。
targetPort: 8080 #埠一定要和container暴露出來的埠對應,nodejs暴露出來的埠是8081,所以這裡也應是8081
protocol: TCP
nodePort: 31111 # 所有的節點都會開放此埠30000--32767,此埠供外部呼叫。
selector:
run: hello #這裡選擇器一定要選擇容器的標籤,之前寫name:kube-node是錯的。
[root@k8s-master ~]# pwd
/root
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl create -f service-hello.yaml
service/service-hello created
[root@k8s-master ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h24m
service-hello NodePort 10.98.166.242 <none> 80:31111/TCP 42s
[root@k8s-master ~]#
root@k8s-master ~]# kubectl get services -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 4h25m <none>
service-hello NodePort 10.98.166.242 <none> 80:31111/TCP 104s run=hello
[root@k8s-master ~]# kubectl describe service service-hello
Name: service-hello
Namespace: default
Labels: <none>
Annotations: <none>
Selector: run=hello
Type: NodePort
IP: 10.98.166.242
Port: <unset> 80/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31111/TCP
Endpoints: 10.244.1.22:8080,10.244.1.23:8080,10.244.1.24:8080 + 1 more...
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.111.130:6443 20h
service-hello 10.244.1.22:8080,10.244.1.23:8080,10.244.1.24:8080 + 1 more... 15h
[root@k8s-master ~]# kubectl describe endpoint service-hello
error: the server doesn't have a resource type "endpoint"
[root@k8s-master ~]# kubectl describe endpoints service-hello
Name: service-hello
Namespace: default
Labels: <none>
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2019-04-03T02:18:57Z
Subsets:
Addresses: 10.244.1.22,10.244.1.23,10.244.1.24,10.244.1.25
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
<unset> 8080 TCP
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedToUpdateEndpoint 48m (x2 over 69m) endpoint-controller Failed to update endpoint default/service-hello: Operation cannot be fulfilled on endpoints "service-hello": the object has been modified; please apply your changes to the latest version and try again
[root@k8s-master ~]#
Endpoints是指一個服務的端點,當你的服務需要訪問外部資源時,而你又不想把外部地址配置到程式碼裡,這時,你可以在k8s裡建立一個kind為Endpoints的服務,它可以幫助你的程式解析這個外部地址。
- 宣告一個elasticsearch-1的服務,它對映到一個外部的地址192.168.11.13的9200埠
kind: Service
apiVersion: v1
metadata:
name: elasticsearch-1
spec:
clusterIP: None
---
kind: Endpoints
apiVersion: v1
metadata:
name: elasticsearch-1
subsets:
- addresses:
- ip: 192.168.11.13
ports:
- port: 9200
- 而如果你的外部服務也是一個k8s服務,這時也可以通過ExternalName型別也實現這種對映關係,比如在跨namespace訪問資源時,你就可以通過ExternalName來實現一種類似快捷方式的功能。
例如,以下 Service 定義將 prod 名稱空間中的 my-service 服務對映到 my.database.example.com
apiVersion: v1
kind: Service
metadata:
name: my-service
namespace: prod
spec:
type: ExternalName
externalName: my.database.example.com
說明: ExternalName 接受 IPv4 地址字串,但作為包含數字的 DNS 名稱,而不是 IP 地址。 類似於 IPv4 地址的外部名稱不能由 CoreDNS 或 ingress-nginx 解析,因為外部名稱旨在指定規範的 DNS 名稱。 要對 IP 地址進行硬編碼,請考慮使用 headless Services。
並不是service暴露一個外部ip,而是service轉發外部ip+port,做法如下:
apiVersion: v1
kind: Endpoints
metadata:
name: http
namespace: default
subsets:
- addresses:
- ip: 10.2.1.1
ports:
- name: http
port: 8080
protocol: TCP
其中10.2.1.1:8080
是外部服務。
其次,建立service,其中名字一定要和endpoint的一致:
apiVersion: v1
kind: Service
metadata:
name: http
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
然後訪問service自動生成的虛擬ip加port即可。
FAQ
1)ingress-controller起不來
通過kubectl describe檢視pod,有這樣一句報錯:port 80 is already in use. Please check the flag --http-port
解決方法:
通過# netstat -antp | grep 80,找到了佔用埠的應用,然後停掉就可以了。2)ingress-controller起不來
檢視官方文件有這麼一句提示
所以,在執行ingress-controller.yml後,執行以下如下命令:
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=120s
3)瀏覽器直接輸入域名無法訪問,後臺curl時報錯:[root@node1 ~]# curl http://example.ingressdemo.com
curl: (6) Could not resolve host: ingress-nginx-controller-admission.ingress-nginx.svc; Unknown error
解決方法:
[root@node1]# kubectl get ValidatingWebhookConfiguration/ingress-nginx-admission -n ingress-nginx
NAME WEBHOOKS AGE
ingress-nginx-admission 1 7d1h
[root@test ~]# kubectl edit ValidatingWebhookConfiguration/ingress-nginx-admission -n ingress-nginx
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission edited
######下面是edit介面中的某一段
webhooks:
- admissionReviewVersions:
- v1beta1
clientConfig:
caBundle: BDRVJUSUZJQ0FURS0tLS0LS0tLS1CRUdJTitCk1JSURUNBaEJOUUROWnBJcXR3JPRENCM3FBREFnTTJzaDg3YVVrSlpNQW9HQ0NxR1NNNDlCQU1DWUjBUQVFIL0TUFBd0lCNxR1NNNDRTVNVEl3TlRJMVdoZ1BNakV5TURBME1qVXhNakExTWpWYU1BQXdXVEZ3dOakFPQmdOVkFUQmdjcWhrak9QUUlCQmdncQpoa2pPUFFNY04KTWpBd05UQkJ3TkNBQVRDcWRWOWdVTm5yelYSs3NlBUQVBRSm9KS30Umg5NlIxYkl6R3lzQjE3UHJzc21CNDBGQjRPYU5jJHYVpaTHNtN1MR28yMGwzCdzblJva2FRcWpMOBrYW96hROEJBZjhFQkFNQ0FnUXcKRXdZRFZSMGxCQXd3Q2dZSUt3WUJCUVVIQXdFCL3pBS0JnZ3Foa2pPUFFRRApBZ05KQURCR0FpRUE4K1A1WGlyOFgzREJEK1IvN2lIVWxzNXg3TW1UdjVMN1VzQzBd0R3WURJBVXdBd0VQ0lRQ2JS1FTkQgQ0VSVSMUNpCWG50RmdDblJLRkxjUVkxeWJ6bDVwTnlyZkZnPkVOdGSUNBVEUtLS0tLQoEJ6N21CNU9KT0KLS0tLEl=
service:
name: ingress-nginx-controller-admission
namespace: ingress-nginx
path: /extensions/v1beta1/ingresses
port: 443
failurePolicy: Fail ################## 改成:Ignore
matchPolicy: Exact
name: validate.nginx.ingress.kubernetes.io