Ingress对象
一,Ingress的意义
- k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
- 给公网用户提供一个访问的统一入口(80/443),特别是针对service nodeport
- 基于service提供服务,是一种集群中全局的负载均衡器,给集群内提供访问统一入口 可以根据域名、URL转发给不同的Service
二,Ingress Controller
根据Ingress生成具体的路由规则,对Pod提供负载均衡器
测试时,ingress-controller副本数为1时,域名解析必须绑定在pod所在的宿主机上
三,Ingress两种方式
3.1,Service NodePort访问Ingress Controller ( 默认方式)
user ->公网负载均衡器(80)-> service nodeport(80:32287/TCP,443:31474/TCP)- >iptables/ipvs - > Ingress controller pod(nginx,基于域名分流)-> 节点上的pod
3.2,hostNetwork访问Ingress Controller
每一个node节点只能跑一个pod(80端口不能冲突)
user通过80端口访问 ->公网负载均衡器(80)-> 宿主机80端口(Ingress Controller中的nginx) -> Ingress Controller pod (nginx,基于域名分流) -> 节点上的pod
默认为service模式,修改方式:
修改ingress-controller.xx.yaml
spec:
dnsPolicy: ClusterFirst
hostNetwork: True #添加此项
四,Ingress基于域名暴露服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web #创建的ingress名称
spec:
ingressClassName: "nginx"
rules:
- host: web1.ale.com #绑定的域名
http:
paths:
- path: / #默认转变路径,网站根目录
pathType: Prefix
backend:
service:
name: web #绑定的service
port:
number: 80
五,Ingress基于URL路由多个服务
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web2
spec:
ingressClassName: "nginx"
rules:
- host: web2.ale.com
http:
paths:
- path: /foo #访问时加的url
pathType: Prefix
backend:
service:
name: web #访问转发的service名称
port:
number: 80
- path: /bar #访问时加的url
pathType: Prefix
backend:
service:
name: web2 #访问转发的service名称
port:
number: 80
hostNetwork http访问:http://web2.ale.com/bar/ http://web2.ale.com/foo/
hostNetwork https访问:https://web2.ale.com/bar/ https://web2.ale.com/foo/
六,Ingress基于名称虚拟主机
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web3
spec:
ingressClassName: "nginx"
rules:
- host: web3-1.ale.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
- host: web3-2.ale.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web2
port:
number: 80
七,Ingress Https
7.1,将ssl证书保存到k8s中
kubectl create secret tls ale-cn --cert=www.ale.cn.pem --key=www.ale.cn-key.pem
7.2,创建ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ale
spec:
tls:
- hosts:
- www.ale.cn
secretName: ale-cn #保存在k8s中的证书名称
ingressClassName: "nginx"
rules:
- host: www.ale.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
nodeport访问时加的是ingress svc暴露的nodeport端口
http访问:http://www.ale.cn:30375/
https访问:https://www.ale.cn:32376/
八,对单个ingress的nginx server模块配置参数
metadate:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: 'false' #默认http会自动转https,false关闭
nginx.ingress.kubernetes.io/rewrite-target: /foo/index.html #访问/path路径的时候,重定向到此处路径,可以写其他站点/域名
nginx.ingress.kubernetes.io/proxy-body-size: "10m" #设置客户端上传文件大小10M
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/server-snippet: |
if ($http_user_agent ~* '(Android|iPhone)') {
rewrite ^/(.*) http://m.baidu.com break;
} #自定义规则格式
spec:
ingressClassName: "nginx"
tls:
- hosts:
- www.ale.cn
secretName: ale-cn
rules:
- host: www.ale.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80
九,ingress多节点高可用
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
helm.sh/chart: ingress-nginx-4.0.10
spec:
dnsPolicy: ClusterFirst
nodeSelector:
ingress: true