目录
ingress是什么
k8s中ingress实施
1、ingress controller安装
2、使用
ingress切换宿主机ip
ingress定义
ingress是什么
首先,要来看传统k8s中service的NodePort存在的不足
1、一个端口只能一个服务使用,端口需要提前规划
2、只支持4层网络协议
四层(传输层):基于ip和端口转发的
七层(应用层):基于应用层协议转发,例如http、可以根据域名、url等转发
所以,使用ingress的话,他可以在集群中实现一个统一的负载均衡,在集群中提供一个访问入口,
其中,ingress分为ingress和ingress Controller
ingress: k8s中的一个抽象资源,给管理员提供一个暴露应用的入口定义方法
ingress Controller: 根据Ingress生成具体的路由规则,并对pod负载均衡
Ingress Controller有很多实现,我们这里采用官方维护的基于Nginx实现的控制器。
项目地址: GitHub - kubernetes/ingress-nginx: NGINX Ingress Controller for Kubernetes
文档: Installation Guide - NGINX Ingress Controller
其他控制器: Ingress Controllers | Kubernetes
k8s中ingress实施
首先先下载实施yaml文件
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.3/deploy/static/provider/baremetal/deploy.yaml
ingress有两种部署方式,因为他本质上也是一个pod,所以他有两种暴露方式,第一种。pod创建,用service在对他进行代理。第二种。直接共用宿主机网络,将端口暴露在宿主机
官方yaml默认是由service代理的
1、ingress controller安装
1、执行下载好的yaml
kubectl apply -f ingress-controller-1.1.yaml
2、他默认在ingress-nginx这个命名空间下
kubectl get pods -n ingress-nginx
其中,imagess-nginx-controller启动即可,剩余两个为job容器, 不需要理会
查看暴露的service端口
kubectl get pods,svc -n ingress-nginx
2、使用
先创建规则
kubectl apply -f xxx.yaml
kubectl get ingress
测试:本地电脑绑定hosts记录对应ingress里面配置的域名 例: web1.aliangedu.cn
例如这可以生成一个示例yaml
kubectl create ingress web1 --rule=host/path=web:80 --dry-run=client -o yaml
可以以此为参考
或者直接在官网下载示例
官网地址
在使用前要明白一点。即ingress是代理service的,所以在使用ingress前要先有创建service
kubectl get svc
以这个nginx的service为例
vi ingress1.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web1
spec:
ingressClassName: "nginx"
rules:
web1.aliangedu.cn
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
标红都是需要注意修改的,service是此ingress绑定的service
执行
kubectl apply -f ingress1.yaml
查看ingress
kubectl get ingress
他们分别是此images名、代理的service名、代理的域名、节点所在ip、服务走的端口
所以,我们访问域名即可访问此服务
注意:访问前先确定自己的访问电脑是否对此域名做了dns解析
在访问域名加对应的ingress端口即可成功
整个访问流程:
Service NodePort访问Ingress Controller:
域名(web1.aliangedu.cn:32613) -> 公网负载均衡器(80) -> service nodeport(80:32613/TCP,443:31743/TCP)-> iptables/ipvs -> ingress controller Pod(nginx,基于域名分流) -> 分布在各个节点上的pod
ingress切换宿主机ip
在ingress的yaml中搜索containers
在containers上新加hostNetwork: True,与containers同级
kubectl apply -f ingress-controller-1.1.yaml
他会重建
此时访问地址变成这样
hostNetwork访问Ingress Controller:
域名(web1.aliangedu.cn:80) -> 公网负载均衡器(80) -> 宿主机80端口是ingress controller监听的 -> ingress controller(nginx,基于域名分流) -> 分布在各个节点上的pod
使用network的好处时他避开了service的代理,直接从宿主机访问,更方便快捷,坏处是只能访问他分配到的ip才能访问,没有service那么灵活
ingress定义
ingress是一个全局入口(80和443),为集群中所有应用转发
公网负载均衡器在其中的作用:
1、将k8s节点(内网)暴露到互联网上
2、为互联网用户统一访问入口,特别是针对service nodeport
3、加强k8s网络安全