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