如何使用非无头服务创建有序的Kubernetes部署?

时间:2017-03-16 19:01:57

标签: kubernetes

我需要在pod3之前创建pod1和pod2。这意味着我需要订购。我还希望pod3在端口80外部暴露在外部(外部)。起初我以为我想在StatefulSet中组织这些创建。

然而,看起来状态集需要无头服务。

  

StatefulSets目前要求无头服务负责   对于Pod的网络身份。你有责任创造   这项服务。

这意味着

  

有时您不需要或不需要负载平衡和单个服务IP。在这种情况下,您可以通过指定"无"来创建“无头”服务。对于集群IP(spec.clusterIP)。

我需要在群集外部(通过服务)暴露pod3,无头服务不允许我这样做。在Kubernetes中这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

仅供参考,无头service可以与其他类型的loadBalancer共存,例如service。只需使用不同的名称和相同的selector创建其他container

更惯用的方法是更改​​pod3应用程序以处理数据库和API服务器的中断。 (应用程序不应该因为数据库或其他应用程序暂时无法访问而崩溃或无法使用。)我知道在某些应用程序中这并不容易(eh-hem,Ruby on Rails,eh-hem,)在这些情况下你可以写pod3 exec的入口点(EG bash脚本),该入口点只是循环直到它可以到达其他两个服务,然后使用#!/bin/bash while ! $(mysqladmin ping); do sleep 2 done exec node app.js # Or exec whatever arguments were passed to the container init. # exec $@ 替换进程并初始化pod3应用程序。我已经实现了这个并且效果很好。这是内存中的简化示例:

container

无论您是否可以改进应用程序或必须使用自定义入口点,都可以在pod3 endpoint上添加用于检查pod2和pod1可访问性的相同代码作为k8s readinessProbe。 - 这将确保pod3被移除/不会service添加到readinessProbe,直到pod通过。显然,这只有在你的应用程序在接触请求之前等待接收请求时才有用。

注意:如果您要将container抽象交换为container抽象,那么这一切都适用。一个pod中有statefulSet个。{/ p>

pod创建了相同statefulSet定义的近似副本,因此这不是您想要的抽象。相反,我会为您的数据库服务使用不同的deployment(以确保在其他地方启动之前关闭它),并为您的API服务器和应用程序使用2个不同的import pygame window = pygame.display.set_mode((800, 600)) while True: window.fill((255,255,255)) pygame.draw.circle(window, (0,0,0), (400, 300), 100, 5) pygame.display.flip() for e in pygame.event.get(): if e.type == pygame.QUIT: pygame.quit() quit() ,并在其中配置它们如上所述,初始订单无关紧要的方式。