k8s学习笔记——关于traefik 1
//参考:https://cloud.tencent.com/developer/article/1615712已测试
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的管理界面了。
更多推荐
所有评论(0)