5.5 pod就绪后发出信号

5.5 pod就绪后发出信号

还有一件关于Service和Ingress的事情需要考虑。已经了解到,如果pod的标签与服务的pod选择器相匹配,那么pod就将作为服务的后端。只要创建了具有适当标签的新pod,它就成为服务的一部分,并且请求开始被重定向到pod。但是,如果pod没有准备好,如何处理服务请求呢?

该pod可能需要时间来加载配置或数据,或者可能需要执行预热过程以防止第一个用户请求时间太长影响了用户体验。在这种情况下,不希望该pod立即开始接收请求,尤其是在运行的实例可以正确快速地处理请求的情况下。不要将请求转发到正在启动的pod中,直到完全准备就绪。

5.5.1 介绍就绪探针

在之前的章节中,了解了存活探针,以及它们如何通过确保异常容器自动重启来保持应用程序的正常运行。与存活探针类似,Kubernetes还允许为容器定义准备就绪探针。

就绪探测器会定期调用,并确定特定的pod是否接收客户端请求。当容器的准备就绪探测返回成功时,表示容器已准备好接收请求。

这个准备就绪的概念显然是每个容器特有的东西。Kubernetes只能检查在容器中运行的应用程序是否响应一个简单的GET/请求,或者它可以响应特定的URL路径(该URL导致应用程序执行一系列检查以确定它是否准备就绪)。考虑到应用程序的具体情况,这种确切的准备就绪的判定是应用程序开发人员的责任。

就绪探针的类型

像存活探针一样,就绪探针有三种类型:

  • Exec探针,执行进程的地方。容器的状态由进程的退出状态代码确定。
  • HTTP GET探针,向容器发送HTTP GET请求,通过响应的HTTP状态代码判断容器是否准备好。
  • TCP socket探针,它打开一个TCP连接到容器的指定端口。如果连接已建立,则认为容器已准备就绪。

了解就绪探针的操作

启动容器时,可以为Kubernetes配置一个等待时间,经过等待时间后才可以执行第一次准备就绪检查。之后,它会周期性地调用探针,并根据就绪探针的结果采取行动。如果某个pod报告它尚未准备就绪,则会从该服务中删除该pod。如果pod再次准备就绪,则重新添加pod。

与存活探针不同,如果容器未通过准备检查,则不会被终止或重新启动。这是存活探针与就绪探针之间的重要区别。存活探针通过杀死异常的容器并用新的正常容器替代它们来保持pod正常工作,而就绪探针确保只有准备好处理请求的pod才可以接收它们(请求)。这在容器启动时最为必要,当然在容器运行一段时间后也是有用的。如果一个容器的就绪探测失败,则将该容器从端点对象中移除。连接到该服务的客户端不会被重定向到pod。这和pod与服务的标签选择器完全不匹配的效果相同。

了解就绪探针的重要性

设想一组pod(例如,运行应用程序服务器的pod)取决于另一个pod(例如,后端数据库)提供的服务。如果任何一个前端连接点出现连接问题并且无法再访问数据库,那么就绪探针可能会告知Kubernetes该pod没有准备好处理任何请求。如果其他pod实例没有遇到类似的连接问题,则它们可以正常处理请求。就绪探针确保客户端只与正常的pod交互,并且永远不会知道系统存在问题。

5.5.2 向pod添加就绪探针

接下来,将通过修改Replication Controller的pod模板来为现有的pod添加就绪探针。

向pod template添加就绪探针

可以通过kubectl edit命令来向已存在的ReplicationController中的pod模板添加探针。

$ kubectl edit rs kubia

当在文本编辑器中打开ReplicationController的YAML时,在pod模板中查找容器规格,并将以下就绪探针定义添加到spec.template.spec.containers下的第一个容器。YAML看起来应该就像下面的代码清单。

代码清单5.17 RC创建带有就绪探针的pod:kubia-rc-readinessprobe.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kubia
  labels:
    app: kubia
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      app: kubia                    #简单的matchLabels选择器
  template:
    metadata:
      labels:
        app: kubia
    spec:                           #期望Pod实现的功能(即在pod中部署)
      containers:                   #生成container,与docker中的container是同一种
      - name: kubia                 #container的名称
        image: luksa/kubia:1.0
        readinessProbe:
          exec:
            command:
            - ls
            - /var/ready

