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

 

posted @ 2023-12-13 16:50  意犹未尽  阅读(30)  评论(0编辑  收藏  举报