【发布时间】:2020-05-03 18:24:30
【问题描述】:
我的部署包括:
- 一个初始化容器
- 长期运行的服务
- 需要配置相关服务的 sidecar。
一旦配置了单独的服务,sidecar 的工作就完成了。但是,它不能终止,因为 Kubernetes 只会重新启动它。它不应该是 init 容器的一部分,因为它不应该阻止服务运行。
由于部署不允许OnFailurerestartPolicy,我目前的实现是让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)
【问题讨论】:
-
有趣的问题。不确定除了通过将 livenessProbe 设置为非常高的值来绕过它之外是否有任何干净的方法。
-
这个问题会特别受益于MCVE,因为很难用抽象的术语来谈论;也就是说,如果您可以控制 Pod 的
command:,那么command: ["bash", "-c", "long-running &\nexec the-main-service"]可能就是您要查找的内容 -
不是确切问题的答案,因为您想使用边车容器,但您也可以尝试查看是否可以为您的用例使用“启动后挂钩”。
-
我会看看我在 MCVE 方面能做些什么——这更多的是关于 kubernetes 配置还是底层服务?顺便说一句,运行多个进程的@mdaniel 有一个缺点,即如果
long-running崩溃,kubernetes 不会重新启动它,但这可能仍然是一个可以接受的权衡。
标签: kubernetes kubernetes-deployment