努力
加油

如何判断当前kubectl是通过公网还是私网连接阿里云K8s集群?

判断 kubectl 是通过公网还是私网连接阿里云 ACK(容器服务 Kubernetes 版)集群,核心在于查看你的本地机器与集群 Control Plane(API Server)之间的网络路由和 IP 地址。

在阿里云 ACK 中,集群通常提供两种访问方式:

  1. 公网访问:通过公网 IP 或域名访问,任何有公网权限的网络都能连上。
  2. 内网/私网访问:通过 VPC 内网 IP 或域名访问,仅限同一 VPC 或已配置云企业网/CEN 的局域网内访问。

以下是几种实用、准确的判断方法,按推荐程度排序:

方法一:直接检查 kubeconfig 中的 server 地址(最直观)

这是最直接的方法。kubectl 的连接信息存储在 ~/.kube/config 文件中。

cat ~/.kube/config | grep server

输出类似如下:

server: https://47.xxx.xxx.xxx:6443
# 或者
server: https://k8s-cn-hangzhou.aliyuncs.com:6443

如何判断:

  • 如果是公网 IP:IP 段属于阿里云公网 IP 池(如 47.x, 42.x, 106.x 等常见公网段),且你当前不在该 VPC 内网环境中,则大概率是公网。
  • 如果是内网 IP:IP 段通常是 10.x.x.x, 172.16.x.x - 172.31.x.x, 192.168.x.x,或者是阿里云特定的内网域名(如 cn-hangzhou.k8s.aliyuncs.com)。

⚠️ 注意:仅看 IP 段不够严谨,因为公网 IP 也可能被解析为内网地址(如果 DNS 配置了内网解析)。更可靠的是结合下一招。


方法二:使用 dig 或 nslookup 解析域名(推荐)

如果你的 server 地址是一个域名(比如 https://<cluster-id>.cn-hangzhou.alicontainer.com:6443 或自定义域名),那么关键在于这个域名在你的本地 DNS 环境下解析到了什么 IP。

# 替换为你的实际 server 域名
dig +short <your-cluster-domain>

例如:

dig +short cn-hangzhou.ack.aliyuncs.com

结果分析:

  • 如果返回的是 公网 IP(非 RFC1918 私网地址),说明当前 DNS 解析走的是公网。
  • 如果返回的是 私网 IP(如 10.x.x.x),说明当前环境能解析到内网地址,即走的是私网。

✅ 这是最准确的方式,因为 kubectl 最终连接的是 DNS 解析后的 IP。


方法三:使用 curl 测试连通性并观察源 IP(最真实)

你可以用 curl 模拟 kubectl 的请求,并查看服务器端看到的来源 IP。但 ACK 的 API Server 默认不返回客户端 IP 给普通用户,所以这个方法需要借助“中间人”或日志,不太实用。

更实用的变体是:从不同网络环境发起请求,对比延迟和路径。

# 在一个已知是内网的机器上执行
ping <server-ip-or-domain>
traceroute <server-ip-or-domain>
  • 如果 traceroute 第一跳就是阿里云内网节点,且没有经过公网出口,则是私网。
  • 如果经过公网路由(如经过运营商骨干网),则是公网。

方法四:通过阿里云控制台确认集群访问模式(根本原因)

有时候你不确定自己用的是哪个 kubeconfig,或者想从根本上确认集群支持哪种访问:

  1. 登录 阿里云容器服务控制台。
  2. 进入目标集群 -> 基本信息。
  3. 查看 访问方式 区域:
    • 如果显示 “公网”,则必须通过公网 IP/域名访问。
    • 如果显示 “内网”,则只能通过 VPC 内网访问。
    • 如果两者都有,说明集群同时启用了两种访问入口。

此时,你需要确认你本地的 kubeconfig 中使用的 endpoint 对应的是哪一个。


方法五:编程式验证(适用于脚本自动化)

如果你需要在代码中自动判断,可以这样做:

import socket
import ipaddress

def is_private_ip(ip_str):
    try:
        ip = ipaddress.ip_address(ip_str)
        return ip.is_private
    except ValueError:
        return False

# 假设你知道 server 的域名
domain = "cn-hangzhou.ack.aliyuncs.com"
ip = socket.gethostbyname(domain)

if is_private_ip(ip):
    print("✅ 当前通过私网连接")
else:
    print("❌ 当前通过公网连接")

总结与建议

场景 推荐方法 判断依据
快速手动检查 cat ~/.kube/config + dig 看 server 字段和 DNS 解析结果是否为私网 IP
自动化脚本 Python/Go 调用 socket.gethostbyname() 判断解析出的 IP 是否为 RFC1918 私网地址
根本排查 控制台查看集群访问模式 确认集群是否开启了内网/公网入口

最佳实践建议:

  • 生产环境强烈建议使用内网访问,更安全、延迟更低、无流量费用。
  • 如果你在网络(如家里、咖啡厅)需要管理集群,可以使用 SSH 隧道 或 Kubeconfig XX工具(如 kube-proxy 模式)将本地流量转发到内网,而不是直接使用公网 kubeconfig。
  • 确保你的 ~/.kube/config 中的 server 地址指向的是你期望的网络路径。可以通过切换不同的 kubeconfig 文件来测试。

这样就能清晰、准确地判断出当前 kubectl 是通过公网还是私网连接阿里云 K8s 集群了。