首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >k8s 最小侵入方式解决云边通信问题

k8s 最小侵入方式解决云边通信问题

原创
作者头像
努力的gopher
发布2025-08-13 10:05:41
发布2025-08-13 10:05:41
2630
举报
文章被收录于专栏:AIOPSAIOPS

背景与目标

  • 现状:云端迁到阿里云(公网 IP,K8s 1.28.15 + flannel,Ubuntu 22.04,单节点);边缘端是 ARM Ubuntu 22.04 上的 Docker(host 网络)。
  • 诉求
  1. 保持最小改动(业务/容器不改)。
  2. 云 ↔ 边 双向通信
  3. 边缘端数量不固定,可随时接入。
  4. 尽量不动现网,直接“拉一张私有网”把双方连起来。
  • 选型:用 Headscale(自建控制面)+ Tailscale 客户端 组成一张 100.x 私网(WireGuard 隧道),云边都装客户端即可互通。

设计原则与架构

  • 最小侵入:不改 K8s 拓扑,不引入 service mesh;云端对外仍用 NodePort 对接,边缘直接打 云主机 Tailscale IP:NodePort
  • 可控 & 可扩展
  • 自建 Headscale,支持 标签(tag)+ ACL 控制访问、预授权密钥批量纳管。
  • 多边同时接入:可用同一把 edge 用的 reusable key,也可按租户/场站发不同 tag。
  • 可渐进:先跑 HTTP(8899)、关 IPv6、关 MagicDNS;稳定后再补 TLS/反代、或上 Operator/Subnet Router。

简图(逻辑)

代码语言:scss
复制
[边缘主机们] <--tailscale(100.x)--> [阿里云主机(云K8s节点)]  <—NodePort—>  [K8s服务/Pod]

                  \\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_ Headscale 控制面 (http://124.124.124.124:8899)

一、云端部署 Headscale(v0.26.1,Docker)

目录以 /data/workspace/software/headscale 为例。

  1. docker-compose.yml(固定镜像版本,避免 latest 漂移)
代码语言:yaml
复制
services:

  headscale:

    image: headscale/headscale:0.26.1

    command: ["serve"]

    restart: unless-stopped

    ports:

      - "8899:8899"

    volumes:

      - "/data/workspace/software/headscale/config:/etc/headscale"

      - "/data/workspace/software/headscale/data:/var/lib/headscale"
  1. config/config.yaml(v0.26.1 正确字段;仅 IPv4;关 MagicDNS)
代码语言:yaml
复制
server\_url: http://124.124.124.124:8899

listen\_addr: 0.0.0.0:8899

metrics\_listen\_addr: 127.0.0.1:9090



database:

  type: sqlite

  sqlite:

    path: /var/lib/headscale/db.sqlite



# v0.26 必需:TS v2 协议的 Noise 私钥(文件首次启动会自动生成)

noise:

  private\_key\_path: /var/lib/headscale/noise\_private.key



prefixes:

  v4: 100.64.0.0/10



dns:

  magic\_dns: false

  override\_local\_dns: false  # 先关掉覆盖;若设 true 就必须提供 nameservers.global



# 先不拉官方 DERP,避免访问外网

derp:

  urls:

    - https://controlplane.tailscale.com/derpmap/default

  auto\_update\_enabled: true

  update\_frequency: 24h

  paths: []



acl:

  policy\_path: /etc/headscale/acl.json
  1. config/acl.json(双向放行;可继续细化)
代码语言:json
复制
{

  "tagOwners": {

    "tag:cloud": ["\*"],

    "tag:edge":  ["\*"],

    "tag:supcon": ["\*"]

  },

  "acls": [

    { "action": "accept", "src": ["tag:edge"],  "dst": ["tag:cloud:\*"] },

    { "action": "accept", "src": ["tag:cloud"], "dst": ["tag:edge:\*"] }

  ]

}
  1. 启动
代码语言:shell
复制
cd /data/workspace/software/headscale

chmod 0777 ./data

docker compose up -d

docker compose logs -f headscale | tail -n 100

# 看到生成 noise 私钥 + 监听 0.0.0.0:8899 即成功

二、生成“超长效”预授权密钥(cloud / edge)

v0.26.1 的 --user 要传 数值 ID。你的 default1(已确认)。

代码语言:bash
复制
cd /data/workspace/software/headscale



# 幂等创建一个 ns,名字叫 default(已经存在会忽略)

docker compose exec -T headscale headscale users create default || true



# 查看用户对应的id,后面创建key的时候需要用 --user 后跟的就是这个id

docker compose exec -T headscale headscale users list



# 云端 key(可复用,100年)

docker compose exec -T headscale \

  headscale preauthkeys create --user 1 --reusable --expiration 876000h --tags tag:cloud -o json \

 | python3 -c 'import sys,json; print(json.load(sys.stdin)["key"])' \

 | tee cloud\_authkey.txt



# 边缘 key(可复用,100年)

docker compose exec -T headscale \

  headscale preauthkeys create --user 1 --reusable --expiration 876000h --tags tag:edge,tag:supcon -o json \

 | python3 -c 'import sys,json; print(json.load(sys.stdin)["key"])' \

 | tee edge\_authkey.txt



# 查看/确认

docker compose exec -T headscale headscale preauthkeys list --user 1

三、安装 Tailscale 客户端并加入 tailnet

两端都装,用同一台 Headscale,即可进入同一 100.x 私网。

云主机(hos-cloud-master)

代码语言:bash
复制
curl -fsSL https://tailscale.com/install.sh | sudo sh

sudo systemctl enable --now tailscaled



sudo tailscale up \

  --login-server=http://124.124.124.124:8899 \

  --authkey "$(cat /data/workspace/software/headscale/cloud\_authkey.txt)" \

  --hostname hos-cloud-master \

  --advertise-tags=tag:cloud \

  --ssh=false

tailscale ip -4

tailscale status

边缘主机(edge-supcon-robot01,ARM)

代码语言:bash
复制
curl -fsSL https://tailscale.com/install.sh | sudo sh

sudo systemctl enable --now tailscaled



sudo tailscale up \

  --login-server=http://112.124.10.230:8899 \

  --authkey "<把 edge\_authkey.txt 里那串粘过来>" \

  --hostname edge-supcon-robot01 \

  --advertise-tags=tag:edge,tag:supcon \

  --accept-routes --ssh=false



tailscale ip -4

tailscale status

说明:--ssh=false 关闭 Tailscale SSH,避免 ACL 提示;不影响隧道连通。

四、访问路径与验证

  • 边 → 云(K8s 服务):用云主机的 Tailscale IPv4(100.x)+ NodePort
代码语言:bash
复制
# 在云主机查 100.x
tailscale ip -4   # 假设是 100.64.0.1

边缘访问云端 NodePort(举例 30080)

代码语言:bash
复制
curl -i http://100.64.0.1:30080/health
  • 云 → 边(容器 host 网络):直接用 边缘 Tailscale IP:业务端口

(你容器是 host 模式,所以端口直接暴露在边缘宿主上。)

  • 连通性
代码语言:bash
复制
  tailscale ping -c 5 hos-cloud-master
  tailscale ping -c 5 edge-supcon-robot01

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景与目标
  • 设计原则与架构
  • 一、云端部署 Headscale(v0.26.1,Docker)
  • 二、生成“超长效”预授权密钥(cloud / edge)
  • 三、安装 Tailscale 客户端并加入 tailnet
    • 云主机(hos-cloud-master)
    • 边缘主机(edge-supcon-robot01,ARM)
  • 四、访问路径与验证
  • 边缘访问云端 NodePort(举例 30080)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档