背景
在 macOS 上使用 Docker Desktop、OrbStack 或 minikube 运行 Kubernetes 集群时,通常会遇到以下局限性:
- 多节点支持不足:这些工具对多节点集群的支持较差,甚至根本不支持
- 网络隔离问题:受限于 Docker 在 macOS 上的虚拟机实现,宿主机网络无法直接连通容器,导致本地开发环境难以访问集群内的服务
为了解决这些问题,我们可以使用 kind 和 mirrord 的组合方案,在 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 中调试,同时访问集群内的服务