gpt4 book ai didi

kubernetes - 如何允许(sidecar)容器在 Kubernetes 部署中终止而不重新启动?

转载 作者:行者123 更新时间:2023-12-02 12:29:45 27 4
gpt4 key购买 nike

我的部署包括:

  • 一个初始化容器
  • 长期服务
  • 需要配置相关服务的 sidecar。

  • 一旦配置了单独的服务,sidecar 的工作就完成了。但是,它不能终止,因为 Kubernetes 只会重新启动它。它不应该是 init 容器的一部分,因为它不应该阻止服务运行。

    由于部署不允许 OnFailure restartPolicy,我目前的实现是让sidecar在完成配置任务后进入休眠状态。

    有没有办法让容器在部署不重启的情况下终止?或者,有没有办法让 init 容器与常规容器一起运行?

    解决 XY 问题的一些细节:
  • 该服务进行一些处理并将结果转储到数据库中。
  • 相关服务为存储在数据库中的值提供 API。
  • 这两个服务在不同的部署中,因为我预计它们会单独扩展。

  • 例子:
    #my-service.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: my-service
    spec:
    replicas: 1
    template:
    spec:
    initContainers:
    - name: my-service-init
    image: my-service
    imagePullPolicy: IfNotPresent
    env:
    - name: DATABASE_URL
    value: postgres://postgres:postgres_password@$db_host:5432/database
    args: ['init_script.py']
    containers:
    - name: my-service
    env:
    - name: DATABASE_URL
    value: postgres://db_role:db_password@$db_host:5432/database
    image: my-service
    imagePullPolicy: IfNotPresent
    args: ['main.py']
    - name: related-service-configure
    env:
    - name: RELATED_API_SERVICE_ADMIN_ENDPOINT
    value: http://related_api_service/api/
    image: my-service
    imagePullPolicy: IfNotPresent
    args: ['manage_related_service.py']
    #related-api-service.yaml
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: related-api-service
    spec:
    replicas: 1
    template:
    spec:
    containers:
    - name: related-api-service
    env:
    - name: DATABASE_URL
    value: postgres://db_role:db_password@$db_host:5432/database
    image: related-api-image
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 8080
    name: http
    protocol: TCP

    #manage_related_service.py
    import time
    import requests
    import json


    def upgrade_metadata(query_url, metadata_file):
    with open(metadata_file) as fp:
    metadata = json.load(fp)

    print(f"Querying {query_url}...")
    rsp = requests.post(query_url, json=metadata)
    response = rsp.json()
    print(f"Response to request was:\n{response}")
    if response.get('success') != 'True':
    raise ValueError("Metadata upgrade was not successful")


    if __name__ == '__main__':
    from environs import Env
    env = Env()
    env.read_env()

    RELATED_API_SERVICE_ADMIN_ENDPOINT = env("RELATED_API_SERVICE_ADMIN_ENDPOINT")
    METADATA_FILE = env("METADATA_FILE", "metadata.json")

    upgrade_metadata(RELATED_API_SERVICE_ADMIN_ENDPOINT, METADATA_FILE)

    # Once metadata has been uploaded, sleep forever
    while True:
    time.sleep(3600)

    最佳答案

    我认为你应该创建 Kubernestes Jobs而不是部署。然后你应该终止sidecar。之后特定的容器也会自动终止。

    您可以模拟特定的边车行为。有一个示例脚本可以帮助您这样做:

    containers:
    - name: example
    image: gcr.io/some/image:latest
    command: ["/bin/bash", "-c"]
    args:
    - |
    trap "touch /tmp/pod/main-terminated" EXIT
    /my-batch-job/bin/main --config=/config/my-job-config.yaml
    volumeMounts:
    - mountPath: /tmp/pod
    name: tmp-pod
    - name: envoy-container
    image: gcr.io/our-envoy-plus-bash-image:latest
    command: ["/bin/bash", "-c"]
    args:
    - |
    /usr/local/bin/envoy --config-path=/my-batch-job/etc/envoy.json &
    CHILD_PID=$!
    (while true; do if [[ -f "/tmp/pod/main-terminated" ]]; then kill $CHILD_PID; fi; sleep 1; done) &
    wait $CHILD_PID
    if [[ -f "/tmp/pod/main-terminated" ]]; then exit 0; fi
    volumeMounts:
    - mountPath: /tmp/pod
    name: tmp-pod
    readOnly: true
    volumes:
    - name: tmp-pod
    emptyDir: {}

    您可以在这里找到更多信息: sidecar-terminating , sidecars-behaviour .

    关于kubernetes - 如何允许(sidecar)容器在 Kubernetes 部署中终止而不重新启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59777620/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com