九、K8S之Ingress

Ingress

一、Ingress 概念

Ingress提供从集群外部到集群内服务的Http路由,流量路由由 Ingress 资源所定义的规则来控制。通过配置,Ingress可为Service提供外部可访问的URL,对其流量作负载均衡,代理转发。Ingress 的使用可以大大简化应用程序的网络配置和流量路由,并且提供了灵活的路由规则和流量控制功能。

要使用Ingress,需要安装并且配置Ingress控制器。控制器通常是一个负载均衡器,它监听Ingress对象变化,并动态地更新流量路由规则。K8S支持多种Ingress控制器,例如:Nginx、Traefik和HAProxy等。

二、Ingress-nginx概念

为了使得Nginx Ingress资源正常工作,集群中必须要有个Nginx Ingress Controller来解析Nginx Ingress的转发规则。Nginx Ingress Controller收到请求,匹配Nginx Ingress转发规则转发到后端Service所对应的Pod。Kubernetes中Service、Nginx Ingress与Nginx Ingress Controller有着以下关系:

  • Service是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。

  • Nginx Ingress是反向代理规则,用来规定HTTP/HTTPS请求应该被转发到哪个Service所对应的Pod上。例如根据请求中不同的Host和URL路径,让请求落到不同Service所对应的Pod上。

  • Nginx Ingress Controller是一个反向代理程序,负责解析Nginx Ingress的反向代理规则。如果Nginx Ingress有增删改的变动,Nginx Ingress Controller会及时更新自己相应的转发规则,当Nginx Ingress Controller收到请求后就会根据这些规则将请求转发到对应Service的Pod上。

三、安装 Ingress-nginx

3.1、添加仓库源
shell 复制代码
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

helm repo update

# 查看仓库列表
helm repo list

# 搜索 ingress-nginx
helm search repo ingress-nginx
3.2、下载包
shell 复制代码
# 下载安装包
helm pull ingress-nginx/ingress-nginx

# 解压
tar -zxvf ingress-nginx-4.8.1.tgz
3.3、修改values.yaml文件
  • 修改镜像源信息,并且删除 digest 和digestChroot, 大概在22行左右
YAML 复制代码
  image:
    chroot: false
    registry: registry.cn-hangzhou.aliyuncs.com
    image: google_containers/nginx-ingress-controller
    tag: "v1.5.1"
    
  • 修改hostNetwork 为true,大概在88行
shell 复制代码
hostNetwork: true
  • 修改 dnsPolicy 的值为 ClusterFirstWithHostNet , 大概在67行
yaml 复制代码
dnsPolicy: ClusterFirstWithHostNet
  • nodeSelector 添加标签: ingress: "true",用于部署 ingress-controller 到指定节点,大概在287行
yaml 复制代码
  nodeSelector:
    kubernetes.io/os: linux
    ingress: "true"
  • 修改部署类型为DaemonSet, 大概在184行
shell 复制代码
  kind: DaemonSet
  • 将 admissionWebhooks.enabled 修改为 false , 大概在592行

    enabled: false

  • 修改servcie类型,改为NodePort,488行

yaml 复制代码
    type: NodePort
    nodePorts:
      http: "32080"
      https: "32443"
3.4、安装
shell 复制代码
# 创建命名空间
kubectl create ns ingress-nginx

# 给节点添加标签
kubectl label node k8s-node1 ingress=true

# 执行安装
helm install  ingress-nginx  -n ingress-nginx .
3.5、查看安装是否完成
shell 复制代码
kubectl get all -n ingress-nginx


查看ingress-nginx下的控制器会有  pod、service和daemonset
------------------------
NAME                
pod/ingress-nginx-controller-swtx4   

NAME
service/ingress-nginx-controller    

NAME
daemonset.apps/ingress-nginx-controller  

四、Ingress 规则创建

4.1、创建示例
yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: test-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    # 转发重写规则
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: shenyao.com # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 可选:ImplementationSpecific、Exact、Prefix,
        backend:
          service: 
            name: test-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配
4.2、路径类型

Ingress 的路径匹配规则有三种

  • ImplementationSpecific,对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者作与 PrefixExact 类型相同的处理。

  • Exact:精确匹配 URL 路径,且区分大小写。

  • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写

如果同时满足ExactPrefix,优先Exact类型

4.3、主机名通配符

主机名可以是精确匹配或者通配符来匹配,通配符使用*,例如*.shen.com

主机 host 头部 匹配与否?
*.foo.com bar.foo.com 基于相同的后缀匹配
*.foo.com baz.bar.foo.com 不匹配,通配符仅覆盖了一个 DNS 标签
*.foo.com foo.com 不匹配,通配符仅覆盖了一个 DNS 标签
相关推荐
_.Switch23 分钟前
构建现代应用的Python Serverless架构详解
运维·开发语言·python·云原生·架构·serverless·restful
小诸葛的博客26 分钟前
istio中使用serviceentry结合egressgateway实现多版本路由
云原生·istio
jonssonyan1 小时前
稳了,搭建Docker国内源图文教程
运维·docker·容器
福大大架构师每日一题2 小时前
16.2 k8s容器基础资源指标讲解
云原生·容器·kubernetes·prometheus
周湘zx2 小时前
k8s中的微服务
linux·运维·服务器·微服务·云原生·kubernetes
工业甲酰苯胺2 小时前
k8s 中的 Ingress 简介
云原生·容器·kubernetes
周湘zx3 小时前
k8s中的存储
linux·运维·云原生·容器·kubernetes
[听得时光枕水眠]4 小时前
【Docker】Docker上安装MySql8和Redis
运维·docker·容器
Xinan_____6 小时前
Linux——k8s认识
linux·运维·kubernetes
nvd116 小时前
K8S - Access Control 机制介绍
kubernetes