Kubernetes部署和初始化容器
我相信库伯内特斯有一个功能叫做。棒极了,因为我可以使用此功能等待我的postgres服务,并在web应用程序服务运行之前创建/迁移数据库Kubernetes部署和初始化容器,kubernetes,Kubernetes,我相信库伯内特斯有一个功能叫做。棒极了,因为我可以使用此功能等待我的postgres服务,并在web应用程序服务运行之前创建/迁移数据库 但是,似乎只能在Pod yaml文件中配置Init容器。有没有一种方法可以通过部署yaml文件实现这一点?或者我必须选择吗?对于这个用例,您可能希望使用就绪探测而不是init容器。看看这个和一个。还要注意的是,如果您担心的话,部署不会将流量发送到未报告准备就绪的pod 这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查DB端点/数据可用
但是,似乎只能在Pod yaml文件中配置Init容器。有没有一种方法可以通过部署yaml文件实现这一点?或者我必须选择吗?对于这个用例,您可能希望使用就绪探测而不是init容器。看看这个和一个。还要注意的是,如果您担心的话,部署不会将流量发送到未报告准备就绪的pod
这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查DB端点/数据可用性。这是一个简单的解决方案,与额外init容器的复杂性相反,它还具有正确检测数据库中断的优点。为避免混淆,我将回答您的具体问题。我同意奥斯温,你可能想考虑另一种方法。 是的,您可以在部署中使用init容器。这是一个使用旧样式(1.6之前)的示例,但它应该可以工作
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: 'nginx'
spec:
replicas: 1
selector:
matchLabels:
app: 'nginx'
template:
metadata:
labels:
app: 'nginx'
annotations:
pod.beta.kubernetes.io/init-containers: '[
{
"name": "install",
"image": "busybox",
"imagePullPolicy": "IfNotPresent",
"command": ["wget", "-O", "/application/index.html", "http://kubernetes.io/index.html"],
"volumeMounts": [
{
"name": "application",
"mountPath": "/application"
}
]
}
]'
spec:
volumes:
- name: 'application'
emptyDir: {}
containers:
- name: webserver
image: 'nginx'
ports:
- name: http
containerPort: 80
volumeMounts:
- name: 'application'
mountPath: '/application'
就这个问题而言,你一针见血。原来我在GCE上的群集仍然是1.5。您的代码可以工作,但我决定升级到1.6。然后我可以将
initContainers
放入部署yamlglad中,这很有帮助。@JamStar init容器是每个部署执行一次还是每个pod执行一次?@JavierHolguera你有没有发现init容器是每个部署执行一次还是每个pod执行一次?还有一种方法可以每次部署一次吗?init容器在真正的pod开始之前,所以每次部署一个。我认为init容器与就绪探测没有任何关系。初始化容器运行直到完成并成功退出,然后应用程序容器才会启动,根据文档,k8s将在启动应用程序容器之前等待所有初始化容器成功。Init容器设计用于运行有限的一次性pod启动任务,而就绪探测用于报告无限期运行的应用程序的状态。并不是所有的引导任务都适合放在应用程序容器中。@alexykot I没有试图详细说明init容器和就绪探测之间的关系,而是根据我们掌握的很少信息,为OP指出了一个可能适合其原始问题的解决方案。这是一种众所周知的模式,web服务器中的就绪性探测器只需在报告就绪之前检查数据库的可用性。这是一个简单的解决方案,而不是额外的init容器的复杂性。(将此添加到回答中)OPs最初的问题不仅是等待DB可用性,而且是“创建/迁移数据库”,这是readiness probe范围之外的一项单独的特定任务。DB可能不在容器中,例如,它可以是托管云实例。我不确定DB容器如何知道应用程序需要什么样的模式结构。据我所知,OPs的问题首先是关于initContainers
。我看不出数据库的位置(在集群或其他地方)与运行迁移的方式有什么关系,迁移是应用程序逻辑,而不是数据库服务器逻辑。所以我认为init容器是相关的。您可以将迁移逻辑放在应用程序启动或同一个pod中的initContainer中,我认为这两种方法都是合理的,而且都是有目的的。