[英]Load Balancing "Hello World" Kubernetes application
為了開始使用 Kubernetes,我創建了一個小項目,我在本地機器上使用 Vagrant 和 Vbox 創建了一個三節點集群: https : //github.com/sasadangelo/k8s-cluster
只需vagrant up
我的集群上輸入vagrant up
即可啟動並運行,我可以開始使用它了。 我熟悉了主要概念和命令,並創建了一個簡單的“Hello World”應用程序,該應用程序由帶有 NGINX Web 服務器的 docker 圖像組成,您可以在其中通過瀏覽器連接,並且會顯示帶有主機名的“Hello World”消息。 主機名幫助我了解哪個 Pod 響應了我的請求。
這里的項目: https : //github.com/sasadangelo/k8s-tutorials/tree/master/hello-k8s
目前,我可以使用kubectl create
創建一個部署,將其作為服務使用kubectl expose
,然后使用kubect scale
增加副本。 目前,我可以使用 NodePort 服務,因此通過kubectl describe service
我可以看到 5 個kubectl describe service
在哪個 IP 上監聽,我連接到它們,一切正常。
我的問題是現在我想對流量進行負載平衡。 我想連接到單個 IP ,只要我點擊瀏覽器重新加載按鈕,我就想看到不同的 Pod 名稱出現。
我知道 Kubernetes 默認只提供 NodePort 服務,如果我想要一個負載均衡器,我需要像 Ingress 這樣的東西。 我也知道像 Ingress Nginx 這樣的簡單反向代理是滿足我需求的一個很好的實現。
但是,我閱讀了很多教程,但我很難理解應該如何配置它以實現我的需要。
這是我到目前為止的代碼: https : //github.com/sasadangelo/k8s-cluster/tree/master/ingress
任何人都可以幫助我如何修復 Ingress 代碼以實現我的需要?
Kube Proxy 是一個 kubernetes 組件,通過 iptables 負載均衡在 L4 層提供負載均衡。因此,通過 ClusterIP 類型的服務本身,您可以在 Pod 之間實現負載均衡。 但是對於 clusterIP 類型的服務,您無法從集群外部(即從瀏覽器)訪問它。 Nodeport 類型的服務通過 kube 代理在 L4 層提供負載平衡從集群外部訪問 pod。
LoadBalancer 和 Ingress 在 L7 層提供負載平衡和基於規則的路由,如果這正是您所需要的。
查看您的代碼,您有 yamls 用於 nginx 入口控制器並將其公開為 Nodeport。 接下來你需要的是創建一個入口資源
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-world.info
http:
paths:
- path: /
backend:
serviceName: web
servicePort: 8080
一旦你在上面創建了入口,並且你的 pod 有一個名為 web 的 ClusterIP 類型服務,它暴露了端口 8080,你應該能夠訪問它。
這是關於在 Minikube 上為 hello world 應用程序使用 nginx ingress 的文檔,您可以按照該文檔使 ingress 在您的設置中工作。
這是我為解決該問題所做的詳細工作。 首先,我安裝了 Nginx Ingress 資源:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
然后我在ingress-nginx.yaml
文件中創建一個 Nginx Ingress 資源:
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: hello-k8s-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello-k8s.info
http:
paths:
- path: /
backend:
serviceName: hello-k8s
servicePort: 80
並使用以下命令安裝它:
kubectl apply -f ingress-nginx.yaml
在集群內部(在任何節點上執行 vagrant ssh)我測試過:
curl -H "Host: hello-k8s.info" IP
從命令中獲取 IP 的位置:
kubectl get ingress
假設它是10.97.139.101
。 在集群之外,在我的 Mac 上(在 Mac 上的 3 VirtualBox 上運行)訪問我需要添加路由的應用程序:
sudo route add -net 10.97.0.0/16 192.168.205.10
其中 192.168.205.10 是主節點的 IP。 在/etc/hosts
我添加了以下行:
10.97.139.101 hello-k8s.info
現在在瀏覽器中輸入 hello-k8s.info 我看到“Hello World”網頁出現。 感謝 Arghya Sadhu 的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.