Kubernetes滚动更新实践
前言
在我之前的项目中,对微服务升级采用的做法是删除整个namespace, 再重新应用所有yaml。 这种方式简单粗暴,但是不可避免的导致服务中断,影响了用户体验
为了解决更新服务导致的服务中断问题, Kubernetes提供了一种有效的服务升级方式 —— 滚动更新(Rolling Update)
什么是滚动更新(RollingUpdate)
滚动更新是一种部署策略。 允许用户逐步替换旧的Pod实例为新版本,而不是一次性替换所有Pod,从而实现零停机时间的部署更新。 解决了如下问题:
- 最小化停机时间, 滚动更新可以在不完全停止服务情况下进行,提高用户体验
- 故障恢复, 如果新版本出现问题,可以迅速回滚到之前的稳定版本
- 平滑流量迁移, 避免瞬间全部更新导致的流量冲击和服务中断
RollingUpdate策略有两个重要参数:
- maxUnavailable, 滚动更新时最多可以有多少个Pod不可用。 默认值为25%,这意味着如果有一个包含4个Pod的服务, 更新期间至少有3个Pod可用
- maxSurge, 滚动更新时可以临时超出期望副本数的额外Pod数, 默认值为25%
说明: 对于关键业务, 可以用保守的设置, 比如maxUnavailable=0, maxSurge=1; 较大的maxSurge可以加快更新速度,但增加了集群压力; 根据实际情况调整这两个参数
实践案例
写一个简单的微服务, Pod副本数设置为5, 观察Kubernetes滚动更新过程
过去15年A股的收益率如何?
来看一张经典的图
Rocky Linux 9安装RabbitMQ
环境准备
Rocky Linux 9
安装步骤
安装Signing Keys(签名密钥)
1 | rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc |
创建repo文件
在/etc/yum.repos.d/目录下创建一个名为rabbitmq.repo的文件,并添加以下内容:
VMware ESXi导出OVA文件中含有ISO文件,如何去除这个ISO
本文字数: 1.2k 阅读时长 ≈ 1 分钟
问题描述
我在VMware ESXi上,用官方Rockylinux minimal ISO装了一台Linux机器。导出OVA文件发现大小有3个G。查看OVA文件,发现有个ISO文件占了2G,这个ISO文件用不到,如何删除?
1 | # tar tvf va.ova |
解决方法
Poweroff虚拟机,修改虚拟机配置,把光驱删掉,再重新导出OVA即可
判断SSH的公钥和私钥是否为一对的方法
使用sshkey-gen命令判断
使用ssh-keygen -y命令可以从私钥文件中提取公钥。例如: 你的私钥文件是id_rsa,执行如下命令:
1 | ssh-keygen -y -f id_rsa > extracted_pubkey.pub |
将提取的公钥保存到extracted_pubkey.pub文件。再和你的公钥文件比较,看文件内容是否相同
1 | diff extracted_pubkey.pub id_rsa.pub |
Python Cheetsheet
整理如下内容:
- 数据结构和算法
- 常用库和使用方法示例
- Flask cheetsheet
k8s的ConfigMap是什么, 为什么设计ConfigMap, 如何使用ConfigMap
ConfigMap简介, 为什么设计ConfigMap
在k8s中, ConfigMap是一种API对象, 用于将非机密的配置数据存储到键值对中。
Configmap作用是, 把配置数据从应用代码中分隔开, 让镜像和配置文件解耦,实现了镜像的可移植性。
举例:
我有一个Squid(正向代理)的Pod, 需要获取用户配置的白名单做访问控制。 每个用户设置的白名单都不一样, 而且用户可以随时对白名单做增、删、改,所以这个白名单的配置不能写死在代码里。
可以把白名单配置存储到k8s的ConfigMap, 这样配置数据和镜像就实现了解耦,Pod中可以动态地获取白名单的配置。
如何使用ConfigMap
使用ConfigMap时, Pod可以将其用作环境变量、命令行参数或存储卷中的配置文件。
下面给出一个具体的案例,将ConfigMap用作存储卷中的配置文件,Pod中通过读取配置文件的内容,就获取到了配置信息。
kubernetes的三种探针ReadinessProbe、LivenessProbe和StartupProbe,以及使用示例
前言
k8s中的Pod由容器组成,容器运行的时候可能因为意外情况挂掉。为了保证服务的稳定性,在容器出现问题后能进行重启,k8s提供了3种探针
k8s的三种探针
为了探测容器状态,k8s提供了两个探针: LivenessProbe和ReadinessProbe
- LivenessProbe 存活性探针, 如果探测失败, 就根据Pod重启策略,判断是否要重启容器。
- ReadinessProbe 就绪性探针,如果检测失败,将Pod的IP:Port从对应endpoint列表中删除,防止流量转发到不可用Pod上
对于启动非常慢的应用, LivenessProbe和ReadinessProbe可能会一直检测失败,这会导致容器不停地重启。 所以k8s设计了第三种探针StartupProbe解决这个问题
- StartupProbe探针会阻塞LivenessProbe和ReadinessProbe, 直到满足StartupProbe(Pod完成启动),再启用LivenessProbe和ReadinessProbe
配置Nginx自签名SSL证书,支持HTTPS
配置Nginx自签名SSL证书的流程
- 生成一个SSL自签名证书
- 客户端机器信任这个自签名证书
- 修改RHEL服务器的Nginx配置
- 在客户机用curl测试HTTPS
生成一个SSL自签名证书
在RHEL服务器上, 用openssl命令生成一个自签名证书
1 | openssl genrsa -out server.key 2048 #生成一个2048位的RSA私钥,保存到server.key |
注: CN=www.petertest.com
需要换成你的服务器域名, 否则curl测试会报错