traefik是一款ingress 控制器,主要作为后端服务的方向代理作为请求的入口网关。

捣鼓traefik切实让我头疼了很久,因为几个概念没搞明白。现在就给大家分享一下我的心得。

1、traefik安装

我看了很多资料,有手动安装的,有使用helm工具安装的,因为插件和配置比较健全我选择了hlem安装。方法很简单。因为要对配置文件进行修改,主要是避免本机已开放端口与traefik服务端口冲突问题,需要先下载traefik的chart项目。

helm repo add traefik https://helm.traefik.io/traefik //添加项目源
helm repo update
helm search repo traefik/traefik  //查看可以下载的版本号
helm pull traefik/traefik //下载到本地
tar -xzvf traefik*.tgz
//修改traefik/values.yaml文件

tag: "2.4.13"


service:
  enabled: true
  type: ClusterIP


nodeSelector: 
  traefik: "true"
tolerations: [operator: "Exists"]

找到上面几处进行修改。tag为下载的traefik的版本号,这里需要注意如果你下载的是latest版本,需要在docker里把tag标签改为数字样式,比如“2.4.13”,因为在安装时,程序会比较版本号,latest无法和数字比较,会报错。关于web、traefik、metrics、websecure这些都是入口标签,可以修改用默认值。service暂时更改一下type类型为ClusterIP,不然会显示pending状态,后续再进行修改。然后nodeSelector选项,这里是选择traefik的部署节点,为什么设置这里呢?因为要使用daemonset部署,它会在所有worker节点上部署,这样要是绑定域名的ip可以是worker节点的任何一个ip,而helm安装是deployment部署,deploy部署只会选择worker节点中的其中一个节点部署,而且pod是有生命周期的,worker节点有可能不能稳定在一个节点上,这样域名的ip绑定就有可能会失效。所以使用helm部署,需要把traefik固定到一个节点上,我把它部署到master节点上了,并在一个master节点上打上标签,让其选择具有这个标签的节点,同时做了污点免疫设置,否则部署不到master节点上。

//在k8s70132上打标签

kubectl label node k8s70132 traefik=true

//安装traefik

在traefik目录的上级目录执行:

kubectl create ns traefik //创建traefik 名字空间

helm install traefik traefik -n traefik //第一个traefik是安装的项目命名,第二个是traefik目录,第三个是名字空间

//安装完毕后查看状态

kubectl get all -n traefik -o wide

NAME                           READY   STATUS    RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
pod/traefik-7bc7bcbf74-fxpgk   1/1     Running   0          5h21m   22.244.157.105   k8s70132   <none>           <none>

NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE     SELECTOR
service/traefik   ClusterIP  22.104.92.121   <none>        8000/TCP,9443/TCP   5h46m   app.kubernetes.io/instance=traefik,app.kubernetes.io/name=traefik

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES           SELECTOR
deployment.apps/traefik   1/1     1            1           5h46m   traefik      traefik:2.4.13   app.kubernetes.io/instance=traefik,app.kubernetes.io/name=traefik

NAME                                 DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES           SELECTOR
replicaset.apps/traefik-58cc89688b   0         0         0       5h46m   traefik      traefik:2.4.13   app.kubernetes.io/instance=traefik,app.kubernetes.io/name=traefik,pod-template-hash=58cc89688b
replicaset.apps/traefik-7bc7bcbf74   1         1         1       5h21m   traefik      traefik:2.4.13   app.kubernetes.io/instance=traefik,app.kubernetes.io/name=traefik,pod-template-hash=7bc7bcbf74

可以看到pod是部署到k8s70132节点上了。

这时候按照官方文档让把管理端口9000映射给外部网络

kubectl port-forward traefik-7bc7bcbf74-fxpgk -n traefik 9000:9000 --address=0.0.0.0

//k8s70132的ip为10.12.70.132

访问http://10.12.70.132:9000/dashboard/#就可以打开管理界面了

 2、ingressroute的问题

按照官方文档:https://doc.traefik.io/traefik/getting-started/install-traefik/

