Kubernetes、负载均衡和 Nginx Ingress - AKS
Kubernetes, Loadbalancing, and Nginx Ingress - AKS
堆栈:
Azure Kubernetes 服务
NGINX 入口控制器 - https://github.com/kubernetes/ingress-nginx
AKS 负载均衡器
Docker 个容器
我的目标是创建一个 K8s 集群,允许我在单个 IP 下使用多个 pods,以创建微服务架构。在处理了大量的教程和文档之后,我的最终目标并没有运气。我已经到了可以使用 Loadbalancer 访问单个部署的地步,但是到目前为止引入入口还没有成功。这些服务被分成各自的文件,以便于阅读和控制。
此外,Ingress Controller 已按照安装说明中的说明添加到我的集群中,使用:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/cloud/deploy.yaml
LoadBalancer.yml:
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
loadBalancerIP: x.x.x.x
selector:
app: ingress-service
tier: backend
ports:
- name: "default"
port: 80
targetPort: 80
type: LoadBalancer
IngressService.yml:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /api
backend:
serviceName: api-service
servicePort: 80
api-deployment.yml
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
selector:
matchLabels:
app: api
tier: backend
track: stable
replicas: 1
template:
metadata:
labels:
app: api
tier: backend
track: stable
spec:
containers:
- name: api
image: image:tag
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: SECRET
图中的API正确暴露在80端口
应用上述每个 yml 服务和部署后,我尝试通过 LoadBalancer 的 IP 向 api 资源之一发出 Web 请求,但我的请求仅收到超时。
四处寻找后找到了我的答案。基本上,问题是 Ingress Controller 在 yaml 中内置了一个负载均衡器,如上面的评论所述。但是,该 LoadBalancer 的选择器需要将您的 Ingress 服务标记为 class 的一部分。然后 Ingress 服务指向附加到您的 pods 的每个服务。我还必须进行一些小修改,以允许在提供的负载均衡器中使用静态 IP。
堆栈:
Azure Kubernetes 服务
NGINX 入口控制器 - https://github.com/kubernetes/ingress-nginx
AKS 负载均衡器
Docker 个容器
我的目标是创建一个 K8s 集群,允许我在单个 IP 下使用多个 pods,以创建微服务架构。在处理了大量的教程和文档之后,我的最终目标并没有运气。我已经到了可以使用 Loadbalancer 访问单个部署的地步,但是到目前为止引入入口还没有成功。这些服务被分成各自的文件,以便于阅读和控制。
此外,Ingress Controller 已按照安装说明中的说明添加到我的集群中,使用:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/cloud/deploy.yaml
LoadBalancer.yml:
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
loadBalancerIP: x.x.x.x
selector:
app: ingress-service
tier: backend
ports:
- name: "default"
port: 80
targetPort: 80
type: LoadBalancer
IngressService.yml:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-service
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /api
backend:
serviceName: api-service
servicePort: 80
api-deployment.yml
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
selector:
app: api
ports:
- port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
selector:
matchLabels:
app: api
tier: backend
track: stable
replicas: 1
template:
metadata:
labels:
app: api
tier: backend
track: stable
spec:
containers:
- name: api
image: image:tag
ports:
- containerPort: 80
imagePullPolicy: Always
imagePullSecrets:
- name: SECRET
图中的API正确暴露在80端口
应用上述每个 yml 服务和部署后,我尝试通过 LoadBalancer 的 IP 向 api 资源之一发出 Web 请求,但我的请求仅收到超时。
四处寻找后找到了我的答案。基本上,问题是 Ingress Controller 在 yaml 中内置了一个负载均衡器,如上面的评论所述。但是,该 LoadBalancer 的选择器需要将您的 Ingress 服务标记为 class 的一部分。然后 Ingress 服务指向附加到您的 pods 的每个服务。我还必须进行一些小修改,以允许在提供的负载均衡器中使用静态 IP。