本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 和網路特別感興趣,您會對以下內容感興趣
- 我們的 網路 Slack 頻道
- 我們的 Kubernetes 網路特別興趣小組電子郵件列表
- 大數據「特別興趣小組」,每兩週下午 3 點 (太平洋時間 15:00) 在 SIG-Networking hangout 聚會
當然,有關該專案的更多資訊,請訪問 www.kubernetes.io