Kubernetes那点事儿——暴露服务之Ingress
- 前言
- 一、ingress
- 负载均衡器Ingress Controller
- 路由规则Ingress
- 二、Ingress Controller
- 三、案例
前言
在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodeport也有缺点,比如端口号用尽,只能支持4层的负载均衡。为了弥补Nodeport的不足,Ingress应运而生。
一、ingress
Ingress 公开了从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。
下面是一个将所有流量都发送到同一Service的简单Ingress示例:
Ingress分为两部分:负载均衡器和路由规则:
负载均衡器Ingress Controller
路由规则Ingress
# http示例.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service # serviceName对应service的名称
port:
number: 80 # servicePort对应service监听端口
# https示例.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-example-ingress
spec:
tls:
- hosts:
- sslexample.ctnrs.com secretName: secret-tls
rules:
- host: sslexample.ingress.com
http:
paths:
- path: /
pathType: Prefix
backend:
name: web-service # serviceName对应service的名称
port:
number: 80 # servicePort对应service监听端口
二、Ingress Controller
Ingress Controller有很多实现,示例采用官方维护的基于Nginx实现的,其他还可使用haproxy、lvs等。
Github:https://github.com/kubernetes/ingress-nginx
部署:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
部署Ingress Controller
方案一(2次反代)
使用DaemonSet部署ingress-controller,ds保证集群每个或者部分满足条件的node运行单个pod,如果是打算让每个node都跑一个ingress还是部分满足条件节点跑ingress都需要ds,这种部署模式ingress-controller需用hostnetwork,直接将pod与host共享网命名空间,host直接监控pod监听的端口。ingress可以直接转发请求到host。
user -> LB -> ingress-controller -> pod
方案二(3次反代)
使用Deployment部署ingress-controller,再使用service的nodeport方法去暴露ingress-controller,与DaemonSet方式部署最大的区别该方式ingress-controller不需要hostnetwork,但deployment可能会出现几个ingress都在一个或几个node上,这不优雅也不能保证集群高可用。
user -> LB -> svc(nodePort) -> ingress-controller -> pod
kubectl apply -f ingress-controller.yaml
kubectl get pods -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-ingress-controller-hdx4b 1/1 Running 0 22m 10.7.7.221 k8s-node1 <none> <none>
nginx-ingress-controller-pqkx8 1/1 Running 0 22m 10.7.7.222 k8s-node2 <none> <none>
因为controller采用DaemonSet模式,所以集群每个节点都起一个pod,master节点有taint,所以master节点没有pod
三、案例
需求:一个或多个特定的node上只运行ingress(污点+标签+ds)
- 打污点,给node打上污点,防止其他pod运行在此node上
- 给ingress打上污点容忍,允许pod可以运行在污点node上
- 使用nodeSelector,将ingress调度到污点node
- 使用DaemonSet控制器,控制每个污点node上都运行一个ingress