跳转到内容
搜索文档

使用 kubectl 通过 Cloudflare Access 进行连接

最后更新 查看 MarkdownAgent 设置

您可以使用 Cloudflare 的 Zero Trust 平台通过 kubectl 连接到机器。

本演练涵盖了如何:

  • 在 Cloudflare Access 中构建策略以保护机器
  • 使用 kubectl 将机器连接到 Cloudflare 的网络
  • 从客户端机器进行连接

准备工作

完成所需时间:

30 分钟


创建 Access 策略

  1. 在 Cloudflare 仪表板 ↗中,转到 Zero Trust > Access controls(访问控制) > Applications(应用程序)。
  2. 选择 Create new application(创建新应用程序)。
  3. 选择 Self-hosted and private(自托管和私有)。
  4. 选择 Add public hostname(添加公共主机名) 并输入子域。这将是您的应用程序可供用户使用的主机名。
  5. 创建新策略以控制谁可以访问该应用程序,或者选择现有策略。
  6. 按照其余自托管应用程序创建步骤发布该应用程序。

安装 cloudflared

Cloudflare Tunnel 在此机器与 Cloudflare 网络之间创建了一个安全的、仅出站的连接。通过仅出站模式,您可以阻止对该机器的任何直接访问,并锁定任何外部暴露的入站入口点。因此,无需打开防火墙端口。

Cloudflare Tunnel 是通过 Cloudflare 的轻量级守护程序 cloudflared 实现的。按照 Downloads 页面上列出的说明在 DigitalOcean 机器上下载并安装 cloudflared。

对 cloudflared 进行身份验证

运行以下命令以将 cloudflared 身份验证到您的 Cloudflare 账户中。

cloudflared tunnel login

cloudflared 将打开浏览器窗口并提示您登录到您的 Cloudflare 账户。如果您在一台没有浏览器的机器上操作,或者浏览器窗口未启动,您可以从命令行输出中复制 URL,并在任何机器上的浏览器中访问该 URL。

选择列表中呈现的任何主机名。Cloudflare 将向您的账户范围分发一个证书。您不需要选择您将服务 Tunnel 的特定主机名。

创建 Tunnel

接下来,使用以下命令创建一个隧道。

cloudflared tunnel create <NAME>

将 <NAME> 替换为 Tunnel 的名称。此名称可以是任何值。单个 Tunnel 还可以为您的环境中的多个主机名提供到多个服务的流量,包括混合连接类型(如 SSH 和 HTTP)。

该命令将输出 Tunnel 的 ID 并生成相关的凭证文件。您可以随时使用以下命令列出账户中的 Tunnel。

cloudflared tunnel list

配置 Tunnel

您现在可以配置隧道以服务流量。

创建一个 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

路由到 Tunnel

您现在可以创建一条 DNS 记录,将流量路由到此 Tunnel。只要使用 ingress 规则定义了主机名,多条 DNS 记录就可以指向单个 Tunnel,并会将流量发送到配置的服务。

  1. 登录到 Cloudflare 仪表板 ↗并转到您域的 DNS Records(DNS 记录) 页面。

    Go to Records ↗
  2. 选择 Add record(添加记录)。选择 CNAME 作为记录类型。对于 Name(名称),选择您要创建 Tunnel 的主机名。这应与 Access 策略的主机名匹配。

  3. 对于 Target(目标),输入您的 Tunnel 的 ID,后跟 .cfargotunnel.com。例如:

  6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com
  1. 选择 Save(保存)。

运行 Tunnel

您现在可以运行 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"

这篇文档对您有帮助吗?