Kubernetes如何在容器运行之前将cfg文件复制到容器中?

18
我的服务需要一个 cfg 文件,在容器运行之前需要更改。因此,将 cfg 打包到 Docker 镜像中是不合适的。 我需要从集群复制到容器中,然后在容器中启动服务并读取该 cfg。
我该怎么做?
3个回答

11

我认为对于你的用例,初始化容器可能是最适合的选择。 初始化容器就像是在kubernetes pod中启动自己的容器之前可以运行的小型脚本,它们必须退出。您可以在初始化容器和容器之间的共享持久卷中更新此配置文件。

以下文章提供了一个很好的示例,说明如何完成这个过程:

https://medium.com/@jmarhee/using-initcontainers-to-pre-populate-volume-data-in-kubernetes-99f628cd4519

更新:

我在stackoverflow上找到了另一个答案,可能与此相关并能给出更好的解决方案:

can i use a configmap created from an init container in the pod


8
该中介文章链接损坏。 - yogihosting
更多信息:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-initialization/#create-a-pod-that-has-an-init-container - susenj

8

一个例子

输出

NAME          READY   STATUS    RESTARTS   AGE
cassandra-0   1/1     Running   0          70s
[root@green--1 ~]# k exec -it cassandra-0 -n green -- /bin/bash
root@cassandra-0:/# ls /config/cassandra/
cassandra.yaml

如何共享目录
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: cassandra
  namespace: green
  labels:
    app: cassandra
spec:
  serviceName: cassandra
  replicas: 1
  selector:
    matchLabels:
      app: cassandra
  template:
    metadata:
      labels:
        app: cassandra
    spec:
      terminationGracePeriodSeconds: 1800
      initContainers:
       - name: copy
         image: busybox:1.28
         command: ["/bin/sh", "-c", "cp /config/cassandra.yaml /config/cassandra/"]
         volumeMounts:
         - name: tmp-config
           mountPath: /config/cassandra/
         - name: cassandraconfig
           mountPath: /config/
      containers:
      - name: cassandra
        #image: gcr.io/google-samples/cassandra:v13
        image: cassandra:3.11.6
        imagePullPolicy: Always
        #command: [ "/bin/sh","-c","su cassandra && mkdir -p /etc/cassandra/ && cp /config/cassandra/cassandra.yaml /etc/cassandra/" ]
        ports:
        - containerPort: 7000
          name: intra-node
        - containerPort: 7001
          name: tls-intra-node
        - containerPort: 7199
          name: jmx
        - containerPort: 9042
          name: cql
        resources:
          limits:
            cpu: "500m"
            memory: 4Gi
          requests:
            cpu: "500m"
            memory: 4Gi
        securityContext:
          capabilities:
            add:
              - IPC_LOCK
        lifecycle:
          postStart:
            exec:
              command: 
              - /bin/sh
              - -c
              - "cp /config/cassandra/cassandra.yaml /etc/cassandra/"
          preStop:
            exec:
              command: 
              - /bin/sh
              - -c
              - nodetool drain
        env:
          - name: MAX_HEAP_SIZE
            value: 1G
          - name: HEAP_NEWSIZE
            value: 100M
          - name: CASSANDRA_SEEDS
            value: "cassandra-0.cassandra.green.svc.cluster.local"
          - name: CASSANDRA_CLUSTER_NAME
            value: "green"
          - name: CASSANDRA_DC
            value: "ee1-green"
          - name: CASSANDRA_RACK
            value: "Rack1-green"
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        readinessProbe:
          exec:
            command:
            - /bin/bash
            - -c
            - /ready-probe.sh
          initialDelaySeconds: 15
          timeoutSeconds: 55

        volumeMounts:
        - name: cassandradata
          mountPath: /cassandra_data

        - name: tmp-config
          mountPath: /config/cassandra/

      volumes: 
      - name: cassandraconfig
        configMap:
          name: cassandraconfig
      - name: tmp-config
        emptyDir: {}
      # 1 Creating a volume to move date from init container to main container without making mount ReadOnly

  # These are converted to volume claims by the controller
  # and mounted at the paths mentioned above.

  volumeClaimTemplates:
  - metadata:
      name: cassandradata
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: rook-ceph-block
      resources:
        requests:
          storage: 5Gi

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接