第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协议(署名-相同方式共享)©