目录
上传并更改ingress-nginx的配置文件
#>>> 拉取ingress-nginx的yaml文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
#>>> 配置文件要修改的部分我会打上标记
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.3.0
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
replicas: 2 #这里增加pod的副本
minReadySeconds: 0
revisionHistoryLimit: 10
#>>> 来到Deployment的Service
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/component: controller
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
app.kubernetes.io/version: 1.3.0
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
externalTrafficPolicy: Cluster #这里改成Cluster!!!
image:复制粘贴即可
anjia0532/google-containers.ingress-nginx.controller:v1.3.0
anjia0532/google-containers.ingress-nginx.kube-webhook-certgen:v1.1.1
externalTrafficPolicy的意思是流量策略。默认这里是Local,意思是只有拥有这个pod的节点才能访问,其他节点一律不会有LVS去帮你转发过去。Cluster意思是所有节点都可以访问你的pod。
配置成Cluster主要是因为我的metallb用的是layer2的方式,这个方式下它不会正确帮我代理到能响应pod的节点上,所有的请求都流入leader节点,在由leader节点转发,如果我的leader节点没有LVS的转发那么这个请求失败。
所以我让策略变成Cluster,所有节点都存在着LVS代理到pod后端的IP,不用管leader到底是在哪个节点。但是这种方式会让集群内部多上多层转发。
创建测试pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc
spec:
ports:
- protocol: TCP
port: 80
selector:
app: nginx
创建ingress
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-app-ingress
annotations:
kubernetes.io/ingress.class: "nginx" #指定ingress-controller的类名
spec:
rules:
- host: www.aaa.com #外部访问域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-app-svc #绑定前面的service
port:
number: 80
查看LoadBalancer的EXTERNAL-IP
自己在/etc/hosts文件中将你的EXTERNAL-IP和前面的访问域名做解析
测试
总结
整体的架构呢是nginx-ingress的service的LoadBalancerIP去代理到我的nginx-ingress-controller的两个pod。ingress-nginx内部的配置文件呢会设置代理到我测试pod的service后端。
截图为证,这是lvs配置后端是controller的两个pod IP
kubectl exec -it -n ingress-nginx <you-controller-name> -- cat /etc/nginx/nginx.conf | grep -B 5 <you-test-pod-service-name>
运行上面的命令即可