第12节 Ingress
❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.top
[TOC]
Ingress
Ingress:service的统一网关入口(nginx实现)
解释
- Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
- Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
K8s希望
Ingress成为集群流量的唯一入口。
作用
- 帮助位于集群中的 - Service能够有一个对外可达的- url,即让集群外的客户端也可以访问到自己。(wxy:对于这一点,- NodePort类型的- Service也可以,后面会说到)
- 做专业的负载均衡,毕竟 - Service的负载均衡还是很初级的
- 终结 - ssl/tls。意思是说对于那些业务不提供- https的,为了安全,可以有专门机构帮我们做安全方面的事,业务只需要专注业务就行了,所以可以说是"过滤"- ssl/tls
- 基于名称的虚拟 - hosting。这个我理解就是我们常说的Ingress是一个基于应用层提供服务的,因为- Ingress不仅负责一个业务/Service, 而是可以根据名称区分不同的"hosting"....(wxy: 继续看看可能就理解了)
ingress解决了什么问题?
- 动态配置服务 - 如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作. 
- 减少不必要的端口暴露 - 配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式 
统一网关
Ingress和Pod关系
- pod和- Ingress通过- service关联,- Ingress作为一个统一入口通过域名,由- service关联一组- Pod
Ingress 公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
提示
我们可以看到Ingress是Service的上层,Ingress提供了更好的负载均衡体验~

Ingress是基于nginx的实现了方向代理。内网通过
Service访问,Service实现了负载均衡。Ingress其实也可以说
lngress controller,也就是Ingress控制器,包含了nginx,我们平常传统配置nginx,就是配置反向代理规则。
yaml文件
一个最小的 Ingress 资源示例:
service/networking/minimal-ingress.yaml
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 控制器的文档,以了解其支持哪些注解。
编译文件:

安装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 链接
- ✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©