不使用port-forward映射端口方式,可使用ingressroute同样也可以打开dashboard管理界面

kubectl apply -f dashboard.yaml

#dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: dashboard
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`traefik.localhost`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService

我按照说明执行了,并停止了port-forward转发,发现访问http://10.12.70.132:9000/dashboard/#无法访问,什么也打不开了!

用了很长时间看了很多资料才搞明白,其实主要是官方文档也说的不清楚。这里面有几个问题关键点。

a、IngressRoute是为指定的服务做网关的,所以IngressRoute的名称空间必须和其关联的服务在同一个名称空间里。这里IngressRoute是为traefik提供网关,所以IngressRoute需要部署到traefik名称空间下。kubectl apply -f dashboard.yaml -n traefik

b、dashboard.yaml文件中的entryPoints的值是什么?这是服务的入口地址,就是service暴露在cluster ip上的端口,即port值。因为是使用traefik作为ingress控制器,所以服务专指traefik提供的服务,也就是上面values.yaml中配置的web、traefik、metrics、websecure这这几个入口标签。

这里设置的traefik标签对应9000端口,通过9000可以访问dashboard管理界面。

web标签对应8000端口,通过8000端口可以访问所有的http请求

websecure标签对应的9443端口,通过9443端口可以访问所有的https请求,前提是配置完tls后。

所有在dashboard.yaml文件中entryPoints值,若做的只是http的请求,值始终是web

c、ingressroute.spec.routes.services

services是设置要代理的服务,在dashboard.yaml文件中,因为traefik是自定义的服务,所以其设置是 - name: api@internal          kind: TraefikService

若这里想代理名字为nginx的service服务那么这里设置就为

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: nginxingressroute
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`nginx-test.shell.com`) && PathPrefix(`/`)
    kind: Rule
    services:
    - name: nginx
      port: 80

 设置其服务名称和暴露的端口号。

d、match的值

这里Host设置的域名和后面的前缀,在访问时的url为

Host设置的域名:暴露的端口号+pathprefix的值

这里的暴露的端口号不是services设置的端口号!

e、暴露端口号

之前我们通过port-forward将traefik服务中的9000端口暴露为9000端口,外网访问就可以通过9000访问到dashboard界面。我们现在部署了一个nginx的ingressroute该如何暴露端口号呢?

可以像这样

kubectl port-forward traefik-7bc7bcbf74-fxpgk -n traefik 9001:8000 --address=0.0.0.0

我们访问http://10.12.70.132:9100/

就可以访问到nginx的服务了。

f、域名

大家可以看到在暴露端口号的时候port-forward后跟的pod名前后都一样,使用9000:9000还是使用9001:8000 pod名都是traefik-7bc7bcbf74-fxpgk。这也就是说我们外界访问集群提供的服务地址是不随svc地址变化的,那么我们的域名,即host值绑定的ip地址就是traefik pod部署的节点地址,这里是10.12.70.132。在客户端访问时配置访问客户机的host 应为 10.12.70.132 nginx-test.shell.com

之后访问

nginx-test.shell.com:9001/  就可以访问nginx

nginx-test.shell.com:9001/dashboard/# 就可以访问dashboard  ,因为已经部署了dashboard.yaml

g、替代port-forward

综上所述,我们对外暴露集群端口只需要暴露http:8000和https:9443就可以了(因tls未配置,9443端口暂时不作暴露)。

我们可以通过traefik部署的服务

kubectl get svc -n traefik
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
traefik   ClusterIP  22.104.92.121   <none>        8000/TCP,9443/TCP   6h54m

将type类型改为NodePort类型

kubectl patch -n traefik svc traefik -p '{"spec": {"type":"NodePort"}}'
kubectl get svc -n traefik
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE
traefik   NodePort   22.104.92.121   <none>        8000:32639/TCP,9443:30097/TCP   6h54m

现在访问http://nginx-test.shell.com:32639/dashboard/#就可以打开dashboard的管理界面了。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