打造超级富容器开发环境(四):部署富容器

2024-06-10 09:35:47 浏览数 (1)

部署 YAML

编写 Kubernetes 的 YAML 来部署 devcontainer,示例:

代码语言:yaml复制
apiVersion: apps/v1
kind: DaemonSet
metadata:
  labels:
    app: devcontainer
  name: devcontainer
  namespace: devcontainer
spec:
  selector:
    matchLabels:
      app: devcontainer
  template:
    metadata:
      labels:
        app: devcontainer
    spec:
      containers:
        - image: your.registry.com/private/devcontainer:latest
          imagePullPolicy: IfNotPresent
          name: devcontainer
          tty: true
          stdin: true
          securityContext:
            privileged: true
            runAsUser: 0
            runAsGroup: 0
          volumeMounts:
            - mountPath: /host
              name: host
              mountPropagation: Bidirectional
            - mountPath: /sys/fs/cgroup
              name: cgroup
              readOnly: true
            - mountPath: /root
              name: root
            - mountPath: /data # host 与容器内保持一致的路径,可用于在容器内运行某些项目的容器构建脚本,路径一致方便host上的dockerd对项目路径mount进容器
              name: data
              mountPropagation: Bidirectional
      dnsPolicy: Default
      hostNetwork: true
      hostPID: false
      restartPolicy: Always
      terminationGracePeriodSeconds: 1
      volumes:
        - name: root
          hostPath:
            path: /data/root
            type: DirectoryOrCreate
        - name: cgroup
          hostPath:
            path: /sys/fs/cgroup
            type: Directory
        - name: host
          hostPath:
            path: /
            type: Directory
        - name: data
          hostPath:
            path: /data
            type: DirectoryOrCreate
  updateStrategy:
    rollingUpdate:
      maxSurge: 0
      maxUnavailable: 1
    type: RollingUpdate

要点解析

编写 YAMl 时注意以下关键点:

  • 镜像填写你构建 devcotnainer 时指定的镜像名称。
  • privileged 置为 true,使用特权容器,避免因权限问题各种报错。
  • dnsPolicy 置为 Default,表示容器内直接使用宿主机所使用的 DNS 解析,保持容器内外的 DNS 解析行为一致。
  • hostNetwork 置为 true,直接使用宿主机的网络,不使用容器网络(没必要)。
  • 将宿主机根目录挂载到容器内的 /host 下,这样就可以在容器内操作宿主机内任意文件,无需登录宿主机的 SSH。
  • 将宿主机的 cgroup 目录(/sys/fs/cgroup)挂载到容器内同路径位置,因为 systemd 依赖这个才能正常运行。
  • 将宿主机的 /data/root 挂载到容器的用户目录(/root),因为很多软件都会写入文件到用户目录下,如果不持久化,容器重启后就会丢失。
  • 将宿主机的 /data 挂载到容器内的相同路径,日常工作用到的源码都存放到 /data 的子目录,这样在容器内外路径都是一致的,避免构建镜像时因 client 和 server 识别到的路径不一致造成异常。

0 人点赞