阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

利用 Kubernetes Service 的 selector 无痛运维在线 pod

  • 2020-03-11
  • 本文字数:1645 字

    阅读完需:约 5 分钟

利用 Kubernetes Service 的 selector 无痛运维在线 pod

Kubernetes 有一个叫做 service 的功能,这个功能为 pod 提供负载均衡器的服务。当 pod 运行出现错误,或者停止工作的时候,有时候你想要从 service 上删除 pod 而不终止 pod。

Service & Endpoints

这个端点清单会自动更新 IP 地址和端口。因为对应的 pod 是根据定义在 service 上的标签选择器被选择出来的。这也就意味着 service 可以很轻松地跟 pod 本身结合。大家也可以看到选择器模式已经被运用到很多其它 Kubernetes 组件了,比如 Deployment,ReplicaSet。



由于端点清单是基于标签选择器自动更新的,所以我们通过更新在 pod 上的标签将行为异常的 pod 拿走,这样的话它就不会跟选择器匹配了。为了能够更新 service,将 pod 从中移除,我们需要一个良好设计的标签选择器。


所以,首先我们需要添加一个标签,这样就可以将任意 pod 从 service 中拿出来了。


现在让我们用 enabled 标签来创建一个 Deployment:



在我们的 service 中,我们在选择器中使用这些标签:



之后,创建我们的 Deployment 和 service,这个过程中,这些 pod 是保持运行的。



在这里,也是可以列出端点的。



假设 pod nginx-1802606028-1posu 服务异常,我们需要对其进行维护。首先让我们得到它的 pod IP。



现在,为了对 pod 进行维护,我们把 enabled 标签修改成除了“true”的其它东西。我们需要输入--overwrite 标志来强制更新已经存在的标签。



如果我们再次检查端点,我们就会注意到我们还是有两个端点。因为 Deployment 根据它的选择器发现它需要启动另一个 pod (进入维护状态的 pod 不再匹配 Deployment 的选择器导致符合要求的 pod 数量不及设定的数量)。



我们注意到,正在维护的 pod 已经不在端点上了。



现在我们可以对我们的 pod 进行维护。

维护

每个应用程序维护 pod 的方式都是不一样的,所以我在这里就不做深入了。然而,Kubernetes 很多功能都可以轻松连接到运行在你集群里的应用程序,所以在这里我简要描述一下。

kubectl attach

你可以连接到一个正在运行的 pod,通过标准输入发送数据,从标准输出获得调试信息。如果你的进程允许你在 stdin 上发送命令来获得关于内部状态的信息的话。但是,有些容器并不会创建 TTY。你能看到的是 stdout,这跟只使用 kubectl logs 差别不大。


kubectl exec

kubectl exec 意味着你可以在容器中执行命令。你可以使用它来做很多事情,可能要使用它来发送信号给容器中的进程。



或者,你可以开启一个 bash shell,如果你安装了 bash 的话。


kubectl port-forward

另一个有用的功能就是 port forward 了。我们可以用这个来转移本地端口到我们的 pod,这样的话我们就可以给它发送请求,并且看到它是如何回应的。



接着,我们就可以从另一个终端给它发送请求。


总结

标签选择器令维护 pod 变得容易。但是还是有些细节需要你注意一下的。

Service 和 Deployments

由于 Service 和 Deployment 都经常使用标签选择器,所以当你将一个 pod 从 service 中移除,它仍然可能是 Deployment 的一部分,这种情况也是可能的。在大多数情况下,这都是 OK 的,但是如果你有一个 Deployment,带有 HorizontalPodAutoscaler 的功能,那么 Deployment 久可能任意时刻缩容而删除你的 pod。同样,当单个的 pod 从 service 中拿出来的时候,它仍然可能对你的应用程序产生影响。鉴于这些原因,我建议同样也要将 Deployment 拿出来,并且用 Deployment 来启动一个替代的 pod。

将 Pods 放回到 Service

在我们的 pod 上完成维护之后,我们可能就想要把它放回到 service。这个可以通过再次更新标签来匹配 service 选择器。



这种维护方案对于 Petset 当中的 pod 或者是不能轻易重启的 pod 是一个很好的方法。但是如果我们使用 Deployment 的话,因为这些 pod 本身作为分片存在于整个 Deployment 中,并且这些 pod 在定义上就是可替换的,我们通常只需要简单地删除这个被维护的 pod。即使将它回添到 Deployment,这个 Deployment 也会注意到多了一个 pod,而删除其中的一个 pod。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/ecf-o3T2NpiEZ9ba6RbLuQ


2020-03-11 19:52591

评论

发布
暂无评论
发现更多内容

阿里首发MySQL“完美日记”,基础+优化+事务+集群+锁+主从复制+安全备份

Java架构追梦

Java MySQL 数据库 架构 面试

Java批量导入去除重复数据并返回结果,我差点就被放倒了

小Q

Java 学习 程序员 架构

甲方日常 50

句子

工作 随笔杂谈 日常

第八周学习性能优化 2 总结

三板斧

极客大学架构师训练营

iptables 端口转发

田振宇

SpringBoot启动原理

编程门槛 框架设计 spring Boot Starter】

腾讯WeMap,一颗“孢子”的数智化之旅

脑极体

阿里突遭断网断电!双11最惊险一幕刚刚曝光

Java架构师迁哥

搞微服务用阿里开源的 Nacos 真香啊!

阿里巴巴 开源 编程

「架构师训练营」第 4 周作业

小黄鱼

极客大学架构师训练营

一次完整的JVM堆外内存泄漏故障排查记录

Zhendong

浅谈程序员的“内卷化”

数据社

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,使用栈,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

【概念篇】你真正了解越来越火的“数据驱动” 吗?

Java架构师迁哥

双“11”搞促销?用贪心算法来盘他!

王磊

算法

spring-注入配置

Isuodut

面试官问我redis数据类型,我回答了8种

数据库 学习 面试

架构训练营-week8-数据结构与算法,网络,IO

于成龙

极客大学架构师训练营 架构训练营

【DevOps实践】企业应用场景众多,怎样选择合适的代码分支模型?

嘉为蓝鲸

git DevOps 软件开发 持续交付 代码管理

当Tomcat遇上Netty,我这一系列神操作,同事看了拍手叫绝

小Q

Java 学习 程序员 架构 面试

Reactor详解之:异常处理

程序那些事

响应式 reactor 程序那些事 响应式系统 响应式架构

架构师训练营 1 期 - 第八周 - 性能优化 2

三板斧

极客大学架构师训练营

MySQL 的 join 功能弱爆了?

程序员历小冰

MySQL postgres 多表join

面试蚂蚁金服,首战被MySQL惨虐,熬夜啃透这份阿里面经复盘一个月再战拿下P7offer

比伯

Java 程序员 架构 面试 阿里

技术干货:Apache Pulsar 在移动云上的应用

Apache Pulsar

大数据 开源 云原生 Apache Pulsar

Java动态修改LOGGER日志级别

Zhendong

Java Arthas

目标检测-框架之darknet-数据读取

Dreamer

要求自愿降薪,员工内心普遍满意:“服从”是如何发生的?

脑极体

双“11”搞促销?本文教你用贪心算法来盘他!

Java架构师迁哥

【Mycat】Mycat核心开发者带你看尽Mycat三大核心配置文件!!

冰河

分布式数据库 中间件 mycat

Pulsar Summit Asia 2020 | 场景案例论坛(下):多行业,多场景

Apache Pulsar

大数据 开源 Apache Pulsar

利用 Kubernetes Service 的 selector 无痛运维在线 pod_文化 & 方法_才云科技_InfoQ精选文章