本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.2 和使用 Ingress 簡化高階網路

編者按:這是關於 Kubernetes 1.2 新功能的系列深度文章的第六篇
Ingress 目前處於 Beta 階段,並正在積極開發中。

預設情況下,在 Kubernetes 中,Service 和 Pod 的 IP 只能由叢集網路路由。所有到達邊緣路由器的流量都會被丟棄或轉發到其他地方。在 Kubernetes 1.2 中,我們對 Ingress 物件進行了改進,以簡化允許入站連線到達叢集服務。它可以配置為提供可從外部訪問的 URL、負載均衡流量、終止 SSL、提供基於名稱的虛擬主機等。

Ingress 控制器

如今,使用容器或虛擬機器,配置 Web 伺服器或負載均衡器比應有的更困難。大多數 Web 伺服器配置檔案都非常相似。有些應用程式有一些奇怪的小怪癖,這往往會使事情變得複雜,但在大多數情況下,您可以對它們應用相同的邏輯並實現所需的結果。在 Kubernetes 1.2 中,Ingress 資源體現了這一思想,Ingress 控制器旨在處理與特定 Ingress“類”相關的所有怪癖(無論是單個負載均衡器例項,還是更復雜的前端設定,提供 GSLB、CDN、DDoS 保護等)。Ingress 控制器是一個守護程序,作為 Kubernetes Pod 部署,它監視 ApiServer 的 /ingresses 端點,以獲取 Ingress 資源的更新。它的工作是滿足入站請求。

您的 Kubernetes 叢集必須有一個且只有一個支援 TLS 的 Ingress 控制器,才能使以下示例正常工作。如果您使用的是雲提供商,請首先檢查“kube-system”名稱空間中是否存在 Ingress 控制器 RC。如果沒有,您可以部署 nginx 控制器,或在不到 100 行程式碼內編寫您自己的控制器

請花一點時間檢視現有控制器(gce、nginx)的已知限制。

TLS 終止和 HTTP 負載均衡

由於 Ingress 跨越 Service,因此它特別適合負載均衡和集中式安全配置。如果您熟悉 Go 程式語言,Ingress 就像您整個叢集的 net/http 的“Server”。以下示例向您展示瞭如何配置 TLS 終止。當處理入站流量時,負載均衡不是可選的,因此簡單地建立物件將配置一個負載均衡器。

首先建立一個測試 Service。我們將在此示例中執行一個簡單的 echo 伺服器,以便您確切瞭解發生了什麼。原始碼在此處

$ kubectl run echoheaders   
--image=gcr.io/google\_containers/echoserver:1.3 --port=8080  
$ kubectl expose deployment echoheaders --target-port=8080   
--type=NodePort  

如果您是雲提供商,請確保您可以透過其節點埠從叢集外部訪問該 Service。

$ NODE_IP=$(kubectl get node `kubectl get po -l run=echoheaders 
--template '{{range .items}}{{.spec.nodeName}}{{end}}'` --template
'{{range $i, $n := .status.addresses}}{{if eq $n.type 
"ExternalIP"}}{{$n.address}}{{end}}{{end}}')
$ NODE_PORT=$(kubectl get svc echoheaders --template '{{range $i, $e 
:= .spec.ports}}{{$e.nodePort}}{{end}}')
$ curl $NODE_IP:$NODE_PORT

這是一個健全性檢查,以確保一切按預期工作。如果最後一步掛起,您可能需要一個防火牆規則

現在讓我們建立 TLS 金鑰

$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout   

/tmp/tls.key -out /tmp/tls.crt -subj "/CN=echoheaders/O=echoheaders"

$ echo "  
apiVersion: v1  
kind: Secret  
metadata:
  name: tls  
data:  
  tls.crt: `base64 -w 0 /tmp/tls.crt`  
  tls.key: `base64 -w 0 /tmp/tls.key`  
" | kubectl create -f   

以及 Ingress

$ echo "

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: test

spec:

  tls:

  - secretName: tls
  backend:  
    serviceName: echoheaders  
    servicePort: 8080  
" | kubectl create -f -  

您很快就會獲得一個負載均衡的 IP

$ kubectl get ing   
NAME      RULE      BACKEND            ADDRESS         AGE  
test      -         echoheaders:8080   130.X.X.X     4m  

如果您等到 Ingress 控制器將您的後端標記為健康,您應該會看到傳送到該 IP 地址上 :80 埠的請求被重定向到 :443 埠,並使用給定的 TLS 證書進行終止。

$ curl 130.X.X.X  
\<html\>  
\<head\>\<title\>301 Moved Permanently\</title\>\</head\>\<body bgcolor="white"\>\<center\>\<h1\>301 Moved Permanently\</h1\>\</center\>  
$ curl https://130.X.X.X -kCLIENT VALUES:client\_address=10.48.0.1command=GETreal path=/  


$ curl 130.X.X.X -Lk

CLIENT VALUES:client\_address=10.48.0.1command=GETreal path=/

未來的工作

您可以透過以下連結閱讀有關 Ingress API 或控制器的更多資訊。Ingress 仍處於 Beta 階段,我們非常希望您的意見來使其發展。您可以透過編寫控制器或改進 API 來做出貢獻。所有與“ingress”一詞含義相關的事物都在討論範圍之內,這包括 DNS、不同的 TLS 模式、SNI、第 4 層負載均衡、內容快取、更多演算法、更好的健康檢查;清單還在繼續。

有許多參與方式。如果您對 Kubernetes 和網路特別感興趣,您會對以下內容感興趣

當然,有關該專案的更多資訊,請訪問www.kubernetes.io