背景

在 macOS 上使用 Docker Desktop、OrbStack 或 minikube 运行 Kubernetes 集群时,通常会遇到以下局限性:

  • 多节点支持不足:这些工具对多节点集群的支持较差,甚至根本不支持
  • 网络隔离问题:受限于 Docker 在 macOS 上的虚拟机实现,宿主机网络无法直接连通容器,导致本地开发环境难以访问集群内的服务

为了解决这些问题,我们可以使用 kindmirrord 的组合方案,在 macOS 上搭建一个支持多节点且与宿主机网络互通的 Kubernetes 开发环境。

工具介绍

kind

kind(Kubernetes in Docker)是一个使用 Docker 容器作为"节点"来运行本地 Kubernetes 集群的工具。它主要用于测试、开发和学习目的。

主要优点:

  • 快速创建和销毁集群
  • 支持多节点集群配置
  • 轻量级且易于使用
  • 支持 Kubernetes 的大部分功能

官方网站:https://kind.sigs.k8s.io/

mirrord

mirrord 是一个强大的开发工具,它允许你在本地运行应用程序时,直接连接到 Kubernetes 集群中的网络和资源。

主要特点:

  • 无需修改代码即可访问集群资源
  • 支持本地调试远程应用
  • 可以拦截和重定向网络流量
  • 支持多种编程语言

官方网站:https://mirrord.dev/

通过 mirrord,我们可以让本地进程无缝访问 Kubernetes 集群网络,这个方案对现有代码和配置没有任何侵入性。

环境安装步骤

1. 安装 Docker Desktop 或 OrbStack

Docker Desktop:

  • Docker 官网 下载 Docker Desktop for Mac
  • 安装并启动 Docker Desktop

OrbStack(推荐替代方案):

  • OrbStack 官网 下载安装包
  • OrbStack 相比 Docker Desktop 更轻量且性能更好,启动速度更快

2. 安装 kind

使用 Homebrew 安装:

brew install kind

3. 创建 kind 集群

创建集群配置文件 kind-multi-node.yaml,该配置文件声明了一个 control-plane 节点和三个 worker 节点:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: worker
  extraMounts:  # 节点挂载目录
  - hostPath: /Users/kernal/storage/openebs/node1  # 宿主机目录
    containerPath: /root  # 节点容器目录
- role: worker
  extraMounts:
    - hostPath: /Users/kernal/storage/openebs/node2
      containerPath: /root
- role: worker
  extraMounts:
  - hostPath: /Users/kernal/storage/openebs/node3
    containerPath: /root
- role: control-plane
  extraPortMappings:  # 将容器端口映射到宿主机端口,建议多配置几个端口,避免后续不够用时需要删除并重新创建集群
    - containerPort: 30000  # 容器内部端口号
      hostPort: 30000  # 宿主机端口号
      protocol: TCP  # 网络协议

执行以下命令创建集群:

kind create cluster --config kind-multi-node.yaml

4. 验证集群安装

使用 kubectl 验证集群是否创建成功:

kubectl get nodes

预期输出:

NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   10s   v1.32.2
kind-worker          Ready    <none>          10s   v1.32.2
kind-worker2         Ready    <none>          10s   v1.32.2
kind-worker3         Ready    <none>          10s   v1.32.2

5. 删除集群(可选)

如果需要删除集群,执行:

kind delete cluster

6. 安装 mirrord

使用 Homebrew 安装:

brew install metalbear-co/mirrord/mirrord

或使用安装脚本:

curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash

7. mirrord 使用方法

指定目标 Pod:

mirrord exec --target pod/app-pod-01 python main.py

不指定 target(推荐):

不指定 target 时,mirrord 会将进程直接放到 Kubernetes 集群的网络环境中执行:

mirrord exec python main.py

功能验证

测试 mirrord 网络连通性

为了验证 mirrord 是否能够正常访问集群内的服务,我们创建一个测试用的 Nginx 部署: 创建 nginx.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP

应用配置:

kubectl apply -f nginx.yaml

Nginx 服务的集群内访问地址为:http://nginx-service.default.svc.cluster.local

测试 1:直接在宿主机访问(预期失败)

curl http://nginx-service.default.svc.cluster.local

结果:

curl: (56) Recv failure: Connection reset by peer

由于宿主机无法直接访问集群内的 Service,连接失败是正常的。

测试 2:使用 mirrord 访问(预期成功)

mirrord exec -- curl http://nginx-service.default.svc.cluster.local

结果:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

可以看到,通过 mirrord 成功访问到了集群内的 Nginx 服务!

总结

通过以上步骤,我们成功在 macOS 上搭建了一个支持多节点且与宿主机网络互通的 Kubernetes 开发环境。这个方案的优势包括:

  • 多节点支持:kind 支持创建包含多个 worker 节点的集群
  • 网络互通:通过 mirrord 实现本地进程与集群网络的连通
  • 零侵入性:无需修改应用代码即可访问集群资源
  • 开发友好:可以在本地 IDE 中调试,同时访问集群内的服务