您可以使用 Cloudflare 的 Zero Trust 平台通过 kubectl 连接到机器。
本演练涵盖了如何:
- 在 Cloudflare Access 中构建策略以保护机器
- 使用 kubectl 将机器连接到 Cloudflare 的网络
- 从客户端机器进行连接
准备工作
完成所需时间:
30 分钟
- 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
- 选择 Create new application(创建新应用程序)。
- 选择 Self-hosted and private(自托管和私有)。
- 选择 Add public hostname(添加公共主机名) 并输入子域。这将是您的应用程序可供用户使用的主机名。
- 创建新策略以控制谁可以访问该应用程序,或者选择现有策略。
- 按照其余自托管应用程序创建步骤发布该应用程序。
Cloudflare Tunnel 在此机器与 Cloudflare 网络之间创建了一个安全的、仅出站的连接。通过仅出站模式,您可以阻止对该机器的任何直接访问,并锁定任何外部暴露的入站入口点。因此,无需打开防火墙端口。
Cloudflare Tunnel 是通过 Cloudflare 的轻量级守护程序 cloudflared 实现的。按照 Downloads 页面上列出的说明在 DigitalOcean 机器上下载并安装 cloudflared。
运行以下命令以将 cloudflared 身份验证到您的 Cloudflare 账户中。
cloudflared tunnel logincloudflared 将打开浏览器窗口并提示您登录到您的 Cloudflare 账户。如果您在一台没有浏览器的机器上操作,或者浏览器窗口未启动,您可以从命令行输出中复制 URL,并在任何机器上的浏览器中访问该 URL。
选择列表中呈现的任何主机名。Cloudflare 将向您的账户范围分发一个证书。您不需要选择您将服务 Tunnel 的特定主机名。
接下来,使用以下命令创建一个隧道。
cloudflared tunnel create <NAME>将 <NAME> 替换为 Tunnel 的名称。此名称可以是任何值。单个 Tunnel 还可以为您的环境中的多个主机名提供到多个服务的流量,包括混合连接类型(如 SSH 和 HTTP)。
该命令将输出 Tunnel 的 ID 并生成相关的凭证文件。您可以随时使用以下命令列出账户中的 Tunnel。
cloudflared tunnel list您现在可以配置隧道以服务流量。
创建一个 cloudflared 可以访问的 YAML 文件。默认情况下,cloudflared 将在安装 cloudflared 的同一文件夹中寻找该文件。
vim ~/.cloudflared/config.yml接下来配置 Tunnel,将下面示例中的 ID 替换为上面创建的 Tunnel 的 ID。此外,将本示例中的主机名替换为使用 Cloudflare Access 配置的应用程序的主机名。
tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: /root/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json
ingress:
- hostname: azure.widgetcorp.tech
service: tcp://kubernetes.docker.internal:6443
originRequest:
proxyType: socks
- service: http_status:404
# Catch-all rule, which responds with 404 if traffic doesn't match any of
# the earlier rules您现在可以创建一条 DNS 记录,将流量路由到此 Tunnel。只要使用 ingress 规则定义了主机名,多条 DNS 记录就可以指向单个 Tunnel,并会将流量发送到配置的服务。
-
登录到 Cloudflare 仪表板 ↗并转到您域的 DNS Records(DNS 记录) 页面。
Go to Records ↗ -
选择 Add record(添加记录)。选择
CNAME作为记录类型。对于 Name(名称),选择您要创建 Tunnel 的主机名。这应与 Access 策略的主机名匹配。 -
对于 Target(目标),输入您的 Tunnel 的 ID,后跟
.cfargotunnel.com。例如:
6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com- 选择 Save(保存)。
您现在可以运行 Tunnel 将目标服务连接到 Cloudflare。使用以下命令运行 Tunnel,将 <NAME> 替换为为您的 Tunnel 创建的名称。
cloudflared tunnel run <NAME>我们推荐您将 cloudflared 作为服务运行,并将其配置为开机启动。
您现在可以使用 cloudflared 从客户端机器进行连接。
此示例使用 macOS 笔记本电脑。在 macOS 上,您可以使用 Homebrew 通过以下命令安装 cloudflared。
brew install cloudflared运行以下命令以创建从设备到 Cloudflare 的连接。可以指定任何可用端口。
cloudflared access tcp --hostname azure.widgetcorp.tech --url 127.0.0.1:1234运行此服务后,您可以运行 kubectl 命令,cloudflared 将启动浏览器窗口并提示用户使用您的 SSO 提供商进行身份验证。一旦通过身份验证,cloudflared 将在命令中指定的本地 URL 处向客户端机器暴露连接。
kubeconfig 目前不支持代理命令配置,尽管社区已提交了这样做的计划。在此期间,用户可以为集群的 API 服务器设置别名以节省时间。
alias kubeone="env HTTPS_PROXY=socks5://127.0.0.1:1234 kubectl"