负载平衡 "Hello World" Kubernetes 应用程序

Load Balancing "Hello World" Kubernetes application

为了开始使用 Kubernetes,我创建了一个小项目,我在本地机器上使用 Vagrant 和 Vbox 创建了一个三节点集群: https://github.com/sasadangelo/k8s-cluster

只需输入 vagrant up 我的集群就启动了 运行 我可以开始使用它了。我熟悉了主要概念和命令,并创建了一个简单的 "Hello World" 应用程序,该应用程序由一个 docker 图像和一个 NGINX 网络服务器组成,您可以在其中通过浏览器连接,并且 "Hello World" 消息随主机名。主机名帮助我了解哪个 Pod 响应了我的请求。

这里是项目: https://github.com/sasadangelo/k8s-tutorials/tree/master/hello-k8s

目前,我可以使用 kubectl create 创建部署,使用 kubectl expose 将其公开为服务,然后使用 kubect scale 增加副本。目前,我可以使用 NodePort 服务,所以通过 kubectl describe service 我可以看到 5 Pods 监听哪个 IP,我连接到它们并且一切正常。

我的问题是现在我想对流量进行负载平衡。 我想连接到一个 IP,当我点击浏览器的重新加载按钮时,我想看到不同的 Pod 名称出现。

我知道 Kubernetes 默认情况下只提供 NodePort 服务,如果我想要一个负载均衡器,我需要 Ingress 之类的东西。我也知道像 Ingress Nginx 这样的简单反向代理可以很好地满足我的需求。

然而,我阅读了很多教程,但我很难理解我应该如何配置它来实现我需要的。

这里是我目前的代码: https://github.com/sasadangelo/k8s-cluster/tree/master/ingress

任何人都可以帮助我如何修复 Ingress 代码以实现我所需要的吗?

Kube Proxy 是一个 kubernetes 组件,通过 iptables load balancing.So 在 L4 层提供负载平衡,使用 ClusterIP 类型服务本身,您可以在 pods 之间实现负载平衡。但是对于 clusterIP 类型的服务,您无法从集群外部访问它,即从浏览器访问它。 Nodeport 类型的服务通过 kube 代理在 L4 层提供负载平衡从集群外部访问 pods。

LoadBalancer 和 Ingress 在 L7 层提供负载平衡和基于规则的路由,如果您正在寻找的话。

查看您的代码,您有用于 nginx 入口控制器的 yaml 并将其公开为 Nodeport。接下来您需要创建一个入口资源

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /
        backend:
          serviceName: web
          servicePort: 8080

一旦你创建了上面的入口并且你的 pod 有了一个名为 web 的 ClusterIP 类型的服务,它暴露了端口 8080,你应该能够访问它。

这里是 doc 关于在 Minikube 上将 nginx ingress 用于 hello world 应用程序的信息,您也可以按照它在您的设置中使 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: /
spec:
  rules:
    - host: hello-k8s.info
      http:
      paths:
    - path: /
      backend:
        serviceName: hello-k8s
        servicePort: 80

并使用命令安装它:

kubectl apply -f ingress-nginx.yaml

可以看到code here.

在集群内部(在任何节点上执行 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 的帮助。