Ingress:
ingress是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上。Ingress相当于nginx、apache等负载均衡方向代理服务器,其中还包括规则定义,即URL的路由信息,路由信息得的刷新由Ingress controller来提供。
Ingress Controller 实质上可以理解为是个监视器,Ingress Controller 通过不断地跟 kubernetes API 打交道,实时的感知后端 service、pod 等变化,比如新增和减少 pod,service 增加与减少等;当得到这些变化信息后,Ingress Controller 再结合下文的 Ingress 生成配置,然后更新反向代理负载均衡器,并刷新其配置,达到服务发现的作用。
Traefik
Traefik是一款开源的反向代理与负载均衡工具。它最大的优点是能够与常见的微服务系统直接整合,可以实现自动化动态配置。
部署Traefik
①创建ingress-rbac.yaml.将用于service account验证。
apiVersion: v1
kind: ServiceAccount
metadata:
name: ingress
namespace: default
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: ingress
subjects:
- kind: ServiceAccount
name: ingress
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io1234567891011121314151617181920
②创建DaemonSet
我们使用DaemonSet类型来部署Traefik,并使用nodeSelector
来限定Traefik所部署的主机。
kubectl label nodes 172.20.0.113 edgenode=true1
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: traefik-ingress-lb
namespace: default
labels:
k8s-app: traefik-ingress-lb
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
terminationGracePeriodSeconds: 60
hostNetwork: true
restartPolicy: Always
serviceAccountName: ingress
containers:
- image: traefik
name: traefik-ingress-lb
resources:
limits:
cpu: 600m
memory: 90Mi
requests:
cpu: 300m
memory: 90Mi
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8580
hostPort: 8580
args:
- --web
- --web.address=:8580
- --kubernetes
nodeSelector:
edgenode: "true"1234567891011121314151617181920212223242526272829303132333435363738394041
③创建名为traefik-ingress的ingress,文件名ingress.yaml
首先,我们先创建一个pod和一个services,为负载做准备
//创建pod
kubectl run first-deployment --image=katacoda/docker-http-server --port=80
//创建对应services
kubectl expose deployment first-deployment --port=801234
之后,定义一个ingress实现负载
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-ingress
namespace: default
spec:
rules:
- host: traefik.nginx.io
http:
paths:
- path: /
backend:
serviceName: first-deployment
servicePort: 801234567891011121314
④Traefik UI
使用下面的yaml配置来创建Traefik的Web UI。
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: default
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 80
targetPort: 8580
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: default
spec:
rules:
- host: traefik-ui.local
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web123456789101112131415161718192021222324252627
⑤启动
kubectl create -f .1
启动之后,发现多了ingress和daemonSet
在浏览器中测试,说明部署正确
左侧黄色部分部分列出的是所有的rule,右侧绿色部分是所有的pod
测试是否真能够集群外访问:
在集群的任意一个节点上执行。假如我要访问traefik.nginx.io。
curl -H Host:traefik.nginx.io http://192.168.204.144/1
如果你需要在kubernetes集群以外访问就需要设置DNS,或者修改主机(集群外的机器)的hosts文件。文件在/etc/hosts
192.168.204.144 traefik.nginx.io1
访问traefik.nginx.io这些地址的流量都会发送给192.168.204.144这台主机,就是我们启动traefik的主机。
Traefik会解析http请求header里的Host参数将流量转发给Ingress配置里的相应service。
修改hosts后就就可以在kubernetes集群外访问以上service,如下图: