MINC:加速本地 K8s 开发
在本地工作的开发人员通常寻求一种快速的内循环来编码、构建和测试他们的 OCI 镜像和 Kubernetes 应用程序。
例如,当在 Kubernetes Pod 中测试新镜像时,该镜像必须可以通过推送到私有或公共注册表来访问,或者确保它在 Kubernetes 集群节点上可用。这通常需要额外的命令,例如 kind load docker-image
、minikube cache add <image>
,或将镜像发布到第三方注册表。
在这篇博文中,我们将介绍一个名为 MINC (MicroShift IN Container)
的新扩展,它提供了一个运行在现有 Podman Machine 环境中的 MicroShift 集群。
介绍
之前的一篇博文概述了使用 Kind 或 Minikube 改进内部循环的各种方法。虽然这些方法可以提高性能,但仍然存在不足和某些复杂性。实现无缝工作流,即使用 Podman 构建镜像并立即在集群中可用——通常需要额外的步骤或复杂的配置。
Podman、Kubernetes/CRI-O 和 MicroShift
CRI-O 项目实现了 CRI 接口,并重用了来自 containers/image 项目的镜像管理,并使用 containers/storage 项目处理存储。
Podman 使用这些相同的库来读取和写入容器镜像,并将它们存储在 /var/lib/containers
目录中。
MINC 扩展以比以前的部署更高效的方式为开发人员启动 MicroShift 集群。与 OpenShift Local 扩展设置单独的虚拟机 (VM) 不同,MINC (Microshift IN Container) 在您现有的 Podman Machine(在 Windows 或 macOS 上)内部运行一个容器。这避免了运行两个 VM,一个用于 Kubernetes,另一个用于 Podman。
一个关键的好处是 MINC 容器共享 Podman 的镜像存储。当您使用 Podman 构建镜像时,它会立即在集群中可用,无需上传或复制。
确保机器以 rootful 模式运行,或者使用 --rootful
选项创建一台新机器。
创建本地 Kubernetes/MicroShift 集群
- 创建 MicroShift 集群
在资源视图中,点击 MINC 卡片并选择“创建新...”。目前,无需自定义——只需点击“下一步”。集群将自动启动。
-
验证您现在在状态栏左下角看到
microshift
作为默认的 Kubernetes 上下文,如果您进入左侧导航栏的 Kubernetes 部分,您可以在“节点”条目中看到 MicroShift 节点。 -
使用 CLI 验证
kubectl
设置
MINC 会使用新的 microshift
条目更新您的 $HOME/.kube/config
文件。检查状态栏的左下角,您应该看到 microshift
条目作为默认的 Kubernetes 上下文。
尝试列出所有 Pod
kubectl get -A pods
输出示例
NAMESPACE NAME READY STATUS
kube-flannel kube-flannel-ds-wjn2f 1/1 Running
kube-proxy kube-proxy-jh7r8 1/1 Running
kube-system csi-snapshot-controller-8d97d878f-l6q6j 1/1 Running
openshift-dns dns-default-zvdw9 2/2 Running
openshift-dns node-resolver-84twk 1/1 Running
openshift-ingress router-default-54c5757547-4jnfd 1/1 Running
openshift-service-ca service-ca-7977bdc4d4-ssjq2 1/1 Running
创建一个 Hello World 容器镜像
创建一个 Containerfile
FROM nginx
RUN echo '<!DOCTYPE html><html><head><title>Hello</title></head><body><h1>Hello from MINC</h1></body></html>' \
> /usr/share/nginx/html/index.html
或者快速创建它
echo 'FROM nginx:alpine
RUN echo "<!DOCTYPE html><html><head><title>Hello</title></head><body><h1>Hello from MINC</h1></body></html>" > /usr/share/nginx/html/index.html' > Containerfile
然后,使用 Podman Desktop 构建镜像,并提供名称 minc/nginx:hello-world
。
在 MicroShift 集群中验证镜像
在 MicroShift 容器内部,运行
crictl images | grep hello
您应该会看到类似以下内容:
docker.io/minc/nginx hello-world e7032b219ab03 51.1MB
镜像现在在 MicroShift 集群中可用。
从 UI 创建 Pod
点击镜像上的播放按钮以启动一个新容器。然后选择容器并点击“创建 Pod”。
使用 CLI 从此镜像部署 Pod
使用 kubectl
从镜像部署 Pod
kubectl run hello-world-pod --image=minc/nginx:hello-world --port=80
要检查 Pod 是否正在运行,请使用
kubectl get pods
预期输出
kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-world-pod 1/1 Running 0 6s
将此 Podman Pod 部署到 Kubernetes/MINC
选择 Pod 并点击 Kebab 菜单中的 Deploy to Kubernetes...
。您的 Pod 现在已部署到 MINC 集群。
如果您想使用 CLI/手动步骤
使用 CLI 为 Pod 创建服务
使用服务暴露 Pod
kubectl expose pod hello-world-pod --port=80 --target-port=80 --name=hello-world-service
创建路由(需要 oc CLI)
假设您的 PATH
中有 oc
CLI (OpenShift 客户端),创建一条路由
oc create route edge hello-world-route --service svc/hello-world-service --port 80 --wildcard-policy=None
列出所有路由
oc get routes
访问 Nginx 容器
点击 UI 中的路由将重定向到该页面。
无需 UI 也可以获取该信息。
检查 Nginx 容器是否可以通过路由访问。使用带有 curl 的 -k
标志来忽略自签名证书警告
curl -k "https://$(oc get route hello-world-route -ojsonpath='{.status.ingress[0].host}'):9443"
您也可以在浏览器中打开 URL(您需要忽略自签名证书警告)
open "https://$(oc get route hello-world-route -ojsonpath='{.status.ingress[0].host}'):9443"
您应该会看到消息:“Hello from MINC”🎉
这证实您的内部开发循环正在工作。一旦镜像构建完成,它就会立即在集群中可用。
视频演示
结论
使用 MINC 和 MINC 扩展显著缩短了容器镜像构建和测试之间的周转时间。
有反馈吗?请在 MINC 扩展问题跟踪器上分享