Skip to content

在 Kubernetes 上 使用 envd (试验性)

WARNING

这个特性还在试验阶段,这意味着它可能发生变化。

envd 允许你在 Kubernetes 上管理你的开发环境。你可以使用 envd 命令来创建、删除和更新开发环境。

在 Kubernetes 上运行 envd-server

这个功能需要在 Kubernetes 上运行一个 envd-server。envd-server 是一个软件,它可以帮助你更有效地管理你的 AI/ML 环境。它很容易使用,并包括广泛的功能。

你需要用 envd-server 资源库中提供的 helm chart 来部署它。

bash
$ git clone https://github.com/tensorchord/envd-server
$ cd ./envd-server
$ helm install envd-server ./manifests

你可以通过修改 values.yaml 文件来定制 envd-server。例如,你可以把server.debug 的值改为 true 以启用调试模式。

yaml
# envd server debug mode
server:
  debug: false
  noauth: true
  imagePullSecret: ""
  # Whether to run the database migration process
  migration: true
  # Leave blank will use ${image.Repository}-migration:${image.tag} as the migration image
  migrationImage: ""

配置镜像拉取 Secret (可选)

本页展示了如何创建一个 envd 服务实例,该实例使用一个 Secret 来从私有容器镜像注册或存储库中提取镜像。

如果你已经运行了 docker login,你可以将该凭证复制到 Kubernetes 中:

bash
kubectl create secret generic regcred \
    --from-file=.dockerconfigjson=<path/to/.docker/config.json> \
    --type=kubernetes.io/dockerconfigjson

然后你就可以检查这个 secret 了:

bash
kubectl get secret regcred --output=yaml

输出应该与下面类似:

yaml
apiVersion: v1
kind: Secret
metadata:
  ...
  name: regcred
  ...
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
type: kubernetes.io/dockerconfigjson

你可以使用这个 secret 来拉取镜像了:

bash
$ helm install --set server.imagePullSecret=regcred envd-server ./manifests

服务器将使用该 secret 来拉取镜像。如果你有任何问题,请参考 Kubernetes 文档中的指南

端口转发

然后,你需要把两个 TCP 端口转发到 localhost

bash
$ export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=envd-server,app.kubernetes.io/instance=envd-server" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --namespace default port-forward $POD_NAME 8080:8080 2222:2222

创建 envd 上下文

为了创建一个开发环境,你可以创建一个新的 envd 上下文,以告诉 envd 我们将使用 envd-server 来管理 Kubernetes 上的环境。

bash
$ envd context create --name envd-server --use --builder docker-container --runner envd-server --runner-address http://localhost:8080

在 Kubernetes 上创建环境

之后,你可以通过运行 envd run 命令(目前是一个隐藏的命令)来创建环境。

bash
$ envd login
$ envd run --image tensorchord/python-basic

或者你可以自己建立镜像并将其推送到注册站,然后运行 envd run 命令来创建环境。

bash
$ envd run --image <your-image>

你可以建立并将镜像推送到一个公共注册站。

bash
$ envd build --output type=image,name=docker.io/<loginname in docker hub>/<image>,push=true
$ envd login --username <username>
$ envd run --image <your-image>

Dashboard

你可以通过 http://localhost:8080/dashboard/ 访问 envd dashboard。

envd dashboard

envd dashboard

定制化

你可以通过在 Kubernetes 集群中添加一个 pod defaulting webhook 来定制这个环境。下面是一个例子envd-server-pod-webhook

这个 webhook 将会给 pod 添加一个环境变量 KUBE=true:

go
// Mutate returns a new mutated pod according to set env rules
func (se injectEnv) Mutate(pod *corev1.Pod) (*corev1.Pod, error) {
	se.Logger = se.Logger.WithField("mutation", se.Name())
	mpod := pod.DeepCopy()

	// build out env var slice
	envVars := []corev1.EnvVar{{
		Name:  "KUBE",
		Value: "true",
	}}

	// inject env vars into pod
	for _, envVar := range envVars {
		se.Logger.Debugf("pod env injected %s", envVar)
		injectEnvVar(mpod, envVar)
	}

	return mpod, nil
}

你可以用下面的命令来部署该 webhook。

bash
$ git clone https://github.com/tensorchord/envd-server-pod-webhook
$ cd ./envd-server-pod-webhook
$ make deploy

Released under the Apache-2.0 License. Built with VitePress.