Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

当我们搭建好k8s集群之后我们需要可以访问其内部应用。下面是我们在公司两套环境的访问方案。

  1. 生产环境,域名解析使用cloudflare,cloudflare是一个免费的域名负载均衡器和防火墙,非常好用。当我们的域名挂载到cloudflare上之后,cloudflare可以自动帮助我们连接ddos攻击和cc攻击。cloudflare的域名解析的ip地址配置成阿里云的slb,然后将slb的访问策略修改为IP白名单访问。仅允许cloudflare的ip访问这样可以屏蔽99%的流量攻击问题。slb之后是我们的ecs服务器端口,这些端口通过k8s的node pod映射到traefik的http端口上。treafik通过k8s的ingress将http流量发送到对应的业务系统。

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

cloudflare的可信ip:https://www.cloudflare.com/zh-tw/ips/

配置slb白名单

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

点击设置后会弹出【访问控制设置】开启访问控制后选择白名单控制。默认情况下【选择访问控制策略组】是不存在的。需要点击创建访问控制策略组

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

点击创建后:

策略组名称:【建议直接设置为cloudflarev4】代表cloudflare IPV4。选择ip版本根据业务调整默认情况下都是ipv4;

批量添加IP地址/地址段和备注:这部分的内容建议直接从cloudflare的可信ip的网站中复制。

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

  1. 测试环境

测试环境有两种访问方式一种是在公司内部访问。一种是外网访问。

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

这里的外部访问需要通过一个有公网ip的服务器。可以通过以下几种方案解决,

  1. 购买阿里云ecs通过frp方式
  2. 拉一条企业宽带并购买公网ip。本人试过用家庭宽带,在路由器上做端口映射结果80端口和443端口不能访问。应该是运营商屏蔽了。
  3. 花生壳等第三方的ddns
  4. ZeroTier也需要购买一个阿里云的ecs

推荐采用第一种成本不算高而且可控性和稳定性都很好。

第二种方案的成本比较高,而且会受到运营商的影响。就像我们的公司是拉了两个不同运营商的宽带,只要有一条是好的采用第一个方案网络访问就不会受影响,而第二个方案如果域名映射到出问题的运营商ip上就必须要等网络恢复了。

第三种方案免费版的稳定性比较差,想要稳定性好就只能充会员。

安装Traefik

  1. 创建traefik-pv

因为traefik会通过阿里云为域名申请https证书,所以我们需要给traefik提供一个用来存储https证书的文件夹。此文件夹的读写频率不高所以采用k8s的pv来挂载我们nas的nfs文件夹。

首先要在nsa中创建一个共享文件夹并且将共享文件夹的nfs访问打开。

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

这样我们就创建了一个nfs的共享文件夹。接下来我们通过k8s的pv去挂载这个文件夹

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

名称:【根据业务情况确定】

卷插件:【NFS Share】必须选择这个

服务器:【建议填写nas-pv对应的域名】也可以填写ip

访问模式:都勾选

挂载选项:【vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,nolock】

这里的挂载选项中使用的nfs协议是nfs4的版本。需要查看自己的nas服务器是否支持。

最后点击保存即可

  1. 获取阿里云ALICLOUD_ACCESS_KEY

获取阿里云ALICLOUD_ACCESS_KEY是为了给traefis使用,traefis可以通过阿里云的api来给我们的网站生成证书。前提是这个网站的域名挂在阿里云的dns上。

阿里云域名控制=》域名列表中可以查看你持有的域名。

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

点击域名后可以查看域名dns服务器

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

生成ALICLOUD_ACCESS_KEY

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

点击创建按钮

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

保存:

AccessKey ID

AccessKey Secret

  1. 创建traefis配置文件

进入rancher的配置映射界面并点击添加配置映射

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

添加一个新的命名空间:traefik

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

# traefik.toml

# 日志级别调整成error
logLevel = "error"
# 跳过后端的证书安全验证,
## 有些应用的pod只提供了https端口,
## 而且https的证书是不可信的这时候如果不配置此参数traefik会报错
InsecureSkipVerify = true

# 默认访问的端点
defaultEntryPoints = ["http","https"]
[entryPoints]
	#配置http端点
  [entryPoints.http]
	#配置http端点的端口为主机(pod)所有ip的80端口
  address = ":80"
	# 是否开始http响应压缩
  compress = true 
	#配置https端点
  [entryPoints.https]
	#配置https端点的端口为主机(pod)所有ip的443端口
  address = ":443"
  compress = true
		#配置https端点的证书
    [entryPoints.https.tls]
      [[entryPoints.https.tls.certificates]]
			#配置https端点的默认证书文件
      CertFile = "/ssl/tls.crt"
      KeyFile = "/ssl/tls.key"
	#配置traefik 管理界面的端点
  [entryPoints.traefik]
	#配置traefik 管理界面的端点的端口
  address = ":8080"
    [entryPoints.traefik.auth]
      [entryPoints.traefik.auth.basic]
				#配置traefik 管理界面的端点的端口访问账号密码可以使用htpasswd命令生成
        users = ["user:password"]
[ping]
entryPoint = "http"
# 启用k8s Ingress发现
[kubernetes]
# 日志配置
[traefikLog]
  format = "json"
# https证书申请配置
[acme]
# 证书类型RSA2048或者RSA4096
KeyType = "RSA4096"
# 你的邮箱
email = "xxx@xxx.com"
# 证书文件的存储位置
storage = "/acme/acme.json"
# 在哪个端点上启用证书
entryPoint = "https"
# 根据http请求的host做路由解析
onHostRule = true
	# dns验证作用是证明域名是你的
  [acme.dnsChallenge]
	# dns验证的策略我们这里采用阿里云的dns验证
  provider = "alidns"
	# 用来做dns验证的dns服务器。这两个服务器是阿里云的dns服务器
  resolvers = ["223.5.5.5","223.6.6.6"]
[api]
  entryPoint = "traefik"
  dashboard = true
  1. 创建默认证书

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器

  1. 通过rancher安装traefik

Traefik:免费HTTPS证书自动申请与Kubernetes负载均衡器