当我们搭建好k8s集群之后我们需要可以访问其内部应用。下面是我们在公司两套环境的访问方案。
- 生产环境,域名解析使用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流量发送到对应的业务系统。

cloudflare的可信ip:https://www.cloudflare.com/zh-tw/ips/
配置slb白名单


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

点击创建后:
策略组名称:【建议直接设置为cloudflarev4】代表cloudflare IPV4。选择ip版本根据业务调整默认情况下都是ipv4;
批量添加IP地址/地址段和备注:这部分的内容建议直接从cloudflare的可信ip的网站中复制。

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

这里的外部访问需要通过一个有公网ip的服务器。可以通过以下几种方案解决,
- 购买阿里云ecs通过frp方式
- 拉一条企业宽带并购买公网ip。本人试过用家庭宽带,在路由器上做端口映射结果80端口和443端口不能访问。应该是运营商屏蔽了。
- 花生壳等第三方的ddns
- ZeroTier也需要购买一个阿里云的ecs
推荐采用第一种成本不算高而且可控性和稳定性都很好。
第二种方案的成本比较高,而且会受到运营商的影响。就像我们的公司是拉了两个不同运营商的宽带,只要有一条是好的采用第一个方案网络访问就不会受影响,而第二个方案如果域名映射到出问题的运营商ip上就必须要等网络恢复了。
第三种方案免费版的稳定性比较差,想要稳定性好就只能充会员。
安装Traefik
- 创建traefik-pv
因为traefik会通过阿里云为域名申请https证书,所以我们需要给traefik提供一个用来存储https证书的文件夹。此文件夹的读写频率不高所以采用k8s的pv来挂载我们nas的nfs文件夹。
首先要在nsa中创建一个共享文件夹并且将共享文件夹的nfs访问打开。

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


名称:【根据业务情况确定】
卷插件:【NFS Share】必须选择这个
服务器:【建议填写nas-pv对应的域名】也可以填写ip
访问模式:都勾选
挂载选项:【vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport,nolock】
这里的挂载选项中使用的nfs协议是nfs4的版本。需要查看自己的nas服务器是否支持。
最后点击保存即可
- 获取阿里云ALICLOUD_ACCESS_KEY
获取阿里云ALICLOUD_ACCESS_KEY是为了给traefis使用,traefis可以通过阿里云的api来给我们的网站生成证书。前提是这个网站的域名挂在阿里云的dns上。
阿里云域名控制=》域名列表中可以查看你持有的域名。

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

生成ALICLOUD_ACCESS_KEY

点击创建按钮

保存:
AccessKey ID
和
AccessKey Secret
- 创建traefis配置文件
进入rancher的配置映射界面并点击添加配置映射

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

# 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
- 创建默认证书

- 通过rancher安装traefik
