跳转到主内容

MINC:加速本地 K8s 开发

·阅读时间 6 分钟
Florent Benoit
首席软件工程师

在本地工作的开发人员通常寻求一种快速的内循环来编码、构建和测试他们的 OCI 镜像和 Kubernetes 应用程序。

例如,当在 Kubernetes Pod 中测试新镜像时,该镜像必须可以通过推送到私有或公共注册表来访问,或者确保它在 Kubernetes 集群节点上可用。这通常需要额外的命令,例如 kind load docker-imageminikube cache add <image>,或将镜像发布到第三方注册表。

在这篇博文中,我们将介绍一个名为 MINC (MicroShift IN Container) 的新扩展,它提供了一个运行在现有 Podman Machine 环境中的 MicroShift 集群。

hero


介绍

之前的一篇博文概述了使用 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 构建镜像时,它会立即在集群中可用,无需上传或复制。

MINC 需要一个 rootful Podman 机器

确保机器以 rootful 模式运行,或者使用 --rootful 选项创建一台新机器。

创建本地 Kubernetes/MicroShift 集群

  1. 创建 MicroShift 集群

在资源视图中,点击 MINC 卡片并选择“创建新...”。目前,无需自定义——只需点击“下一步”。集群将自动启动。

  1. 验证您现在在状态栏左下角看到 microshift 作为默认的 Kubernetes 上下文,如果您进入左侧导航栏的 Kubernetes 部分,您可以在“节点”条目中看到 MicroShift 节点。

  2. 使用 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 扩展问题跟踪器上分享