Kubernetes中安装traefik ingress
# 下载配置清单
wget https://github.com/containous/traefik/tree/v1.7/examples/k8s
# 链接中以traefik-开头的文件有3个,都可以见名知意,其中traefik-deployment.yaml我们这里没有用到
# traefik-deployment.yaml跟traefik-ds.yaml二者选其一即可,由于底下的配置是根据traefik-ds.yaml来的所以建议使用
# ui.yaml 是定义traefik 的dashboard的svc及ingress 这里没有用是因为8080端口直接监听在node上的
下载上面链接中以下两个文件
traefik-rbac.yaml traefik-ds.yaml
# 由于默认通过svc使用NodePort,且端口范围只能是30000-32767,如果kubernetes是编译安装的则可自定义端口范围
# 这里使用的是kubeadm安装的,所以只能使用30000-32767了
# 这里说下为什么使用30000-32767端口范围不方便,主要是因为内部一些项目需要调用其他项目的域名,而域名则是通过
# ingress来发布对外服务的,如果不是80端口的话就需要在 ingress前端再加个nginx或者是流量绕到网关防火墙再回来
# 这样就极其不方便及内部访问耗时
# 所以这里我们需要做的是将 traefik的容器(traefik-ds.yaml这个文件中定义的资源)使用hostNetwork的方式共享主机的网络空间来监听80端口
# 接下来,来修改traefik-ds.yaml中定义的资源清单
vim traefik-ds.yaml
# 在DaemonSet.spec.template.spec 下加入
# ...
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
# 在此添加
hostNetwork: true
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik
name: traefik-ingress-lb
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8080
# 8080端口是traefik的dashboard,可用于查看一些数据
# 如果不想使用8080端口 则可修改如下端口为其他任意端口,需要注意的是修改的端口在node上没有监听才可以
# 这里默认
hostPort: 8080
# ...
---
# 将此文件中定义的svc的清单全部注释掉,由于我们使用了hostNetwork直接共享了node的网络名称空间,所以这里的svc已经没有必要用了
#kind: Service
#apiVersion: v1
#metadata:
# name: traefik-ingress-service
# namespace: kube-system
#spec:
# selector:
# k8s-app: traefik-ingress-lb
# ports:
# - protocol: TCP
# port: 80
# name: web
# - protocol: TCP
# port: 8080
# name: admin
# end
# 应用配置清单
kubectl apply -f ./
# 应用完成后稍等片刻 可去非master节点上查看本机的80端口及8080端口是否直接监听的
netstat -tnlp | grep 80
tcp6 0 0 :::8080 :::* LISTEN 7499/traefik
tcp6 0 0 :::80 :::* LISTEN 7499/traefik
# 由于我们traefik pod是以DaemonSet控制器运行的,所以每个node上都会监听如上两个端口
# 在生产环境中可在防火墙上将80端口转发至任意一个或多个node上的80端口,以便于对互联网外部的用户访问
# 假设有20个Node,又不想在每个Node上都运行traefik,每个Node都运行一个traefik,这样也不太合理.
# 所以我们可以给某些个节点打上对应的标签,让DaemonSet(deploy等控制器资源也可同样定义)控制器控制的pod只运行在某个或多个Node上
# 然后使用ds.spec.template.spec.nodeSelector 来选择刚才定义的节点标签,即可让DaemonSet控制器资源只运行在定义的节点上
# 配置如下.假设这里有5个node,只让traefik以DameonSet控制器运行在node1,node2这两个节点上
kubectl get node
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 37d v1.13.3
kubernetes-node1 Ready <none> 37d v1.13.3
kubernetes-node2 Ready <none> 37d v1.13.3
kubernetes-node3 Ready <none> 37d v1.13.3
kubernetes-node4 Ready <none> 37d v1.13.3
kubernetes-node5 Ready <none> 37d v1.13.3
1,打标签,标签根据自己需要定义
kubectl label node kubernetes-node1 node_type=ingress
kubectl label node kubernetes-node2 node_type=ingress
2,修改traefik-ds.yaml配置清单 增加ds.spec.template.spec.nodeSelector配置项
vim traefik-ds.yaml
# ...
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
# 添加在此处
nodeSelector:
# 标签名及标签值要与上面定义的标签一致
node_type: ingress
# end
hostNetwork: true
# ...
3,应用修改后的配置清单
kubectl apply -f traefik-ds.yaml
4,验证
# 查看traefik-ds的pod是否只有两个
# 需要明白的是DaemonSet控制器资源默认情况下会在每个node上运行1个,上面我们有5个node,然后我们只给node1 2打了标签,所以只会运行两个pod
kubectl get pod -n kube-system | grep traefik
# 查看是否只在node1,2上监听了80,8080端口
# 由于上面我们修改了pod使用hostNetwork 来共享使用node的网络名称空间 所以会在node监听
# 在node1 2上查看
netstat -tnlp | grep 80
5,防火墙将80端口转发至node1,2这两个主机的IP上即可对外发布服务了
# Ingress资源定义示例
---
apiVersion: examples/v1beata1
kind: Ingress
metadata:
# ingress名称
name: ingress-tsp
namespace: default
annotations:
# 表示ingress的类型
kubernetes.io/ingress.class: traefik
# 后端应用的根
traefik.ingress.kubernetes.io/app-root: /tsp
spec:
rules:
# 域名
- host: tsp.xxxxx.com
http:
paths:
# 映射的路径此路径是前端的路径
- path: /
backend:
# 后端pod的service名称
serviceName: tsp
# service端口
servicePort: 8080
更多好文关注马哥linux运维
来源:51CTO
作者:andy_f
链接:https://blog.51cto.com/ant595/2482946