在 Google Cloud Engine 上将 code/files 直接注入 Kubernetes 中的容器

Inject code/files directly into a container in Kubernetes on Google Cloud Engine

如何将 code/files 直接注入 Google Cloud Engine 上 Kubernetes 中的容器,类似于使用 Docker 挂载主机文件/目录的方式,例如

docker run -d --name nginx -p 443:443 -v "/nginx.ssl.conf:/etc/nginx/conf.d/default.conf"

谢谢

我不确定你能不能做到这一点。 Kubernetes 做事的方式与 docker 截然不同,并且对于与您可能习惯于 docker.

的 'host' 进行交互来说并不是真正理想的选择

我想到了一些替代的可能性。首先,可能最不理想但最接近您要求的是在容器 运行 之后添加文件,方法是将 commandsargs 添加到 pod 规范,或者使用 kubectl exec 并将内容回显到文件中。其次是在该文件已存在的地方创建一个卷,例如创建 GCE 或 EBS 磁盘,添加该文件,然后将文件位置(只读)挂载到容器的规范中。第三,将在该文件或其他代码已存在的地方创建一个新的 docker 图像。

对于第一个选项,kubectl exec 将用于一次性工作,不是很 scalable/repeatable。运行时的任何 creation/fetching 都会增加容器启动时间的开销,因此我通常选择第三个选项,每当文件或代码更改时构建一个新的 docker 图像。更改得越多,您可能就越需要 CI 系统(如无人机)来帮助自动化流程。

如果我需要使用更多详细信息扩展这些选项中的任何一个,请添加评论。

Kubernetes 允许您将卷装载到您的 pod 中。一种这样的卷类型是 hostPath (link),它允许您将目录从主机挂载到 pod 中。

可以使用 ConfigMap 来实现该目标:

以下示例将 mariadb 配置文件挂载到 mariadb POD 中:

ConfigMap

apiVersion: v1
data:
  charset.cnf: |
    [client]
    # Default is Latin1, if you need UTF-8 set this (also in server section)
    default-character-set = utf8 

    [mysqld]
    #
    # * Character sets
    #
    # Default is Latin1, if you need UTF-8 set all this (also in client section)
    #
    character-set-server  = utf8 
    collation-server      = utf8_unicode_ci 

kind: ConfigMap
metadata:
  name: mariadb-configmap

MariaDB 部署

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mariadb
  labels:
    app: mariadb  
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: mariadb
        version: 10.1.16
    spec:
      containers:
      - name: mariadb
        image: mariadb:10.1.16
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mariadb
              key: rootpassword
        volumeMounts:
        - name: mariadb-data
          mountPath: /var/lib/mysql
        - name: mariadb-config-file
          mountPath: /etc/mysql/conf.d   
      volumes:
      - name: mariadb-data
        hostPath: 
          path: /var/lib/data/mariadb
      - name: mariadb-config-file
        configMap:
          name: mariadb-configmap

也可以使用 1.3 版 kubernetes 中提供的子路径功能,如所述here