就绪探针将定期在容器内执行 ls /var/ready 命令。如果文件存在,则ls命令返回退出码0,否则返回非零的退出码。如果文件存在,则就绪探针将成功;否则,它会失败。

定义这样一个奇怪的就绪探针的原因是,可以通过创建或删除有问题的文件来触发结果。该文件尚不存在,所以所有的pod现在应该报告没有准备好,是这样的吗?其实并不完全是,正如在前面章节中了解的那样,更改ReplicationController的pod模板对现有的pod没有影响。

换句话说,现有的所有pod仍没有定义准备就绪探针。可以通过使用kubectl get pods列出pod并查看READY列。需要删除pod并让它们通过ReplicationController重新创建。新的pod将进行就绪检查会一直失败,并且不会将其作为服务的端点,直到在每个pod中创建 /var/ready 文件。

观察并修改pod就绪状态

再次列出pod并检查它们是否准备好:

$ kubectl get po

READY列显示出没有一个容器准备好。现在通过创建 /var/ready 文件使其中一个文件的就绪探针返回成功,该文件的存在可以模拟就绪探针成功:

$ kubectl exec kubia-2r1qb -- touch /var/ready

使用 kubectl exec 命令在kubia-2r1qb的pod容器内执行touch命令。如果文件尚不存在,touch命令会创建该文件。就绪探针命令现在应该返回退出码0,这意味着探测成功,并且现在应该显示pod已准备就绪。现在去查看其状态:

$ kubectl get po kubia-2r1qb

该pod还没有准备好。有什么不对或者这是预期的结果吗?用 kubectl describe kube来获得更详细的关于pod的信息。输出应该包含以下内容:

Readiness exec [ls /var/ready] delay=0s timeout=1s period=10s #success=1 #failure=3

准备就绪探针会定期检查——默认情况下每10秒检查一次。由于尚未调用就绪探针,因此容器未准备好。但是最晚10秒钟内,该pod应该已经准备就绪,其IP应该列为service的endpoint(运行 kubectl get endpoint kubialoadbalancer 来确认)。

服务打向单独的pod

现在可以点击几次服务网址,查看每个请求都被重定向到这个pod:

$ curl http://130.211.53.173

即使有三个pod正在运行,但只有一个pod报告已准备好,因此是唯一的pod接收请求。如果现在删除该文件,则将再次从该服务中删除该容器。

5.5.3 了解就绪探针的实际作用

此模拟就绪探针仅用于演示就绪探针的功能。在实际应用中,应用程序是否可以(并且希望)接收客户端请求,决定了就绪探测应该返回成功或失败。

应该通过删除pod或更改pod标签而不是手动更改探针来从服务中手动移除pod。

提示 如果想要从某个服务中手动添加或删除pod,请将 enabled=true 作为标签添加到pod,以及服务的标签选择器中。当想要从服务中移除pod时,删除标签。

务必定义就绪探针

在总结本节之前,有两个关于就绪探针的要点,需要强调。首先,如果没有将就绪探针添加到pod中,它们几乎会立即成为服务端点。如果应用程序需要很长时间才能开始监听传入连接,则在服务启动但尚未准备好接收传入连接时,客户端请求将被转发到该pod。因此,客户端会看到“连接被拒绝”类型的错误。

提示 应该始终定义一个就绪探针,即使它只是向基准URL发送HTTP请求一样简单。

不要将停止pod的逻辑纳入就绪探针中

需要提及的另一件事情涉及pod生命周期结束(pod关闭),并且也与客户端出现连接错误相关。

当一个容器关闭时,运行在其中的应用程序通常会在收到终止信号后立即停止接收连接。因此,可能认为只要启动关机程序,就需要让就绪探针返回失败,以确保从所有服务中删除该pod。但这不是必需的,因为只要删除该容器,Kubernetes就会从所有服务中移除该容器。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335