k8s整合Traefik2入门(一)
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 版本<2.3 或者 Kubernetes 版本 < 1.18.x 会被忽略
ingressClass:
enabled: true
isDefaultClass: false
ingressRoute: # 不用自动创建,我们自己处理
dashboard:
enabled: false
#
# 配置 providers
#
providers:
kubernetesCRD: # 开启 crd provider
enabled: true
allowCrossNamespace: true # 是否允许跨命名空间
allowExternalNameServices: true # 是否允许使用 ExternalName 的服务
kubernetesIngress: # 开启 ingress provider
enabled: true
allowExternalNameServices: true
logs:
general:
# format: json
level: DEBUG
access:
enabled: true
ports:
web:
port: 8000
hostPort: 80 # 使用 hostport 模式
websecure:
port: 8443
hostPort: 443 # 使用 hostport 模式
metrics:
port: 9100
hostPort: 9101
service: # host 模式就不需要创建 Service 了,云端环境可以用 Service 模式
enabled: false
resources:
requests:
cpu: "100m"
memory: "100Mi"
limits:
cpu: "100m"
memory: "100Mi"
tolerations: # kubeadm 安装的集群默认情况下master是有污点,如果需要安装在master节点需要添加容忍
- key: "node-role.kubernetes.io/master"
operator: "Equal"
effect: "NoSchedule"
nodeSelector: # 固定到node1这个边缘节点
kubernetes.io/hostname: "k8s-master1"
这里我们使用 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解析
![image-20220422164326961](https://typora-oss.oss-cn-beijing.aliyuncs.com/image-20220422164326961.png)
进行访问
另外需要注意的是默认情况下 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 <none> 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
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: containous/whoami
ports:
- name: web
containerPort: 80
然后定义一个 IngressRoute 对象:
piVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: ingressroute-demo
spec:
entryPoints:
- web
routes:
- match: Host(`who.dalianpai.com`) && PathPrefix(`/notls`)
kind: Rule
services:
- name: whoami
port: 80
测试
如果我们需要用 HTTPS 来访问我们这个应用的话,就需要监听 websecure
这个入口点,也就是通过 443 端口来访问,同样用 HTTPS 访问应用必然就需要证书,这里我们用 openssl
来创建一个自签名的证书:
[root@k8s-master1 whoami]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=wgr.nginx.com"
Generating a 2048 bit RSA private key
..............+++
.................+++
writing new private key to 'tls.key'
-----
[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
测试