跳至主要內容
容器化后无损上下线解决方案

容器化后无损上下线解决方案

说明: 本文主要以 Spring Cloud 应用举例

1. 背景

绝大数事故发生在应用上下线发布阶段,所以要尽可能避免发布过程中由于应用自身代码问题对用户造成的影响。

业界发布规范:

  • 可灰度(可以通过 Argo Rollout/OpenKruise 支持)
  • 可观测(容器状态、容器速查大盘、发布/配置变更/K8s 事件、业务日志/业务埋点、jstack/jvm/gc、链路,主要是通过指标、事件、日志、链路几大类进行收集分析,后续可观测性会介绍具体方案及关键指标收集/汇聚/展示)
  • 可回滚(应用维度的快照回滚)

Clay原创大约 10 分钟云原生Kubernetes
镜像仓库凭证自动更新问题

镜像仓库凭证自动更新问题

问题:镜像仓库认证 secret 创建后,被 rancher 更新为 旧密码

解决方式:删除 项目id 相对应的namespace 下的 secret,停止自动同步更新

原因:之前 创建 镜像仓库凭证 是通过 rancher UI 创建,作用域为 项目下所有命令空间

排查思路:

  1. 查看 secrets 更新的时间,确认更新 agent 是哪里,确认更新时间,从 elk 查询 apiserver 审计日志,查看上下文操作的api记录
  2. 创建新的secret(作用域相同),进行复现,查看 apiserver审计日志,进行验证

Clay原创小于 1 分钟云原生Kubernetes故障排查
云原生落地

云原生落地

1. 上价值

从虚拟机到 Kubernetes 转变的收益

  1. 更高效的利用系统资源:虚拟化本身大概占用10%的宿主机资源消耗,在集群规模足够大的时候,这是一块非常大的资源浪费。
  2. 保证环境的一致性:环境不一致问题是容器镜像出现之前业界的通用问题,不利于业务的快速上线和稳定性。
  3. 加快资源交付和扩缩容:虚拟机创建流程冗长,各种初始化和配置资源准备耗时长且容易出错,而容器秒级启动,声明式的配置,降低出错概率,并内置智能负载均衡器。
  4. 强大的故障发现和自我修复能力:支持端口检查、url检查、脚本检查等多种健康检测方式,支持使用启动探针、就绪探针、存活探针,在应用出现问题时自动下线并重启。
  5. 支持弹性伸缩:可根据容器的内存、CPU使用率,调用QPS等,进行自动的扩缩容。

Clay原创大约 9 分钟云原生Kubernetes
弹性伸缩落地实践

弹性伸缩落地实践

1. 什么是 HPA ?

HPA(Horizontal Pod Autoscaler)是 Kubernetes 中的一种资源自动伸缩机制,用于根据某些指标动态调整 Pod 的副本数量。

2. 什么时候需要 HPA ?

  • 负载波动:当您的应用程序的负载经常发生波动时,HPA 可以自动调整 Pod 的副本数量,以适应负载的变化。例如,对于 Web 应用程序,在高峰期需要更多的副本以处理更多的请求,而在低谷期可以减少副本数量以节省资源。
  • 活动推广:当您的应用程序需要扩展以满足推广活动、新产品发布或突发事件带来的流量增加时,HPA 可以自动增加 Pod 的副本数量,以提供更高的容量和性能。这有助于保持应用程序的可用性和用户体验。
  • 定时弹性:大促期间,设置开始和结束时间,自动弹性扩缩容,不用人工干预,提高效率。
  • 节约成本:通过使用 HPA,您可以根据应用程序的负载需求自动调整 Pod 的副本数量。这可以帮助您避免过度分配资源,节省资源和成本。当负载较低时,HPA 可以减少副本数量,释放不必要的资源。

Clay原创大约 6 分钟云原生Kubernetes弹性伸缩
卸载 rancher 导致 node 被清空

卸载 rancher 导致 node 被清空

问题描述

集群的节点突然全都不见了 (kubectl get node 为空),导致集群瘫痪,但实际上节点对应的宿主机都还在。因为集群没开审计,所以也不太好查 node 是被什么删除的。

快速恢复

由于当时没有排查出来问题,当时批量重启了服务器,自动拉起 kubelet 重新注册 node,故障恢复。其实只是 k8s node 资源被删除,重启 kubelet 服务,自动注册即可。

根因分析(5 why)

从 kube-apiserver 日志中可以看到,DELETE node 的操作,导致 node 被清空


Clay大约 1 分钟云原生Kubernetes
Etcd 故障排查

Etcd 故障排查

Etcd 磁盘空间爆满解决方案

etcd默认的空间配额限制为2G,超出空间配额限制就会影响服务,所以需要定期清理

设置环境变量

ETCD_CA_CERT="/etc/kubernetes/pki/etcd/ca.crt"
ETCD_CERT="/etc/kubernetes/pki/etcd/server.crt"
ETCD_KEY="/etc/kubernetes/pki/etcd/server.key"
HOST_1=https://xxx.xxx.xxx.xxx:2379

Clay大约 2 分钟云原生etcd
故障复盘模版

故障复盘模版

1. 影响范围和故障时间线

影响范围

...

影响时间线(2022-xx-xx xx:xx ~ 2022-xx-xx xx:xx

...

2. 故障发生原因

故障现象

根因分析

...

3. Why 分析

5 why 分析法


Clay小于 1 分钟云原生Kubernetes
lvs 健康检查 k8s apiserver

lvs 健康检查 k8s apiserver

apiserver前面如果有lvs做高可用,lvs对apiserver做健康检测要注意不能使用tcp check,否则会触发报错

image-20220930112754483

改为SSL_GET

        SSL_GET {
          url {
          	path /healthz
          	status_code 200      
          }
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 6443
        }

Clay小于 1 分钟云原生Kubernetes
如何更新Terminating状态的命名空间

如何更新Terminating状态的命名空间

Kubernetes中namespace有两种常见的状态,即Active和Terminating状态,其中Terminating状态一般会比较少见,当对应的命名空间下还存在运行的资源,但该命名空间被删除时才会出现所谓的Terminating状态,这种情况下只要等待Kubernetes本身将命名空间下的资源回收后,该命名空间将会被系统自动删除。

但是在某些情况下,即使命名空间下没有运行的资源,但依然无法删除Terminating状态的命名空间的情况,它会一直卡在Terminating状态下。

解决这个问题的步骤为:


Clay大约 2 分钟云原生Kubernetes
2
3
4
5