Kubernetes环境Traefik部署与应用
本作品由Galen Suen采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。由原作者转载自个人站点。
概述
本文用于整理基于Kubernetes环境的Traefik部署与应用,实现Ingress Controller、七层/四层反向代理等功能。
本次演练环境为Kubernetes
集群环境,环境配置可参考笔者另一篇笔记《Kubernetes集群部署笔记》。
组件版本
Traefik v2.5.1
Traefik Helm Chart v10.3.2
配置过程
安装Traefik
-
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
,用于配置api
和dashboard
的入口规则。本次演练中,使用
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
工具生成。本次演练中,认证username
和password
都是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
更新
Dashboard
的IngressRoute
,启用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
更新
Dashboard
的IngressRoute
更新
Dashboard
的IngressRoute
,启用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
更新
whoami
的Ingress
更新
whoami
的Ingress
,启用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部署与应用的更多相关文章
- kubernetes环境部署单节点redis
kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...
- Kubernetes容器集群管理环境 - 完整部署(中篇)
接着Kubernetes容器集群管理环境 - 完整部署(上篇)继续往下部署: 八.部署master节点master节点的kube-apiserver.kube-scheduler 和 kube-con ...
- Kubernetes容器集群管理环境 - 完整部署(上篇)
Kubernetes(通常称为"K8S")是Google开源的容器集群管理系统.其设计目标是在主机集群之间提供一个能够自动化部署.可拓展.应用容器可运营的平台.Kubernetes ...
- Kubernetes容器集群管理环境 - 完整部署(下篇)
在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程: 十一.Kubernetes集群插件 插件是Kubernete ...
- GitLab Runner部署(kubernetes环境)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Kubernetes集群部署关键知识总结
Kubernetes集群部署需要安装的组件东西很多,过程复杂,对服务器环境要求很苛刻,最好是能连外网的环境下安装,有些组件还需要连google服务器下载,这一点一般很难满足,因此最好是能提前下载好准备 ...
- 基于Kubernetes集群部署skyDNS服务
目录贴:Kubernetes学习系列 在之前几篇文章的基础,(Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard.为Kubernetes集群部署本地镜像仓库 ...
- Docker Kubernetes 环境搭建
Docker Kubernetes 环境搭建 节点规划 版本 系统:Centos 7.4 x64 Docker版本:18.09.0 Kubernetes版本:v1.8 etcd存储版本:etcd-3. ...
- 为Kubernetes集群部署本地镜像仓库
目录贴:Kubernetes学习系列 经过之前两篇文章:Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应用了 ...
随机推荐
- SpringBoot 默认json解析器详解和字段序列化自定义
前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...
- 看完就会的Spring Cloud Gateway
在前面几节,我给大家介绍了当一个系统拆分成微服务后,会产生的问题与解决方案:服务如何发现与管理(Nacos注册中心实战),服务与服务如何通信(Ribbon, Feign实战) 今天我们就来聊一聊另一个 ...
- shell $? 状态码含义
Linux 使用了$? 来保存上个执行的命令的退出状态码. 0 命令成功结束 1 通用未知错误 2 误用she ...
- 靶机DC-2 rbash绕过+git提权
这个靶机和DC-1一样,一共5个flag.全部拿到通关. root@kali:/home/kali# nmap -sP 192.168.1.* 先扫一下靶机的IP地址,拿到靶机的地址为192.168. ...
- selenium元素定位之 动态id, class元素定位
1.直接进入正题 如下图, 有些元素每次进入都会刷新, 造成元素无法重复定位 怎么办? "xpath部分属性值"定位方法可以帮到我们 1.包含属性定位 driver.find_el ...
- 我一个五年Android开发,居然被一个技术不如我的面试官嫌弃了......
背景 首先介绍一下自己的情况.目前所在的是一家小的创业公司,待了5年多,薪资一般吧.由于这几年公司也在转型.工作经历大概可以分为 3 个阶段. 第一阶段是从进公司开始做 android app 开发, ...
- 37岁Android程序员裸辞,四个月被497家公司拒绝,问猎头后懵了
一位网友在职场论坛上发了一个帖子,他说自己今年三十七岁了,是一名Android老兵,因为和上家公司的领导闹矛盾有了嫌隙,一气之下就裸辞了,如今已经辞职四个月了,也失业了四个月. 每天都在努力投简历,共 ...
- 项目中redisTemplate设置的key,redis客户端上查询不到的问题
再项目使用了redis储存key,测试需要在客户端删除对应的key,发现查询不到对应的key redis客户端: 发现redisTemplate实际存进去的key会多了几个字符 原因:程序中对key没 ...
- The Apache Tomcat Native library which allows using OpenSSL was not found on the java.library.path 问题解决记录
1.问题 启动Tomcat之后,在浏览器输入IP后显示503,查看catalina.log发现报错: 2.问题定位:缺少 tomcat-native library 就是说 缺少Tomcat Nati ...
- gcc limits.h的bug定位看include_next和默认搜索路径
手编的交叉编译工具链经常报一堆宏未定义,例如下面是编译gtest的时候报_POSIX_PATH_MAX宏未定义,有时还会上报SSIZE_MAX等宏未定义: googletest/src/gtest-f ...