k8s 集群安装traefik

882 阅读3分钟

安装traefik

使用helm安装

  1. 安装traefik 存储库
helm repo add traefik https://traefik.github.io/charts
  1. 设置自定义安装文件
service:
  type: NodePort  # 设置service方式 因为我这是私有云 没有loadBalancer 

ports:
  traefik:
    port: 9000
    expose:
      default: false
    exposedPort: 9000
    protocol: TCP
  web:
    port: 8000
    expose:
      default: true
    exposedPort: 80
    protocol: TCP
    nodePort: 80  # 绑定到node的端口
  websecure:
    port: 8443
    expose:
      default: true
    exposedPort: 443
    protocol: TCP
    nodePort: 443 # 绑定到node的端口
    http3:
      enabled: false
    tls:
      enabled: true 
      # this is the name of a TLSOption definition
      options: ""
      certResolver: ""
      domains: []
    middlewares: [] 

tlsStore:  # 这个下面解释
  default:
    defaultCertificate:
      secretName: xxxx    

ingressRoute: # 配置dashboa
  dashboard:
    enabled: true
    matchRule: Host(`xxxx.com`)
    entryPoints: 
      - "web"
      - "websecure"
    middlewares:
      #- name: traefik-dashboard-auth  #不启用权限插件

extraObjects: # 为dashboard做的额外配置
  - apiVersion: v1
    kind: Secret
    metadata:
      name: traefik-dashboard-auth-secret
    type: kubernetes.io/basic-auth
    stringData:
      username: admin
      password: xxxxxx  # 配置进dashboard的密码

  - apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: traefik-dashboard-auth
    spec:
      basicAuth:
        secret: traefik-dashboard-auth-secret 

# 如果需要指定pod部署到指定的机器上,需要设置selector,我这里没设置
# nodeSelector: 

我这里使用了nodeport绑定了两个端口(80,,443),端口比较小,k8s 支持的端口范围是(30000-32767),如未设置,需要去master节点对应的api-server文件中进行修改,具体修改百度

  1. 安装
helm install -f traefik-values.yaml traefik traefik/traefik

配置ssl (上面的tls这里解释)

使用traefik的原因,一来是作为k8s的网关,二来是配置ssl也比较方便,官方在github里面介绍了两种在安装时配置ssl的方式,我这里使用的是第二种(使用cert-manager + cloudflare)

官方文档

配置cloudflare

  1. 创建账号
  2. 绑定域名(自己的域名-备案过最好)
  3. 去自己的域名注册商修改域名的dns地址(我这里用的是在百度买的域名,点击详情 修改dns地址为cloudflare的dns地址)
  4. 生成令牌

安装cert-manager

helm repo add jetstack https://charts.jetstack.io --force-update

helm install \
  cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --version v1.15.0 \
  --set crds.enabled=true

生成对应的Secret 以及 Issuer,Certificate

  1. 生成对应的 apply yaml文件
cat > acme-values.yml << EOF
---
apiVersion: v1
kind: Secret
metadata:
  name: cloudflare
  namespace: traefik
type: Opaque
stringData:
  api-token: XXX  # 这里填cloudflare上的令牌
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: cloudflare
  namespace: traefik
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: email@example.com # 这里填cloudflare的账号邮箱
    privateKeySecretRef:
      name: cloudflare-key
    solvers:
      - dns01:
          cloudflare:
            apiTokenSecretRef:
              name: cloudflare
              key: api-token
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-example-com # 最好改成自己的域名-com
  namespace: traefik
spec:
  secretName: wildcard-example-com-tls # 最好改成自己的域名-tls
  dnsNames:
    - "example.com" # 配置自己的域名
    - "*.example.com" # 配置自己的子域名
  issuerRef:
    name: cloudflare
    kind: Issuer   
EOF
  1. apply 配置文件
kubectl apply -f acme-values.yml
  1. 查看是否生效
kubectl get certificate -n traefik

要保证ready状态为 true,如果一直出错 就去对用的pods去查找错误,但是一般也不会出错,如果按步骤来的

  1. 配置上面的tls (即helm安装traefik时的自定义配置文件里面的tlsStore选项)
tlsStore:
  default:
    defaultCertificate:
      secretName: wildcard-example-com-tls

至此,ssl相关的配置已经结束了

配置ssl的demo

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: example-com-tls
spec:
  entryPoints:
    - web 
  routes:
  - match: Host(`test.example.com`)
    kind: Rule
    services:
    - name: XXXX
      port: 80

(2024-06-24 追加)对接管局

前两天收到百度云发来的短信跟邮件,说我的域名检测有问题,大概两点,1.域名解析服务在境外(因为我使用了cloudflare)2.网站首页没有显示备案号跟工信部查询地址

这里的解决方案是将自己的dns解析服务使用国内的提供商 例如阿里云

部署wordpress

详见下一篇部署bitnami下的服务

部署IngressRoute

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: example-com
spec:
  entryPoints:
    - web 
  routes:
  - match: Host(`test.example.com`)
    kind: Rule
    services:
    - name: wordpress
      port: 80