集群內訪問
假設我們在一個K8S的集群里面發布了兩個應用,前端應用frontend和后端應用backend,前端應用要訪問后端應用,那么有以下兩種方式。
使用應用名進行訪問
假設在K8S集群中發布的后端應用的名稱為backend,它監聽8080端口,那么在前端應用的容器中,可以直接使用后端應用的名稱加端口
//backend:8080 進行訪問,K8S會自動轉發到后端的某個容器實例。如下所示:

注意,上面的轉發其實是四層轉發,即如果后端應用是mysql類型的,可使用tcp://backend:8080進行訪問,如果后端應用為web應用,可使用 //backend:8080進行訪問。
另外,上面的訪問方式要求前端應用和后端應用要在K8S集群的同一個命名空間內。如果二者不在同一個命名空間,比如后端應用在命名空間ns2中,那么前端應用應該使用 //backend.ns2:8080 進行訪問(即應用名后面要加上命名空間)
使用微服務架構自己的注冊機制
如果業務開發者使用的微服務架構有注冊機制,那么可以直接使用微服務框架的注冊機制來做負載均衡。如下:

后端應用容器實例把自己的IP與端口注冊到zookeeper或eureka,前端應用容器實例去注冊中心獲取后端應用的實例列表,然后前端應用的實例自己決定訪問哪一個實例。
注冊中心zookeeper/eureka集群可以部署在K8S集群內,也可以部署在集群外,這個需要業務方自己去部署。
集群外訪問
假設我們要從瀏覽器上訪問上面的前端應用,下面我們來介紹幾種方法:
NodePort
最簡單的方法就是使用NodePort。我們只需要為前端應用在K8S集群中創建一個Service對象,在這個對象中指定一個主機端口比如為30000,那么,每臺主機上的kube-proxy(部署K8S集群時已部署好)便會監聽30000端口。當訪問主機的30000端口時,kube-proxy便會轉發到前端應用的容器實例去。如下:

由于容器在K8S集群的Master主機上安裝了keepalived,綁定了一個VIP,所以我們可以通過//vip:30000來訪問,保證了訪問入口的高可用。
NodePort+Nginx
在上面的NodePort方案中,kube-proxy處是沒有辦法設置HTTPS證書的,所以上面的方案只支持HTTP,不支持HTTPS。
如果要支持HTTPS,則需要在kube-proxy的前面手動搭建Nginx集群,在Nginx處手動配置HTTPS證書,手動配置轉發規則;兩個Nginx主機上還要安裝Keepalived綁定一個VIP,以保證高可用。如下:

上面的Nginx可以搭建在K8S集群的外面,也可以搭建在K8S集群的主機上(是物理部署在主機上,不是部署在容器內),但不要部署在K8S集群的Master主機上,因為Master主機上已經部署了keepalived,以免和Nginx的keepliaved沖突。
NodePort+LVS
NodePort的方案中,VIP只在一臺主機上,可能承受不了大流量的訪問。此時,我們可以在NodePort的前面手動搭建LVS,如下:

LVS需要手動搭建,LVS主機上還要安裝keepalived綁定VIP以保證入口的高可用;LVS配置DR模式轉發到多臺K8S主機上;kube-proxy處每開放一個主機端口,在LVS處也需要配置這個端口;該方案不支持HTTPS,因為LVS處是四層轉發,不支持配置HTTPS。
NodePort+Nginx+LVS
如果流量大,還需要支持HTTPS,則需要使用該種方案。
在kube-proxy的前面手動搭建Nginx,在Nginx的前面手動搭建LVS,如下:

LVS需要手動安裝,同時需要安裝keepalived綁定VIP,以保證訪問入口的高可用; Nginx需要手動安裝,手動配置HTTPS證書 ;LVS處只需要配置一個端口,轉發到Nginx的同端口;Nginx只需要監聽一個端口,通過不同的域名,轉發到kube-proxy上不同的端口;kube-proxy根據不同的端口,轉發到的集群內的不同的應用。
Ingress
Ingress是一種不同于NodePort的方案,如下:

IngressController只監聽一個端口,通過不同的域名轉發到K8S集群中不同的應用;所以該方案只支持域名訪問,不支持IP訪問。
只有K8S的Master主機上才會有IngressController,Master主機上已經有VIP,所以DNS服務器把域名解析為VIP,即可保證入口的高可用。
在云容器引擎管理臺頁面上,通過為應用創建不同的Ingress對象,來為不同的應用指定不同的域名。
IngressController目前不支持配置HTTPS證書,后續會支持。所以該方案目前不支持HTTPS,只支持HTTP。
Ingress+LVS
上面的Ingress方案,由于VIP只在一臺主機上,所以不適合大訪問量的場景。如果訪問量較大,可以使用Ingress+LVS,如下:

LVS需要手動安裝與配置,LVS主機上需要安裝keepalived綁定VIP以保證入口高可用 。LVS只需要監聽一個端口(IngressController監聽的端口) 。瀏覽器通過域名訪問,DNS服務器把域名解析為LVS的VIP,LVS把請求轉給其中某個IngressController,IngressController通過域名轉發到不同的集群內的應用。該方案與上面方案一樣,目前不支持HTTPS,后續會支持。
對比:
| 方案 | 四層或七層轉發 | 支持高可用 | 支持HTTPS | 優缺點 | 適用場景 |
|---|---|---|---|---|---|
| NodePort | 四層 | 是 | 否 | 優點:使用簡單,無須額外配置 | TCP或HTTP服務、訪問量不大 |
| NodePort+Nginx | 七層 | 是 | 是 | 缺點:需要額外手動部署與配置Nginx | HTTPS服務,訪問量不大 |
| NodePort+LVS | 四層 | 是 | 否 | 缺點:需要額外手動部署與配置LVS | TCP或HTTP服務,訪問量大 |
| NodePort+Nginx+LVS | 七層 | 是 | 是 | 缺點:需要額外手動部署與配置Nginx和LVS | HTTPS服務,訪問量大 |
| Ingress | 七層 | 是 | 當前不支持,后續會支持 | 優點:使用簡單;缺點:只支持域名訪問,不支持IP訪問,需要自行配置DNS服務器 | HTTP服務(后續支持HTTPS服務),訪問量不大 |
| Ingress+LVS | 七層 | 是 | 當前不支持,后續會支持 | 缺點:需要額外部署LVS,只支持域名訪問,不支持IP訪問,需自行配置DNS服務器 | HTTP服務(后續支持HTTPS服務),訪問量大 |