本作品Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。由原作者转载自个人站点

概述

本文用于整理基于Kubernetes环境的Traefik部署与应用,实现Ingress Controller、七层/四层反向代理等功能。

本次演练环境为Kubernetes集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。

组件版本

配置过程

安装Traefik

  • 配置Helm Repo

    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
  • 安装Traefik

    本次演练中将traefik安装至kube-system命名空间,可根据需要替换。

    # deployment.replicas=3 设置Traefik部署副本数
    # pilot.dashboard=false 禁用Dashboard中Pilot链接。
    helm upgrade --install --namespace kube-system \
    --set deployment.replicas=3 \
    --set pilot.dashboard=false \
    traefik traefik/traefik
  • 其他准备工作

    获取traefik服务的负载均衡器地址。执行该命令,记录返回的EXTERNAL-IP地址备用。本次演练环境中,已将local.choral.io*.local.choral.io指向该地址。

    kubectl get svc traefik -n kube-system

    创建一个用于部署演练用对象的命名空间。本次演练中使用apps-choral命名空间,可根据需要替换。

    kubectl create namespace apps-choral

部署Dashboard

  • 创建IngressRoute

    创建一个IngressRoute,用于配置apidashboard的入口规则。

    本次演练中,使用traefik.local.choral.io域名访问Dashboard,可根据需要替换。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
    name: traefik-dashboard
    namespace: apps-choral
    spec:
    entryPoints:
    - web
    routes:
    - match: Host(`traefik.local.choral.io`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
    kind: Rule
    services:
    - name: api@internal
    kind: TraefikService
    EOF
  • 启用BasicAuth认证

    首先,创建一个用于保存用户名和密码的Secret,其中的users字段内容可使用htpassword工具生成。本次演练中,认证usernamepassword都是admin

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
    name: traefik-basicauth-secret
    namespace: apps-choral
    data:
    users: |2 # htpasswd -nb admin admin | openssl base64
    YWRtaW46e1NIQX0wRFBpS3VOSXJyVm1EOElVQ3V3MWhReE5xWmM9Cg==
    EOF

    创建一个Traefik中间件,用于对请求启用BasicAuth认证。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: Middleware
    metadata:
    name: traefik-basicauth
    namespace: apps-choral
    spec:
    basicAuth:
    realm: traefik.local.choral.io
    secret: traefik-basicauth-secret
    EOF

    更新DashboardIngressRoute,启用BasicAuth中间件。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
    name: traefik-dashboard
    namespace: apps-choral
    spec:
    entryPoints:
    - web
    routes:
    - match: Host(`traefik.local.choral.io`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
    kind: Rule
    services:
    - name: api@internal
    kind: TraefikService
    middlewares:
    - name: traefik-basicauth
    EOF

七层反向代理

HTTP应用示例

  • 部署whoami应用

    创建Deployment,部署whoami应用。

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: whoami
    namespace: apps-choral
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: whoami
    template:
    metadata:
    labels:
    app: whoami
    spec:
    containers:
    - name: whoami
    image: traefik/whoami:latest
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    EOF

    创建一个用于访问whoami应用的服务。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
    name: whoami
    namespace: apps-choral
    spec:
    type: ClusterIP
    ports:
    - protocol: TCP
    port: 80
    selector:
    app: whoami
    EOF

    创建一个Ingress,用于配置whoami应用的入口规则。

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: whoami
    namespace: apps-choral
    annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
    spec:
    rules:
    - host: local.choral.io
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: whoami
    port:
    number: 80
    EOF

启用TLS(HTTPS)

本次演练使用静态证书配置TLS,该证书被手动创建,应用于local.choral.io*.local.choral.io域名。

有关自动证书管理,可参考Cert Manager项目文档。

  • 更新Traefik运行参数

    # ports.web.redirectTo=websecure                          启用Web跳转至WebSecure
    # additionalArguments[0]=--entrypoints.websecure.http.tls Ingress默认启用TLS
    helm upgrade --install --namespace kube-system \
    --set deployment.replicas=3 \
    --set pilot.dashboard=false \
    --set ports.web.redirectTo=websecure \
    --set additionalArguments[0]=--entrypoints.websecure.http.tls \
    traefik traefik/traefik
  • 创建TLS证书Secret

    从已准备好的证书key文件和crt文件创建Secret

    kubectl create secret tls local-choral-io-tls -n kube-system --key=local.choral.io.key --cert=local.choral.io.crt
  • 更新DashboardIngressRoute

    更新DashboardIngressRoute,启用TLS配置。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRoute
    metadata:
    name: traefik-dashboard
    namespace: apps-choral
    spec:
    entryPoints:
    - websecure
    routes:
    - match: Host(`traefik.local.choral.io`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
    kind: Rule
    services:
    - name: api@internal
    kind: TraefikService
    middlewares:
    - name: traefik-basicauth
    tls:
    secretName: local-choral-io-tls
    EOF
  • 更新whoamiIngress

    更新whoamiIngress,启用TLS配置。

    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: whoami
    namespace: apps-choral
    annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    spec:
    tls:
    - secretName: local-choral-io-tls
    rules:
    - host: local.choral.io
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: whoami
    port:
    number: 80
    EOF

四层反向代理

TCP应用示例

  • 更新Traefik运行参数

    更新Traefik运行参数,创建新的EntryPoint

    # ports.whoamitcp.protocol=TCP     网络协议
    # ports.whoamitcp.port=8081 监听端口
    # ports.whoamitcp.exposedPort=8081 服务公开端口
    # ports.whoamitcp.expose=true 是否暴露端口
    helm upgrade --install --namespace kube-system \
    --set deployment.replicas=3 \
    --set pilot.dashboard=false \
    --set ports.web.redirectTo=websecure \
    --set additionalArguments[0]=--entrypoints.websecure.http.tls \
    --set ports.whoamitcp.protocol=TCP \
    --set ports.whoamitcp.port=8081 \
    --set ports.whoamitcp.exposedPort=8081 \
    --set ports.whoamitcp.expose=true \
    traefik traefik/traefik
  • 部署whoamitcp应用

    创建Deployment,部署whoamitcp应用。

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: whoamitcp
    namespace: apps-choral
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: whoamitcp
    template:
    metadata:
    labels:
    app: whoamitcp
    spec:
    containers:
    - name: whoamitcp
    image: traefik/whoamitcp:latest
    imagePullPolicy: IfNotPresent
    ports:
    - protocol: TCP
    containerPort: 8080
    EOF

    创建一个用于访问whoamitcp应用的服务。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
    name: whoamitcp
    namespace: apps-choral
    spec:
    type: ClusterIP
    ports:
    - protocol: TCP
    port: 8080
    selector:
    app: whoamitcp
    EOF

    创建一个IngressRouteTCP,用于配置whoamitcp应用的入口规则。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRouteTCP
    metadata:
    name: whoamitcp
    namespace: apps-choral
    spec:
    entryPoints:
    - whoamitcp
    routes:
    - match: HostSNI(\`*\`)
    services:
    - name: whoamitcp
    port: 8080
    EOF

    验证反向代理和服务运行状态。

    # `10.0.0.201`是`traefik`服务的负载均衡器地址(kubectl get svc traefik -n kube-system)
    echo "Hello" | socat - tcp4:10.0.0.201:8081
    # 终端回显如下内容
    Received: Hello

UDP应用示例

  • 更新Traefik运行参数

    更新Traefik运行参数,创建新的EntryPoint

    # ports.whoamiudp.protocol=UDP     网络协议
    # ports.whoamiudp.port=8082 监听端口
    # ports.whoamiudp.exposedPort=8082 服务公开端口
    # ports.whoamiudp.expose=true 是否暴露端口
    helm upgrade --install --namespace kube-system \
    --set deployment.replicas=3 \
    --set pilot.dashboard=false \
    --set ports.web.redirectTo=websecure \
    --set additionalArguments[0]=--entrypoints.websecure.http.tls \
    --set ports.whoamitcp.protocol=TCP \
    --set ports.whoamitcp.port=8081 \
    --set ports.whoamitcp.exposedPort=8081 \
    --set ports.whoamitcp.expose=true \
    --set ports.whoamiudp.protocol=UDP \
    --set ports.whoamiudp.port=8082 \
    --set ports.whoamiudp.exposedPort=8082 \
    --set ports.whoamiudp.expose=true \
    traefik traefik/traefik
  • 部署whoamiudp应用

    创建Deployment,部署whoamiudp应用。

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: whoamiudp
    namespace: apps-choral
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: whoamiudp
    template:
    metadata:
    labels:
    app: whoamiudp
    spec:
    containers:
    - name: whoamiudp
    image: traefik/whoamiudp:latest
    imagePullPolicy: IfNotPresent
    ports:
    - protocol: UDP
    containerPort: 8080
    EOF

    创建一个用于访问whoamiudp应用的服务。

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
    name: whoamiudp
    namespace: apps-choral
    spec:
    type: ClusterIP
    ports:
    - protocol: UDP
    port: 8080
    selector:
    app: whoamiudp
    EOF

    创建一个IngressRouteUDP,用于配置whoamiudp应用的入口规则。

    cat <<EOF | kubectl apply -f -
    apiVersion: traefik.containo.us/v1alpha1
    kind: IngressRouteUDP
    metadata:
    name: whoamiudp
    namespace: apps-choral
    spec:
    entryPoints:
    - whoamiudp
    routes:
    - services:
    - name: whoamiudp
    port: 8080
    EOF

    验证反向代理和服务运行状态。

    # `10.0.0.202`是`traefik-udp`服务的负载均衡器地址(kubectl get svc traefik-udp -n kube-system)
    echo "Hello" | socat - udp4:10.0.0.202:8082
    # 终端回显如下内容
    Received: Hello

参考资料

Kubernetes环境Traefik部署与应用的更多相关文章

  1. kubernetes环境部署单节点redis

    kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...

  2. Kubernetes容器集群管理环境 - 完整部署(中篇)

    接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...

  3. Kubernetes容器集群管理环境 - 完整部署(上篇)

    Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...

  4. Kubernetes容器集群管理环境 - 完整部署(下篇)

    在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程: 十一.Kubernetes集群插件 插件是Kubernete ...

  5. GitLab Runner部署(kubernetes环境)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Kubernetes集群部署关键知识总结

    Kubernetes集群部署需要安装的组件东西很多,过程复杂,对服务器环境要求很苛刻,最好是能连外网的环境下安装,有些组件还需要连google服务器下载,这一点一般很难满足,因此最好是能提前下载好准备 ...

  7. 基于Kubernetes集群部署skyDNS服务

    目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...

  8. Docker Kubernetes 环境搭建

    Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...

  9. 为Kubernetes集群部署本地镜像仓库

    目录贴:Kubernetes学习系列 经过之前两篇文章:Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应用了 ...

随机推荐

  1. Hadoop 3.1.1 - Yarn 服务 - 快速开始

    快速开始 本文描述了如何用 Yarn 服务框架在 Yarn 上部署服务. 配置和启动 HDFS 和 Yarn 组件 首先启动 HDFS 和 Yarn 的各个组件.为启用 Yarn 服务框架,添加以下参 ...

  2. 用Python预测双色球福利彩票中奖号码(请不要当真)

    前言 双色球是中国福利彩票的一种玩法. 红球一共6组,每组从1-33中抽取一个,六个互相不重复.然后蓝球是从1-16中抽取一个数字,这整个组成的双色球 python从零基础入门到实战 今天,我们就用P ...

  3. Mybatis学习笔记-日志

    日志工厂 如果一个数据库操作出现异常,在排错时,则需要日志 SLF4J Apache Commons Logging(COMMONS_LOGGING) LOG4J LOG4J2 JDK logging ...

  4. SpringBoot系列——动态定时任务

    前言 定时器是我们项目中经常会用到的,SpringBoot使用@Scheduled注解可以快速启用一个简单的定时器(详情请看我们之前的博客<SpringBoot系列--定时器>),然而这种 ...

  5. Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)

    一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ...

  6. Android招聘市场技术要求越来越高,从事三年开发是否应该考虑转行?

    这是在某论坛看到的一个网友的疑问,他说感觉现在Android 开发这条路越来越难走了.下面是他的分享: 本来已经做好了好几个月找不到工作的准备.不过这两周感觉面试机会还算可以.两周10个面试感觉刚刚好 ...

  7. Linux命令(四)之常用文件拷贝/移动,文件解压缩,文件查找等相关的操作

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  8. Nginx搭建与相关配置

    目录 一.Nginx简介 1.1 概述 1.2 Nginx与Apache的差异 二.编译安装Nginx服务 2.1 将nginx软件包传到主机/opt目录下 2.2.安装依赖包 2.3.添加模块编译安 ...

  9. Typora使用Gitee图床

    前言 现在比较流行的Markdown编辑器应该是Typora,但是Typora本身不支持本地上传图片的云端存储,所以当我们写博客的时候,需要上传图片,就得自己设置图床,今天给大家推荐一款免费的图床-G ...

  10. Qt列表等控件实现平滑滚动&deepin启动器存在的问题

    Qt列表等控件实现平滑滚动 Qt自带的的列表控件是不能平滑滚动的,但如果滚动速度快的话很容易引起视线丢失,体验效果很差.本篇主要讲述如何在Qt中对列表控件加入平滑滚动.文中以QScrollArea控件 ...