1. <dd id="erndk"></dd>
                1. 公有云托管K8S的對外服務之Ingress

                  互聯網 2021/12/26 6:11:58

                  之前搭建并使用了微軟云Azure托管的K8S平臺AKS,最近又在華為云上搭建了CCE,加上練習為目的使用的AWS和阿里云的K8S平臺,逐漸掌握了一些主流公有云廠商基于K8S原生服務的使用方式,學而不思則罔,如果實踐是檢驗真理的唯一標準,那實踐后的總結就是在創造真理,K8S涉及的…

                    之前搭建并使用了微軟云Azure托管的K8S平臺AKS,最近又在華為云上搭建了CCE,加上練習為目的使用的AWS和阿里云的K8S平臺,逐漸掌握了一些主流公有云廠商基于K8S原生服務的使用方式,學而不思則罔,如果實踐是檢驗真理的唯一標準,那實踐后的總結就是在創造真理,K8S涉及的內容太多,其中網絡最為復雜,而網絡又分集群入口、出口網絡,以及Pod間的Networkpolicy等等,光是Calico網絡模型估計就得連載幾篇,本文主要針對公有云托管模式下的K8S集群對外暴露服務的Ingress,廢話少說,開整

                    我們都知道K8S中工作負載有很多種,最常用的無狀態負載(Depolyment),以及有狀態負載(StatetfulSet),守護進程(DaemonSet)以及各種任務(Job和CronJob),不同的工作負載適合不同的場景,這里不過多贅述,工作負載調用的最小單元是Pod,而工作負載需要被訪問或者訪問別的負載,這是就引入的Service的概念,K8S集群內部可以直接通過Service名稱進行訪問,但Service是基于四層TCP和UDP協議轉發的,而在實際使用場景中,四層Service無法滿足應用層存在的大量HTTP/HTTPS訪問需求,因此引入了Ingress的概念來暴露服務,使用方式如下:

                  對于自建K8S集群來說,負載均衡器可能需要自己實現,比如F5,Nginx,LVS等,而負載均衡作為公有云最常見的PaaS服務,顯然只要和托管的K8S平臺結合一下就OK了,你能想到,K8S官方和公有云廠商顯然早就看穿一切了,于是K8S官方的Service類型從Nodeport,ClusterIP,又加入了Loadbalance類型,而公有云廠商也支持通過YAML創建云上服務,比如Azure的beta版service.beta.kubernetes.io/azure-load-balancer-internal: "true",這樣一來事情就變得簡單了,不過上圖有個概念忘記說明了,那就是Ingress Controller,這是一個抽象的概念,你可以這樣理解:Ingress資源:一組基于域名或URL把請求轉發到指定Service實例的訪問規則,是Kubernetes的一種資源對象,Ingress實例被存儲在對象存儲服務etcd中,通過接口服務實現增、刪、改、查的操作。

                  Ingress Controller:請求轉發的執行器,用以實時監控資源對象Ingress、Service、End-point、Secret(主要是TLS證書和Key)、Node、ConfigMap的變化,解析Ingress定義的規則并負責將請求轉發到相應的后端Service。

                  這個Ingress Controller需要借助一些插件實現,比如最常用的NGINX Ingress Controller,而公有云廠商大都會自研網絡插件,說是自研,其實就是在托管的K8S集群上幫你實現了跟多插件的功能,這樣一來,大多云廠商的托管平臺就會出現兩種服務的暴露方式,一種是使用開源Ingress-controller插件

                  第二種是

                   這兩種模式云廠商給的區別都模棱兩可,通過使用大概總結如下:

                  1.Ingress-controller高可用:

                    1.ELB類型的高可用由廠商負責,因為會保證ELB的SLA

                    2.Nginx類型的controller需要自己保證高可用,可以使用node污點或者守護進程的方式

                  2.ELB和Service類型兼容:

                    1.ELB類型的ELB(有點繞)其實是七層的負載均衡,因為是直接調用Service,所以這種類型調用的Service需要是Nodeport或者Loadbalance類型,ClusterIp類型是不可以的

                    2.Nginx類型的ELB是四層的,它只需把請求透傳過來就可以,真正起作用的是部署的Nginx-Ingress,所以這種類型調用的service任何類型都可以

                  補充:華為的四層和七層的ELB都是一個服務,主要看你怎么用,而Azure的四層叫ALB,七層卻叫Application gateway,這可不是注冊API的那個服務,那個服務它叫API management service,真是馬虎不得啊,AWS七層的叫ALB,四層的叫ELB(是不有又漲知識了)

                  3.日志Log:

                    1.網安法最常見的兩個要求,日志保存六個月和保留訪問的源IP,ELB類型的主要日志都在PaaS級別的ELB服務,實現這兩個要求簡直小case

                    2.Nginx類型的就麻煩了,四層的負載均衡幾乎沒有有用的日志,而且它還會做NAT,使后端的應用捕獲不到源IP,所以你需要對它進行設置,而且這還不算完,你還要把這個源ip在集群安全組下放行,要不然根本進不來集群

                  補充:監控等metric指標同樣適用,根本區別就是PaaS服務和自建負載的區別

                  4.路由規則配置:

                     1.ELB類型的日志是很方便,但是配置規則就是基于ELB,不支持路由重定向

                     2.Nginx類型的就方便多了,你只要會配置Nginx.conf就可以了,nginx本身的那些規則都支持

                  5.其他區別:

                    1.ELB類型一個集群支持多個ELB實例,Nginx類型一個集群只支持一個ELB實例

                    2.ELB類型占用Master節點,不占用工作節點,Nginx類型占用Worker節點,需要Nginx組件運行成本

                    如果你使用主流公有云托管的K8S平臺,同時又要暴露你的服務,那你大概率會遇到同樣的問題,但是服務網格Istio使用Istio Gateway,可以理解它是Ingress的加強版,比如灰度發布的流量比例控制就是靠它實現的(有時間再細講,這都是后話了),K8S復雜又強大,這只是它的冰山一角,如果你管理的核心應用(幾千臺節點)正運行在K8S上,那你一定幸運的發現了很多細微的問題,時間總是把一部分人推向海邊,使他們成為最早看見太陽的那一批人。

                   

                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [公有云托管K8S的對外服務之Ingress]http://www.yachtsalesaustralia.com/tech/detail-275801.html

                  贊(1)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  掃一掃關注最新編程教程
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>