负载平衡 "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 的帮助。
为了开始使用 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 的帮助。