k8s-ingress
文档
文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#terminology
说明
service对集群之外暴露服务的主要方式有两种:NotePort和LoadBalancer,但是这两种方式,都有一定的缺点:
NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就愈发明显
LB方式的缺点是每个service需要一个LB,浪费、麻烦,并且需要kubernetes之外设备的支持
基于这种现状,kubernetes提供了Ingress资源对象,Ingress只需要一个NodePort或者一个LB就可以满足暴露多个Service的需求。工作机制大致如下图表示:
实际上,Ingress相当于一个7层的负载均衡器,是kubernetes对反向代理的一个抽象,它的工作原理类似于Nginx,可以理解成在Ingress里建立诸多映射规则,Ingress Controller通过监听这些配置规则并转化成Nginx的反向代理配置 , 然后对外部提供服务。在这里有两个核心概念:
ingress:kubernetes中的一个对象,作用是定义请求如何转发到service的规则
ingress controller:具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发,实现方式有很多,比如Nginx, Contour, Haproxy等等
Ingress(以Nginx为例)的工作原理如下:
1.用户编写Ingress规则,说明哪个域名对应kubernetes集群中的哪个Service
2.Ingress控制器动态感知Ingress服务规则的变化,然后生成一段对应的Nginx反向代理配置
3,Ingress控制器会将生成的Nginx配置写入到一个运行着的Nginx服务中,并动态更新
到此为止,其实真正在工作的就是一个Nginx了,内部配置了用户定义的请求转发规则
ingress的作用
再k8s里面充当了nginx的作用 ingress是一种抽象 而不是具体实现,具体实现再控制器
安装ingress控制器
针对nginx控制器,本质也是使用nginx
配置模版
apiVersion: networking.k8s.io/v1 # 使用的Kubernetes API版本 kind: Ingress # 定义Ingress资源 metadata: # 元数据 name: test-order # Ingress的名称 namespace: %NAMESPACE% # Ingress所在的命名空间 annotations: # 注解 kubernetes.io/ingress.class: nginx # 使用nginx作为ingress controller nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, PATCH, OPTIONS, DELETE # 允许的CORS请求方法 nginx.ingress.kubernetes.io/server-snippet: | # 自定义nginx配置 set $corsHost ''; # 设置变量corsHost为空 if ($http_origin ~* '^https?:\/\/(.*\.)?(lqimg|sunlogin\.lq)\.com$') { # 如果请求origin匹配特定正则表达式 set $corsHost $http_origin; # 设置corsHost为请求origin } if ($http_origin = 'null' ) { # 如果请求origin为null set $corsHost $http_origin; # 设置corsHost为请求origin } add_header 'Access-Control-Allow-Credentials' 'true' always; # 添加Access-Control-Allow-Credentials头部 add_header 'Access-Control-Allow-Origin' "$corsHost" always; # 添加Access-Control-Allow-Origin头部 add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS' always; # 添加Access-Control-Allow-Methods头部 add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-ClientID,ns,Content-Length,Cookie,ex-clientid' always; # 添加Access-Control-Allow-Headers头部 nginx.ingress.kubernetes.io/service-weight: "" # 设置服务权重为空 nginx.ingress.kubernetes.io/proxy-body-size: 40m # 设置代理请求体大小为40m spec: # Ingress规格 rules: # 规则 - host: webapi.test.com # 匹配的主机名 http: # HTTP配置 paths: # 路径 - path: /order # 匹配的路径 pathType: ImplementationSpecific # 路径类型 backend: # 后端服务 service: name: test-order # 后端服务的名称 port: number: 8000 # 后端服务的端口号 - path: /order-upgrade # 匹配的路径 pathType: ImplementationSpecific # 路径类型 backend: # 后端服务 service: name: test-order # 后端服务的名称 port: number: 8000 # 后端服务的端口号 - path: /order-limit # 匹配的路径 pathType: ImplementationSpecific # 路径类型 backend: # 后端服务 service: name: test-order # 后端服务的名称 port: number: 8000 # 后端服务的端口号 tls: # TLS配置 - hosts: - webapi.test.com # 匹配的主机名 secretName: secret-api-tls # 使用的TLS密钥的名称 - hosts: - api-std.test.com # 匹配的主机名 secretName: secret-api-tls # 使用的TLS密钥的名称 - hosts: - api-adv.test.com # 匹配的主机名 secretName: secret-api-t
创建ingress
kubectl create -f {Igressname}.yaml
2.创建并覆盖,如果存在则覆盖
kubectl apply -f {Igressname}.yaml
获取ingress
kubectl get ingress
查看详情
kubectl describe ing ingress-https -n dev
生产例子
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, PATCH, OPTIONS, DELETE nginx.ingress.kubernetes.io/server-snippet: | set $corsHost ''; if ($http_origin ~* '^https?:\/\/(.*\.)?(lqimg|lq\.lqbeta)\.com$') {//来源域名为lq.lqbeat.com的子域名时则允许跨域 set $corsHost $http_origin; } if ($http_origin = 'null' ) {//没有来源域名 set $corsHost $http_origin; } add_header 'Access-Control-Allow-Credentials' 'true' always; add_header 'Access-Control-Allow-Origin' "$corsHost" always; //允许跨域 add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, PATCH, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-ClientID,ns,Content-Length,Cookie,ex-clientid' always; if ($request_method = 'OPTIONS') { return 204; } add_header 'Access-Control-Expose-Headers' 'content-length, content-range'; add_header 'X-Test-Custom' 'test'; location '/WW_verify_jws0Bd5NYcaq1wiE.txt' { return 200 'jws0Bd5NYcaq1wiE'; } location ^~/passport/verify { proxy_pass http://slapi-internal.lq.net; } location ^~/passport/send-verify-code { proxy_pass http://slapi-internal.lq.net; } nginx.ingress.kubernetes.io/service-weight: "" nginx.ingress.kubernetes.io/proxy-body-size: 300m #body限制300m name: sunlogin-storage namespace: sunlogin spec: rules: - host: filetransfer.lq.lqbeta.com http: paths: - backend: service: name: sunlogin-storage port: number: 8000 path: /upload pathType: ImplementationSpecific tls: - hosts: - filetransfer.lq.lqbeta.com secretName: lq.lqbeta.com-crt