负载平衡“ Hello World” Kubernetes应用程序

时间:2020-02-23 11:37:07

标签: kubernetes kubernetes-ingress nginx-ingress

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

只需输入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个Pod在哪个IP上侦听,连接到它们以及一切正常。

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

我知道Kubernetes默认情况下仅提供NodePort服务,如果我想要负载均衡器,则需要类似Ingress的东西。我也知道像Ingress Nginx这样的简单反向代理是满足我需要的很好的实现。

但是,我阅读了很多教程,但是我很难理解如何配置它以实现所需。

到目前为止,我有以下代码: https://github.com/sasadangelo/k8s-cluster/tree/master/ingress

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

2 个答案:

答案 0 :(得分:2)

Kubernetes组件Kube Proxy通过iptables负载平衡在L4层提供负载平衡,因此使用ClusterIP类型服务本身可以在Pod之间获得负载平衡。但是使用clusterIP类型服务,您将无法从群集外部(即从浏览器)访问它。 Nodeport类型服务可通过kube代理在L4层进行负载平衡,从而从群集外部访问Pod。

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

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

.save_model()

在上面创建了入口后,您便为Pod拥有了一个ClusterIP类型的服务,该服务的名称Web暴露了端口8080,您应该可以访问它。

这里是doc,介绍了在Minikube上使用Nginx Ingress进行Hello World应用程序的操作,您也可以按照以下步骤在设置中使用Ingress。

答案 1 :(得分:0)

这是我为解决此问题而做的详细工作。首先,我安装了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

您可以看到code here

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