經過集羣的內部 IP 暴露服務,選擇該值,服務只可以在集羣內部能夠訪問,這也是默認的 ServiceType。javascript
經過每一個 Node 上的 IP 和靜態端口(NodePort)暴露服務。 NodePort 服務會路由到 ClusterIP 服務,這個 ClusterIP 服務會自動建立。 經過請求
使用雲提供商的負載局衡器,能夠向外部暴露服務。 外部的負載均衡器能夠路由到 NodePort 服務和 ClusterIP 服務。node
經過返回 CNAME 和它的值,能夠將服務映射到 externalName 字段的內容(例如, foo.bar.example.com)。 沒有任何類型代理被建立。本文暫不討論這種類型。nginx
參考文檔:https://cloud.tencent.com/document/product/457/45487後端
騰訊雲容器服務(Tencent Kubernetes Engine ,TKE)基於原生 Kubernetes 提供以容器爲核心的、高度可擴展的高性能容器管理服務,徹底兼容原生 Kubernetes API ,同時擴展了騰訊雲的雲硬盤、負載均衡等 kubernetes 插件,爲容器化的應用提供高效部署、資源調度、服務發現和動態伸縮等一系列完整功能,解決用戶開發、測試及運維過程的環境一致性問題,提升了大規模容器集羣管理的便捷性,幫助用戶下降成本,提升效率。安全
TKE 上默認使用 service-controller 來管理 CLB 上四層監聽器和規則。這種方式, CLB 後端綁定每一個節點的 NodePort,CLB 接收外界流量,轉發到其中一個節點的 NodePort 上,再經過 Kubernetes 內部的負載均衡,使用 iptables 或 ipvs 轉發到 Pod。網絡
請求細節過程:負載均衡
實現結果以下圖:運維
參考文檔:https://cloud.tencent.com/document/product/457/45487ide
TKE 上默認使用 l7-lb-controller 做爲 Ingress 控制器,它會管理 CLB 上七層監聽器和規則。實現原理和請求細節同四層實現,可是在 CLB 層面會根據域名和 URL 來轉發到不一樣的後端 service,同時能夠進行 SSL 卸載。
實現細節:
使用 TKE 默認自帶的 Ingress,會爲每一個 Ingress 資源建立一個 CLB 以及 80,443 的 7 層監聽器規則(HTTP/HTTPS),併爲 Ingress 每一個 location 綁定對應 TKE 各個節點某個相同的 NodePort 做爲 rs (每一個 location 對應一個 Service,每一個 Service 都經過各個節點的某個相同 NodePort 暴露流量),CLB 根據請求匹配 location 轉發到相應的 rs (即 NodePort),流量到了 NodePort 後會再通過 K8S 的 iptables 或 ipvs 轉發給對應的後端 Pod。
實現結果以下圖:
TKE 一般用的 Global Router 網絡模式(網橋方案),還有一種是 VPC-CNI(彈性網卡方案)。VPC-CNI 是 TKE 上一種新的網絡模式,爲每一個 Pod 分配一個 ENI 彈性網卡的 EIP,Pod 間直接經過彈性網卡通訊。能夠理解爲:給每一個 Pod 分配了一個內網 IP。
優勢:每一個 Pod 均可以有內網 IP
缺點:須要分配一個單獨的空閒子網
參考文檔:https://cloud.tencent.com/document/product/457/41636
TKE 的 CLB 默認綁定的都是 node 的 IP 和端口,在使用了 VPC-CNI 給 Pod 提供獨立內網 IP 以後,CLB 能夠直接綁定 Pod。
請求細節過程:
參考文檔:https://cloud.tencent.com/document/product/457/41897
參考文檔:https://mp.weixin.qq.com/s/fJtlm5Qjm2BfzekC4RegCQ
實現結果以下圖,注意圖中的 ENI 彈性網卡和 Pod 的實際端口80:
先建立 CLB
在 service 的 annotations 添加:
service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx
參考文檔:https://cloud.tencent.com/document/product/457/45491
能夠經過指定使用已有內網負載均衡器實現。
也能夠經過如下方式動態建立:
在 service 的 annotations 添加:
service.kubernetes.io/qcloud-loadbalancer-internal-subnetid: subnet-xxxxxx # value 替換爲集羣所在 vpc 的其中一個子網 id
當 TKE 的默認 Ingress 實現(CLB 的7層規則)沒法知足業務需求時,能夠額外部署 Nginx Ingress(通常都用不上)
參考文檔:https://cloud.tencent.com/document/product/457/47293
【優先】四層協議:
七層協議:
在集羣內使用內網 CLB 須要注意迴環問題,故不推薦集羣內使用內網 CLB。
建議生產環境均使用已有 CLB,即先手動建立 CLB,再在相關 Service 或 Ingress 指定 CLB 的 id。
TKE 默認控制器在 Service 使用以下配置:
service.kubernetes.io/tke-existed-lbid: lb-6swtxxxx
同時 CLB 開啓「啓用默認放通」,CLB 和 CVM 之間默認放通,則不用根據 NodePort 調整 CVM 上的安全組,以下圖:
【優先】七層協議:
四層協議:
使用Istio:
Istio 有點相似於 Nginx Ingress,都是先 CLB 四層監聽器轉發到 NodePort,再經過 istio-ingressgateway 這個 service 定義的規則,轉發到 istio-ingressgateway-xx 這個 Pod,再轉發到集羣內其餘 Istio Sidecar。
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公衆號,及時獲取更多幹貨!!