Kubernetes(k8s)集群管理實戰(zhàn)|Ingress暴露應用

本篇文章主要核心內容:
Ingress暴露應用
采用Ingress暴露容器化應用(Nginx)
Ingress暴露應用
NodePort
NodePort服務是讓外部請求直接訪問服務的最原始方式,NodePort是在所有的節(jié)點(虛擬機)上開放指定的端口,所有發(fā)送到這個端口的請求都會直接轉發(fā)到服務中的pod里;
NodePort服務的YAML文件如下:
apiVersion:?v1
kind:?Service
metadata:??
?name:?my-nodeport-service
selector:??
?app:?my-appspec:
?type:?NodePort
?ports:??
?-?name:?http
???port:?80
???targetPort:?80
???nodePort:?30008
???protocol:?TCP
這種方式有一個“nodePort"的端口,能在節(jié)點上指定開放哪個端口,如果沒有指定端口,它會選擇一個隨機端口,大多數時候應該讓Kubernetes隨機選擇端口;
這種方式的不足:
1、一個端口只能供一個服務使用;
2、只能使用30000–32767之間的端口;
3、如果節(jié)點/虛擬機的IP地址發(fā)生變化,需要人工進行處理;
因此,在生產環(huán)境不推薦使用這種方式來直接發(fā)布服務,如果不要求運行的服務實時可用,或者用于演示或者臨時運行一個應用可以用這種方式;
三種端口說明
ports:??
?-?name:?http
???port:?80
???targetPort:?80
???nodePort:?30008
???protocol:?TCP
nodePort
外部機器(在windows瀏覽器)可以訪問的端口;
比如一個Web應用需要被其他用戶訪問,那么需要配置type=NodePort,而且配置nodePort=30001,那么其他機器就可以通過瀏覽器訪問scheme://node:30001訪問到該服務;
targetPort
容器的端口,與制作容器時暴露的端口一致(Dockerfile中EXPOSE),例如docker.io官方的nginx暴露的是80端口;
port
Kubernetes集群中的各個服務之間訪問的端口,雖然mysql容器暴露了3306端口,但外部機器不能訪問到mysql服務,因為他沒有配置NodePort類型,該3306端口是集群內其他容器需要通過3306端口訪問該服務;
kubectl expose deployment springboot-k8s --port=8080 --target-port=8080 --type=NodePort
?
LoadBalancer
LoadBlancer可以暴露服務,這種方式需要向云平臺申請負載均衡器,目前很多云平臺都支持,但是這種方式深度耦合了云平臺;(相當于是購買服務)
從外部的訪問通過負載均衡器LoadBlancer轉發(fā)到后端的Pod,具體如何實現要看云提供商;
Ingress
Ingress 英文翻譯為:入口、進入、進入權、進食,也就是入口,即外部請求進入k8s集群必經之口,我們看一張圖:

?
雖然k8s集群內部署的pod、service都有自己的IP,但是卻無法提供外網訪問,以前我們可以通過監(jiān)聽NodePort的方式暴露服務,但是這種方式并不靈活,生產環(huán)境也不建議使用;
Ingresss是k8s集群中的一個API資源對象,相當于一個集群網關,我們可以自定義路由規(guī)則來轉發(fā)、管理、暴露服務(一組pod),比較靈活,生產環(huán)境建議使用這種方式;
Ingress不是kubernetes內置的(安裝好k8s之后,并沒有安裝ingress),ingress需要單獨安裝,而且有多種類型Google Cloud Load Balancer,Nginx,Contour,Istio等等,我們這里選擇官方維護的Ingress Nginx;
使用Ingress Nginx的步驟:
1、部署Ingress Nginx;
2、配置Ingress Nginx規(guī)則;
采用Ingress暴露容器化應用(Nginx)
1、部署一個容器化應用(pod),比如Nginx、SpringBoot程序;
kubectl create deployment nginx --image=nginx
2、暴露該服務;
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort
3、部署Ingress Nginx
https://github.com/kubernetes/ingress-nginx?
ingress-nginx是使用NGINX作為反向代理和負載均衡器的Kubernetes的Ingress控制器;
kubectl? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???apply? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??-f?
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yaml
332行修改成阿里云鏡像:
阿里云鏡像首頁:http://dev.aliyun.com/
修改鏡像地址為:
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.33.0
添加一個配置項:

應用:
kubectl apply -f deploy.yaml

4、查看Ingress的狀態(tài)
kubectl get service -n ingress-nginx
kubectl get deploy -n ingress-nginx
kubectl get pods -n ingress-nginx

5、創(chuàng)建Ingress規(guī)則

kubectl apply -f ingress-nginx-rule.yaml
報如下錯誤:

解決:kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
然后再次執(zhí)行:kubectl apply -f ingress-nginx-rule.yaml
檢查一下:
kubectl get ing(ress) ?--查規(guī)則
Kubernetes,點擊以下實戰(zhàn)教程,帶你快速入門Kubernetes!

