k8s 用ingress暴露集群环境中的服务。
一、.集群暴露服务的方式有两种
1. 使用nodeport型的service暴露
注意:无法使用kube-proxy的ipvs模型,只能使用iptable模型
2.使用ingress资源暴露
注意:ingress 只能调度暴露7层应用,特指http和https协议。
这里我们采用ingress-nginx软件暴露,而ingress常用的暴露软件有Ingress-nginx、HAproxy、Traefik...
要理解ingress,需要区分两个概念,ingress和ingress-controller:
- ingress对象:
指的是k8s中的一个api对象,一般用yaml配置。作用是定义请求如何转发到service的规则,可以理解为配置模板。 - ingress-controller:
具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发
简单来说,ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到ingress-controller,而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名哪些path要转发到哪些服务等等。
二、ingress-controller和ingress部署
1. 部署ingress-controller
之前部署都是在 https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml 获取ingress-controller的yaml脚本,目前站点不能访问,因此直接去github 获取ingress
git clone https:
//github.com/nginxinc/kubernetes-ingress.git
修改nginx-ingress-controller.yaml
vim ingress-nginx/docs/examples/static-ip/nginx-ingress-controller.yaml
配置文件比较多,这里只贴apiVersion的配置
具体修改方式可以参考https://segmentfault.com/a/1190000019908991
quay.io镜像可能比较慢,这里用阿里的镜像
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.25.0
然后创建 nginx-ingress-controller的pod
k8smaster# kubectl apply -f ingress-nginx/docs/examples/static-ip/nginx-ingress-controller.yaml
接着给node服务器贴标签
k8smaster# kubectl label nodes node1 custom/ingress-controller-ready=true
查看pod
k8smaster# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
nginx-ingress-controller-h5cxf 1/1 Running 0 47m
检查部署情况
k8smaster# kubectl get daemonset -n ingress-nginx
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
nginx-ingress-controller 1 1 1 1 1 custom/ingress-controller-ready=true 3h13m
查询基本信息
k8smaster# kubectl describe daemonset nginx-ingress-controller -n ingress-nginx
暴露nginx-controller
在node节点上查看nginx端口
2.配置ingress资源
vim ingress-nginx/docs/examples/static-ip/nginx-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
spec:
rules:
- host: test.aaa.com #将此域名映射为你的服务
http:
paths:
- path: / #域名后的路径
backend:
serviceName: java-demo #java-demo 是本地已有的service服务
servicePort: 80
kubectl apply -f nginx-ingress.yaml
最后配置hosts 将test.aaa.com 解析到node的ip
curl test.aaa.com
#参考链接
https://www.cnblogs.com/fanggege/p/11953688.html
https://www.cnblogs.com/songqingbo/articles/12487939.html
https://segmentfault.com/a/1190000019908991
https://github.com/kubernetes/ingress-nginx/blob/master/charts/ingress-nginx/templates/controller-daemonset.yaml