Kubernetes中安装traefik ingress

ⅰ亾dé卋堺 提交于 2020-03-29 23:32:54

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运维

Kubernetes中安装traefik ingress

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!