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

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

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

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

Ingress 控制器

如今,使用容器或 VM 時,配置 Web 伺服器或負載平衡器比應有的更困難。大多數 Web 伺服器配置文件非常相似。有些應用程式有一些奇怪的小怪癖,可能會造成一些麻煩,但在大多數情況下,您可以對它們應用相同的邏輯並實現所需的結果。在 Kubernetes 1.2 中,Ingress 資源體現了這個想法,而 Ingress 控制器旨在處理與特定「類別」Ingress 相關的所有怪癖(無論是負載平衡器的單一實例,還是提供 GSLB、CDN、DDoS 保護等的前端的更複雜設置)。Ingress 控制器是一個守護程序,部署為 Kubernetes Pod,它監控 ApiServer 的 /ingresses 端點,以獲取 Ingress 資源的更新。它的工作是滿足對 Ingress 的請求。

您的 Kubernetes 叢集必須恰好有一個支援 TLS 的 Ingress 控制器,才能使以下範例正常運作。如果您使用的是雲端提供商,請先檢查「kube-system」命名空間中是否有 Ingress 控制器 RC。如果沒有,您可以部署 nginx 控制器,或者用少於 100 行程式碼 編寫您自己的控制器

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

TLS 終止和 HTTP 負載平衡

由於 Ingress 跨越服務,因此它特別適合負載平衡和集中式安全配置。如果您熟悉 Go 程式設計語言,則 Ingress 就像您整個叢集的 net/http 的「伺服器」。以下範例向您展示如何配置 TLS 終止。處理 Ingress 流量時,負載平衡並非可選,因此僅創建物件就會配置負載平衡器。

首先建立一個測試服務。我們將為此範例運行一個簡單的回顯伺服器,以便您確切了解正在發生的事情。來源 在此

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

如果您使用的是雲端提供商,請確保您可以透過服務的節點埠從叢集外部訪問該服務。

$ 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