第12节 Ingress


❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.topopen in new window


[TOC]

Ingress

Ingress:service的统一网关入口(nginx实现)

解释

  • Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
  • Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

K8s希望Ingress成为集群流量的唯一入口。

作用

  1. 帮助位于集群中的Service能够有一个对外可达的url,即让集群外的客户端也可以访问到自己。(wxy:对于这一点,NodePort类型的Service也可以,后面会说到)

  2. 做专业的负载均衡,毕竟Service的负载均衡还是很初级的

  3. 终结ssl/tls。意思是说对于那些业务不提供https的,为了安全,可以有专门机构帮我们做安全方面的事,业务只需要专注业务就行了,所以可以说是"过滤"ssl/tls

  4. 基于名称的虚拟hosting。这个我理解就是我们常说的Ingress是一个基于应用层提供服务的,因为Ingress不仅负责一个业务/Service, 而是可以根据名称区分不同的"hosting"....(wxy: 继续看看可能就理解了)

ingress解决了什么问题?

  1. 动态配置服务

    如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作.

  2. 减少不必要的端口暴露

    配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式

统一网关

IngressPod关系

  • podIngress通过service关联,Ingress作为一个统一入口通过域名,由service关联一组Pod

Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

提示

我们可以看到IngressService的上层,Ingress提供了更好的负载均衡体验~

image-20221022201520335

Ingress是基于nginx的实现了方向代理。内网通过Service访问,Service实现了负载均衡。

Ingress其实也可以说lngress controller ,也就是Ingress控制器,包含了nginx,我们平常传统配置nginx,就是配置反向代理规则。

yaml文件

一个最小的 Ingress 资源示例:

service/networking/minimal-ingress.yamlopen in new window

apiVersion: networking.k8s.io/v1
kind: Ingress  
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:  # 监听的后端名称是
          service:
            name: test
            port:
              number: 80

提示:

lngress controller会自动监听yaml文件,然后下发任务,配置,这样所有的流量就会打到controller,不需要直接配置nginx

Ingress 需要指定 apiVersion、kind、 metadata和 spec 字段。 Ingress 对象的命名必须是合法的 DNS 子域名名称。 关于如何使用配置文件,请参见部署应用、 配置容器、 管理资源。 Ingress 经常使用注解(annotations)来配置一些选项,具体取决于 Ingress 控制器,例如重写目标注解。 不同的 Ingress 控制器支持不同的注解。 查看你所选的 Ingress 控制器的文档,以了解其支持哪些注解。

编译文件

image-20221023202032124

安装nginx测试

ingress 80端口实例

创建应用pod、service

kubectl create deplyment web01 --image=nginx:1.14
kubectl expose deployment web02  --port=80 --protocol=TCP

关联 ingress 80 端口:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: web01-ingress
spec:
  rules:
  - host: nginx.didi.cn			# 域名
    http:
      paths:
      - backend:
          serviceName: web01			# 后端service名称
          servicePort: 80					# 后端service端口

查看:

kubectl apply *.yaml

注意svc

因为ingress需要接收所有的请求流量,所以Ingress就需要一个端口来接收所有的流量,这个端口还是以NodePort方式暴露出去的~

kubectl get svc -A

END 链接