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 属性定义了 webwebsecure 这两个入口点的,并开启 kubernetesingresskubernetescrd 这两个 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

进行访问

image-20220422164412369

另外需要注意的是默认情况下 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]#

测试:

image-20220422164741398

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

测试

image-20220422170333387

如果我们需要用 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

测试

image-20220422171352464

本文参考:https://www.qikqiak.com/k3s/network/traefik/

Logo

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

更多推荐