簡體   English   中英

負載平衡“Hello World”Kubernetes 應用程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM