什么是Ingress
有了Service之后,我們可以訪問(wèn)這個(gè)Service的IP(clusterIP)來(lái)請(qǐng)求對(duì)應(yīng)的Pod,但是這只能是在集群內(nèi)部訪問(wèn)。 要想讓外部用戶訪問(wèn)此資源,可以使用NodePort,即在node節(jié)點(diǎn)上暴漏一個(gè)端口出來(lái),但是這個(gè)非常不靈活。為了解決此問(wèn)題,K8s引入了一個(gè)新的API資源對(duì)象Ingress,它是一個(gè)七層的負(fù)載均衡器,類(lèi)似于Nginx。
三個(gè)核心概念:Ingress、Ingress Controller、IngressClass
Ingress用來(lái)定義具體的路由規(guī)則,要實(shí)現(xiàn)什么樣的訪問(wèn)效果;
Ingress Controller是實(shí)現(xiàn)Ingress定義具體規(guī)則的工具或者叫做服務(wù),在K8s里就是具體的Pod;
IngressClass是介于Ingress和Ingress Controller之間的一個(gè)協(xié)調(diào)者,它存在的意義在于,當(dāng)有多個(gè)Ingress Controller時(shí),可以讓Ingress和Ingress Controller彼此獨(dú)立,不直接關(guān)聯(lián),而是通過(guò)IngressClass實(shí)現(xiàn)關(guān)聯(lián)。
Ingress實(shí)戰(zhàn)
1)編輯ingress YAML文件
vimying.yaml#內(nèi)容如下 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: mying ##ingress名字 spec: ingressClassName: myingc ##定義關(guān)聯(lián)的IngressClass rules: ##定義具體的規(guī)則 - host: aminglinux.com ##訪問(wèn)的目標(biāo)域名 http: paths: - path: / pathType: Exact backend: ##定義后端的service對(duì)象 service: name: ngx-svc port: number: 80查看ingress
kubectl get ing kubectl describe ing mying2)編輯IngressClass YAML文件
vimyingc.yaml#內(nèi)容如下 apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name:myingc spec: controller: nginx.org/ingress-controller ##定義要使用哪個(gè)controller查看ingressClass
kubectl get ingressclass
3)安裝ingress-controller
首先做一下前置工作
curl -O 'https://gitee.com/aminglinux/linux_study/raw/master/k8s/ingress.tar.gz' tar zxf ingress.tar.gz cd ingress ./setup.sh ##說(shuō)明,執(zhí)行這個(gè)腳本會(huì)部署幾個(gè)ingress相關(guān)資源,包括namespace、configmap、secrect等編輯controller YAML文件
vi ingress-controller.yaml #內(nèi)容如下 apiVersion: apps/v1 kind: Deployment metadata: name: ngx-ing namespace:nginx-ingress spec: replicas: 1 selector: matchLabels: app:ngx-ing template: metadata: labels: app: ngx-ing #annotations: #prometheus.io/scrape: "true" #prometheus.io/port: "9113" #prometheus.io/scheme: http spec: serviceAccountName: nginx-ingress containers: - image: nginx/nginx-ingress:2.2-alpine imagePullPolicy: IfNotPresent name: ngx-ing ports: - name: http containerPort: 80 - name: https containerPort: 443 - name: readiness-port containerPort: 8081 - name: prometheus containerPort: 9113 readinessProbe: httpGet: path: /nginx-ready port: readiness-port periodSeconds: 1 securityContext: allowPrivilegeEscalation: true runAsUser: 101 #nginx capabilities: drop: - ALL add: - NET_BIND_SERVICE env: - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name args: - -ingress-class=myingc - -health-status - -ready-status --nginx-status - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret應(yīng)用YAML
kubectl apply -f ingress-controller.yaml查看pod、deployment:
kubectl get po -n nginx-ingress kubectl get deploy -n nginx-ingress將ingress對(duì)應(yīng)的pod端口映射到master上臨時(shí)測(cè)試:
kubectl port-forward -n nginx-ingress ngx-ing-547d6575c7-fhdtt 8888:80 &注意,測(cè)試前可以修改ng-deploy對(duì)應(yīng)的兩個(gè)pod里的/usr/share/nginx/html/index.html文件內(nèi)容,用于區(qū)分兩個(gè)pod。 使用curl測(cè)試:
curl -x127.0.0.1:8888 aminglinux.com 或者: curl -H 'Host:aminglinux.com' http://127.0.0.1:8888Igress對(duì)外訪問(wèn)的三種方案
上面對(duì)ingress做端口映射,然后通過(guò)其中一個(gè)節(jié)點(diǎn)的IP來(lái)訪問(wèn)ingress只是一種臨時(shí)方案。那么正常如何做呢?有三種常用的方案:
1)Deployment+LoadBalancer
如果要把ingress部署在公有云,那用這種方式比較合適。用Deployment部署ingress-controller,創(chuàng)建一個(gè)type為L(zhǎng)oadBalancer的service關(guān)聯(lián)這組pod。 大部分公有云,都會(huì)為L(zhǎng)oadBalancer的service自動(dòng)創(chuàng)建一個(gè)負(fù)載均衡器,通常還綁定了公網(wǎng)地址。 只要把域名解析指向該地址,就實(shí)現(xiàn)了集群服務(wù)的對(duì)外暴露。
2)Deployment+NodePort
同樣用deployment模式部署ingress-controller,并創(chuàng)建對(duì)應(yīng)的服務(wù),但是type為NodePort。這樣,ingress就會(huì)暴露在集群節(jié)點(diǎn)ip的特定端口上。 由于nodeport暴露的端口是隨機(jī)端口,一般會(huì)在前面再搭建一套負(fù)載均衡器來(lái)轉(zhuǎn)發(fā)請(qǐng)求。該方式一般用于宿主機(jī)是相對(duì)固定的環(huán)境ip地址不變的場(chǎng)景。 NodePort方式暴露ingress雖然簡(jiǎn)單方便,但是NodePort多了一層NAT,在請(qǐng)求量級(jí)很大時(shí)可能對(duì)性能會(huì)有一定影響。
3)DaemonSet+nodeSelector
用DaemonSet結(jié)合nodeselector來(lái)部署ingress-controller到特定的node上,然后使用HostNetwork直接把該pod與宿主機(jī)node的網(wǎng)絡(luò)打通(如,上面的臨時(shí)方案kubectl port-forward),直接使用宿主機(jī)的80/433端口就能訪問(wèn)服務(wù)。 這時(shí),ingress-controller所在的node機(jī)器就很類(lèi)似傳統(tǒng)架構(gòu)的邊緣節(jié)點(diǎn),比如機(jī)房入口的nginx服務(wù)器。該方式整個(gè)請(qǐng)求鏈路最簡(jiǎn)單,性能相對(duì)NodePort模式更好。 缺點(diǎn)是由于直接利用宿主機(jī)節(jié)點(diǎn)的網(wǎng)絡(luò)和端口,一個(gè)node只能部署一個(gè)ingress-controller pod。比較適合大并發(fā)的生產(chǎn)環(huán)境使用。
審核編輯:劉清
-
nginx
+關(guān)注
關(guān)注
0文章
142瀏覽量
12154 -
YAML
+關(guān)注
關(guān)注
0文章
21瀏覽量
2311 -
負(fù)載均衡器
+關(guān)注
關(guān)注
0文章
18瀏覽量
2573
原文標(biāo)題:一篇文章助你搞懂Ingress
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論