k8s整合Traefik入门(一)
安装
首先下载helm,根据自己的k8s版本来选择相应的版本
[root@k8s-master1 ~]# tar -zvxf helm-v3.6.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/helm
linux-amd64/LICENSE
linux-amd64/README.md
[root@k8s-master1 ~]# ll
总用量 365408
-rw-------. 1 root root 1242 10月 14 2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 1356 4月 13 14:08 ca-config.json
drwxr-xr-x 8 root root 146 2月 10 20:51 deployment-master
-rw-r--r-- 1 root root 29809 4月 14 18:18 deployment-master.zip
-rw-r--r-- 1 root root 1172 4月 14 18:54 deployment.yml
-rw-r--r-- 1 root root 17408178 4月 13 15:01 etcd-v3.4.16-linux-amd64.tar.gz
-rw-r--r-- 1 root root 13702117 4月 22 13:35 helm-v3.6.3-linux-amd64.tar.gz
-rw-r--r-- 1 root root 343013036 4月 13 17:34 kubernetes-server-linux-amd64.tar.gz
drwxr-xr-x 2 3434 3434 50 7月 15 2021 linux-amd64
[root@k8s-master1 ~]# mv linux-amd64/helm /usr/local/bin/
[root@k8s-master1 ~]# helm version
version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"clean", GoVersion:"go1.16.5"}
[root@k8s-master1 ~]#
使用 Helm 来快速安装 traefik,首先获取 Helm Chart 包:
git clone https://github.com/traefik/traefik-helm-chart
[root@k8s-master1 ~]# cd traefik-helm-chart
[root@k8s-master1 traefik-helm-chart]# ll
总用量 44
-rw-r--r-- 1 root root 205 4月 22 13:36 artifacthub-repo.yml
-rw-r--r-- 1 root root 915 4月 22 13:36 CONTRIBUTING.md
-rw-r--r-- 1 root root 327 4月 22 13:40 dashboard.yaml
-rw-r--r-- 1 root root 1514 4月 22 13:38 deployment-prod.yaml
-rw-r--r-- 1 root root 11573 4月 22 13:36 LICENSE
drwxr-xr-x 2 root root 67 4月 22 13:36 lint
-rw-r--r-- 1 root root 3847 4月 22 13:36 Makefile
-rw-r--r-- 1 root root 473 4月 22 13:49 nginx-ir.yaml
-rw-r--r-- 1 root root 3231 4月 22 13:36 README.md
-rw-r--r-- 1 root root 2360 4月 22 13:36 TESTING.md
drwxr-xr-x 5 root root 157 4月 22 13:36 traefik
[root@k8s-master1 traefik-helm-chart]#
创建一个定制的 values 配置文件:
deployment:
enabled: true
kind: Deployment
使用 IngressClass. Traefik 版本
这里我们使用 hostport 模式将 Traefik 固定到 master1 节点上,因为只有这个节点有外网 IP,所以我们这里 master1 是作为流量的入口点。直接使用上面的 values 文件安装 traefik:
helm upgrade --install traefik ./traefik -f ./deployment-prod.yaml --namespace kube-system
[root@k8s-master1 traefik-helm-chart]# kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik
NAME READY STATUS RESTARTS AGE
traefik-7586cd775d-8n58k 1/1 Running 0 3h2m
[root@k8s-master1 traefik-helm-chart]#
其中 entryPoints
属性定义了 web
和 websecure
这两个入口点的,并开启 kubernetesingress
和 kubernetescrd
这两个 provider,也就是我们可以使用 Kubernetes 原本的 Ingress 资源对象,也可以使用 Traefik 自己扩展的 IngressRoute
这样的 CRD 资源对象。
我们可以首先创建一个用于 Dashboard 访问的 IngressRoute 资源清单:
[root@k8s-master1 traefik-helm-chart]# cat dashboard.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
namespace: kube-system
spec:
entryPoints:
- web
routes:
- match: Host(wgr.traefik.com
) # 指定域名
kind: Rule
services:
- name: api@internal
kind: TraefikService # 引用另外的 Traefik Service
[root@k8s-master1 traefik-helm-chart]#
配置hosts解析
进行访问
另外需要注意的是默认情况下 Traefik 的 IngressRoute 已经允许跨 namespace 进行通信了,可以通过设置参数 --providers.kubernetescrd.allowCrossNamespace=true
开启(默认已经开启),开启后 IngressRoute 就可以引用 IngressRoute 命名空间以外的其他命名空间中的任何资源了。
如果要让 Traefik 去处理默认的 Ingress 资源对象,则我们就需要使用名为 traefik
的 IngressClass 了,因为没有指定默认的:
[root@k8s-master1 traefik-helm-chart]# kubectl get ingressclass
NAME CONTROLLER PARAMETERS AGE
traefik traefik.io/ingress-controller 3h7m
[root@k8s-master1 traefik-helm-chart]#
创建如下所示的一个 Ingress 资源对象,这里的核心是 ingressClassName
要指向 traefik
这个 IngressClass:
[root@k8s-master1 traefik-helm-chart]# cat nginx-ir.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-nginx-by-traefik
namespace: default
spec:
ingressClassName: traefik # 使用 traefk 的 IngressClass
rules:
- host: wgr.nginx.com # 将域名映射到 my-nginx 服务
http:
paths:
- path: /
pathType: Prefix
backend:
service: # 将所有请求发送到 my-nginx 服务的 80 端口
name: nginx-svc
port:
number: 80
[root@k8s-master1 traefik-helm-chart]#
测试:
ACME
Traefik 通过扩展 CRD 的方式来扩展 Ingress 的功能,除了默认的用 Secret 的方式可以支持应用的 HTTPS 之外,还支持自动生成 HTTPS 证书。
比如现在我们有一个如下所示的 whoami
应用:
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- protocol: TCP
name: web
port: 80
selector:
app: whoami
[root@k8s-master1 whoami]# ll
总用量 16
-rw-r--r-- 1 root root 1107 4月 22 17:08 tls.crt
-rw-r--r-- 1 root root 1704 4月 22 17:08 tls.key
-rw-r--r-- 1 root root 259 4月 22 16:56 whoami-ir.yaml
-rw-r--r-- 1 root root 526 4月 22 16:51 whoami.yaml
[root@k8s-master1 whoami]# kubectl create secret tls who-tls --cert=tls.crt --key=tls.key
secret/who-tls created
这个时候我们就可以创建一个 HTTPS 访问应用的 IngressRoute 对象了:
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-tls-demo
spec:
entryPoints:
- websecure
routes:
- match: Host(who.dalianpai.com
) && PathPrefix(/tls
)
kind: Rule
services:
- name: whoami
port: 80
tls:
secretName: who-tls
测试
本文参考:https://www.qikqiak.com/k3s/network/traefik/
Original: https://www.cnblogs.com/dalianpai/p/16179707.html
Author: 天宇轩-王
Title: k8s整合Traefik2入门(一)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/551533/
转载文章受原作者版权保护。转载请注明原作者出处!