安装helm

下载地址

https://github.com/helm/helm/releases

安装

wget https://get.helm.sh/helm-v3.16.2-linux-amd64.tar.gz
tar -zxvf helm-v3.16.2-linux-amd64.tar.gz
cd linux-amd64/
chmod 755 helm 
mv helm /usr/local/bin/
helm version

添加traefik的helm源

helm repo add traefik https://traefik.github.io/charts
helm repo update

下载traefik charts到本地

helm search repo traefik/traefik -l

helm pull traefik/traefik --version 32.1.1

解压

tar zxvf traefik-32.1.1.tgz
cd traefik/

安装traefik

kubectl create ns traefik-ns
helm install --namespace=traefik-ns traefik .

查看启动情况

kubectl get all -n traefik-ns

因为没有替换国内镜像源,必然出现拉取镜像失败。

NAME                           READY   STATUS             RESTARTS   AGE
pod/traefik-76d7646498-wjzld   0/1     ImagePullBackOff   0          7m5s

查看具体拉取失败的镜像

kubectl describe pod traefik-76d7646498-wjzld -n traefik-ns

拉取国内镜像

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik:v3.1
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/traefik:v3.1 docker.io/traefik:v3.1.6
docker save -o traefik.tar docker.io/traefik:v3.1.6
scp traefik.tar root@10.0.2.12:/root
ssh 10.0.2.12
docker load -i traefik.tar

访问dashboard,参考

https://kkgithub.com/traefik/traefik-helm-chart/blob/master/EXAMPLES.md
https://doc.traefik.io/traefik/operations/dashboard/

修改values.yaml,开启dashboard规则转发

ingressRoute:
  dashboard:
    enabled: true

配置端口转发来实现

kubectl -n traefik-ns port-forward $(kubectl -n traefik-ns get pods --selector "app.kubernetes.io/name=traefik" --output=name) 9000:9000

通过http://127.0.0.1:9000/dashboard


以下内容验证时,访问 traefik 的 dashboard 总是报错误 404,有待再次验证

自定义 values.yaml

在traefik-helm-chart目录创建一个定制的 values 配置文件(备注:如果不熟悉配置可以使用官方默认的配置文件)。

vim values-custom.yaml

写入以下内容

# values-custom.yaml
# Create an IngressRoute for the dashboard
ingressRoute:
  dashboard:
    enabled: false # 禁用 helm 中渲染的 dashboard,后面手动创建

# Configure ports
ports:
  web:
    port: 8000
    nodePort: 31800 # 使用 NodePort 模式
  websecure:
    port: 8443
    nodePort: 31443

# Service
service:
  enabled: true
  type: NodePort # 使用 NodePort 模式

# Logs
logs:
  general:
    level: DEBUG

安装 traefik

helm install -n traefik-ns traefik ./ -f values-custom.yaml

查看 traefik 的运行状态

kubectl get pods,svc -n traefik-ns -o wide

查看pod的资源清单来了解Traefik的运行方式

kubectl get pods traefik-6b7d8fcc6f-lqqmp -n traefik-ns -o yaml
spec:
  automountServiceAccountToken: true
  containers:
  - args:
    - --global.checknewversion
    - --global.sendanonymoususage
    - --entryPoints.metrics.address=:9100/tcp
    - --entryPoints.traefik.address=:9000/tcp
    - --entryPoints.web.address=:8000/tcp
    - --entryPoints.websecure.address=:8443/tcp
    - --api.dashboard=true
    - --ping=true
    - --metrics.prometheus=true
    - --metrics.prometheus.entrypoint=metrics
    - --providers.kubernetescrd
    - --providers.kubernetescrd.allowEmptyServices=true
    - --providers.kubernetesingress
    - --providers.kubernetesingress.allowEmptyServices=true
    - --entryPoints.websecure.http.tls=true
    - --log.level=DEBUG

从容器参数上可以看到entryPoints定义了web和websecure两个入口,并且provider开启了kubernetescrd和kubernetesingress。也就是既可以使用Kubernetes自身的Ingress资源对象,也可以使用Traefik扩展的IngressRoute类型的CRD资源对象来定义入口。

访问dashboard

使用IngressRoute资源清单部署一个Traefik Dashboard入口。创建dashboard.yaml文件

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: dashboard
  namespace: traefik-ns
spec:
  entryPoints: # 入口点使用 web
    - traefik
  routes:
    - match: (PathPrefix(`/dashboard`) || PathPrefix(`/api`)) # 路由匹配规则,/dashboard 对静态页,/api 对接口
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService # Helm 安装 Traefik 时创建的自定义Service

部署

kubectl apply -f dashboard.yaml

部署完成后如果你是在云厂商的机器上,就可以使用Node节点的公网 IP + Traefik 的 Service 暴露出的端口号进行访问。如果是本地环境使用内网 IP。

参考:

https://doc.traefik.io/traefik/getting-started/install-traefik/#use-the-helm-chart
https://blog.linganmin.cn/posts/2d15ed93/
https://kkgithub.com/traefik/traefik-helm-chart/blob/master/EXAMPLES.md
https://zhuanlan.zhihu.com/p/466892515