目錄
一.ingress基本原理介紹
1.將原有用于暴露服務和負載均衡的服務的三四層負載均衡變為一個七層負載均衡
2.controller和ingress
3.通過下面這個圖可能會有更直觀的理解
二.為什么會出現ingress
1.NodePort存在缺點
2.LoadBalancer存在缺點
三.ingress三種暴露服務的方式
四.ingress配置前準備工作
1.像之前的openelb部署文章講到一樣,先開啟嚴格ARP
2.部署好openelb相關配置
五.部署ingress,部署deploy.yaml
1.文件網盤地址
2.上面鏈接中的應修改處已修改好,主要如下
3.部署deploy.yaml
4.創建需要用的deployment和service
六.創建該服務的ingress-http代理
1.主要配置項有host、service-name、service-port等幾處,代碼中介紹
2.添加域名映射進行訪問測試
(1)linux
(2)windows
一.ingress基本原理介紹
1.將原有用于暴露服務和負載均衡的服務的三四層負載均衡變為一個七層負載均衡
工作原理了類似于nginx,等于是在ingress里建立許多規則,在通過controller監聽規則變化,生成對應的配置,實現對服務的反向代理配置,為外部提供服務,并動態更新。
2.controller和ingress
(1)上面提到controller,他是具體用于實現反向代理和負載均衡的程序,對ingress定義的規則進行解析并根據配置進行轉發,nginx、haproxy等都可以作為實現方式。如果是對Kubernetes 集群外部的客戶端提供服務,那么 Controller 實現的是類似于邊緣路由(Edge Router) 的功能。需要注意的是, Ingress 只能以 HTTP TTPS 提供服務。
(2)那么還要提到一個ingress對象,他起到定義請求如何轉發到service的規則的作用,使用 Ingress 進行服務路由時, Controller 基于 Ingress 規則將客戶端請求直接轉發到 Service 對應的后端 Endpoint Pod 上,這樣會跳過 kube-proxy 設置的路由轉發規則,以提高網絡轉發效率。
3.通過下面這個圖可能會有更直觀的理解
?
二.為什么會出現ingress
我們知道ingress也是用于暴露服務和負載均衡的,相對NodePort和LoadBalancer的缺點而言,ingress可以較完美解決這些問題,耗費較少的端口和LB資源,比較方便,一個IP可以暴露多個應用,支持同域名不同uri,支持證書等功能。但是如上所述,他是一個七層負載均衡,在某種情況下他還是會造成CPU消耗大,設備性能下降。
1.NodePort存在缺點
集群中服務增多時,他的占用設備的端口比較多,但站在內核處理方面,他的內核處理次數少一點。
2.LoadBalancer存在缺點
每一個service都要配置一個LB,還需要云廠商的配置支持,在特殊情況下比較麻煩。
三.ingress三種暴露服務的方式
三種方式分別是:deployment+loadbalancer的service,daemonset+hostnetwork+nodeselector的service,deployment+nodeport的service,這里主要介紹deployment+loadbalancer下的openelb方式部署,用Deployment部署ingress-controller,創建一個type為 LoadBalancer的 service關聯這組pod。公有云為LoadBalancer的 service自動創建一個負載均衡器,這時把域名解析指向地址,就實現了集群服務的對外暴露。
四.ingress配置前準備工作
openelb,purelb,metallb三種均衡器在部署ingress之前都需要保證部署的該功能負載均衡正常工作,這里就以openelb為例
1.像之前的openelb部署文章講到一樣,先開啟嚴格ARP
[root@k8s-master ingress]# kubectl edit configmap kube-proxy -n kube-system
[root@k8s-master ingress]# kubectl rollout restart ds kube-proxy -n kube-system
daemonset.apps/kube-proxy restarted
[root@k8s-master ingress]# kubectl get configmap kube-proxy -n kube-system -o yaml | grep modemode: "ipvs"
[root@k8s-master ingress]# kubectl get configmap kube-proxy -n kube-system -o yaml | grep strictARPstrictARP: true
2.部署好openelb相關配置
openelb文件網盤鏈接:百度網盤 請輸入提取碼 提取碼:29e4
#部署完查看是否有openelb-system名稱空間,是否有pod運行,以及其他資源是湊正常運行
[root@k8s-master ingress]# kubectl apply -f openelb.yaml
[root@k8s-master ingress]# kubectl get all -n openelb-system ?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? ? RESTARTS ? AGE
pod/openelb-admission-create-5ffkm ? 0/1 ? ? Completed ? 0 ? ? ? ? 17m
pod/openelb-admission-patch-hdt6j ? ? 0/1 ? ? Completed ? 1 ? ? ? ? 17m
pod/openelb-keepalive-vip-bl7h7 ? ? ? 1/1 ? ? Running ? ? 0 ? ? ? ? 17m
pod/openelb-keepalive-vip-ng2c7 ? ? ? 1/1 ? ? Running ? ? 0 ? ? ? ? 17m
pod/openelb-manager-99b49789c-g72wf ? 1/1 ? ? Running ? ? 0 ? ? ? ? 17m
?
NAME ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE
service/openelb-admission ? ClusterIP ? 10.99.101.18 ? <none> ? ? ? 443/TCP ? 17m
?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DESIRED ? CURRENT ? READY ? UP-TO-DATE ? AVAILABLE ? NODE SELECTOR ? AGE
daemonset.apps/openelb-keepalive-vip ? 2 ? ? ? ? 2 ? ? ? ? 2 ? ? ? 2 ? ? ? ? ? 2 ? ? ? ? ? <none> ? ? ? ? 17m
?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? UP-TO-DATE ? AVAILABLE ? AGE
deployment.apps/openelb-manager ? 1/1 ? ? 1 ? ? ? ? ? 1 ? ? ? ? ? 17m
?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? DESIRED ? CURRENT ? READY ? AGE
replicaset.apps/openelb-manager-99b49789c ? 1 ? ? ? ? 1 ? ? ? ? 1 ? ? ? 17m
?
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? COMPLETIONS ? DURATION ? AGE
job.batch/openelb-admission-create ? 1/1 ? ? ? ? ? 3s ? ? ? ? 17m
job.batch/openelb-admission-patch ? 1/1 ? ? ? ? ? 4s ? ? ? ? 17m
?
#創建eip地址池
[root@k8s-master ingress]# cat ip-pool.yaml ? ?
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:name: my-eip-pool
spec:address: 192.168.2.11-192.168.2.20protocol: layer2disable: falseinterface: ens33
[root@k8s-master ingress]# kubectl apply -f ip-pool.yaml
五.部署ingress,部署deploy.yaml
1.文件網盤地址
鏈接:https://pan.baidu.com/s/15xTy25X9_3HP-qjhmoM9Iw?
提取碼:54zw
2.上面鏈接中的應修改處已修改好,主要如下
controller和controller-admission都添加了一段注解annotations,用于聲明使用剛才創建的eip地址池,添加了80端口
3.部署deploy.yaml
[root@k8s-master ingress]# kubectl apply -f deploy.yaml
4.創建需要用的deployment和service
創建關于nginx和tomcat的兩個service和deployment,代碼中有注意事項
[root@k8s-master ingress]# cat mydeployment.yaml
apiVersion: apps/v1
kind: Deployment ? ? #deployment都是正常創建即可
metadata:labels:app: my-nginxname: my-nginxnamespace: myns
spec:replicas: 1selector:matchLabels:app: my-nginxtemplate:metadata:labels:app: my-nginxspec:containers:- image: nginx:1.17.2name: nginximagePullPolicy: IfNotPresentports:- containerPort: 80
?
---
?
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: my-tomcatname: my-tomcatnamespace: myns
spec:replicas: 1selector:matchLabels:app: my-tomcattemplate:metadata:labels:app: my-tomcatspec:containers:- image: tomcat:8.5-jre10-slimname: tomcatimagePullPolicy: IfNotPresentports:- containerPort: 8080
?
---
?
apiVersion: v1
kind: Service
metadata:name: nginx-servicenamespace: mynsannotations: ? ?#在metadata中指定注解信息,使用eip地址池中的地址lb.kubesphere.io/v1alpha1: openelbprotocol.openelb.kubesphere.io/v1alpha1: layer2eip.openelb.kubesphere.io/v1alpha2: my-eip-pool
spec:allocateLoadBalancerNodePorts: false ? #不自動分配端口,由用戶指定externalTrafficPolicy: Cluster ? #將外部流量分發到集群內的所有節點internalTrafficPolicy: Cluster ? #將內部流量限制在集群內selector:app: my-nginxtype: LoadBalancer ? #指定類型為loadbalancer負載均衡ports:- port: 80targetPort: 80
?
---
?
apiVersion: v1
kind: Service
metadata:name: tomcat-servicenamespace: mynsannotations: ? ?#在metadata中指定注解信息,使用eip地址池中的地址lb.kubesphere.io/v1alpha1: openelbprotocol.openelb.kubesphere.io/v1alpha1: layer2eip.openelb.kubesphere.io/v1alpha2: my-eip-pool
spec:allocateLoadBalancerNodePorts: falseexternalTrafficPolicy: ClusterinternalTrafficPolicy: Clusterselector:app: my-tomcattype: LoadBalancerports:- port: 8080targetPort: 8080
[root@k8s-master ingress]# kubectl apply -f mydeployment.yaml
六.創建該服務的ingress-http代理
1.主要配置項有host、service-name、service-port等幾處,代碼中介紹
[root@k8s-master ingress]# cat myingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: myingressnamespace: myns
spec:ingressClassName: nginxrules:- host: www.mynginx.com ? #想要映射的域名http:paths:- path: /pathType: Prefixbackend:service: name: nginx-service ? #為哪個服務進行映射,必須要和剛才創建的服務名稱一致port:number: 80 ? #暴露哪個端口號用于外部訪問- host: www.tomcat.comhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcat-serviceport:number: 8080
2.添加域名映射進行訪問測試
[root@k8s-master ingress]# kubectl get service -n myns ? #使用的是我們創建的服務所開放出來的EXTERNAL-IP
NAME ? ? ? ? ? ? TYPE ? ? ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? ? ? ? AGE
nginx-service ? LoadBalancer ? 10.96.45.145 ? 192.168.2.13 ? 80:30385/TCP ? ? 36m
tomcat-service ? LoadBalancer ? 10.97.204.115 ? 192.168.2.14 ? 8080:30165/TCP ? 36m
[root@k8s-master ingress]# kubectl get ingress -n myns ? #分別對應兩個ingress
NAME ? ? ? CLASS ? HOSTS ? ? ? ? ? ? ? ? ? ? ? ? ? ADDRESS ? ? ? PORTS ? AGE
myingress ? nginx ? www.mynginx.com,www.tomcat.com ? 192.168.2.11 ? 80 ? ? 33m
(1)linux
[root@k8s-master ingress]# tail -2 /etc/hosts
192.168.2.13 www.mynginx.com
192.168.2.14 www.mytomcat.com
(2)windows
以管理員身份運行powershell,切到.\drivers\etc\編輯hosts文件,
PS C:\WINDOWS\system32> cd .\drivers\etc\
PS C:\WINDOWS\system32\drivers\etc> notepad .\hosts
PS C:\WINDOWS\system32\drivers\etc>