阿里云容器服务Kubernetes版(简称容器服务ACK)提供容器服务相关的技术架构以及核心组件的托管服务,对于非托管组件以及运行在ACK集群中的应用,不当操作可能会导致业务故障。为了更好地预估和避免相关的操作风险,在使用容器服务ACK前,请认真阅读本文中的建议与注意事项。

使用须知

数据面组件相关

数据面组件指运行在客户ECS服务器上的系统组件,例如CoreDNS、Ingress、kube-proxy、terway、kubelet等。由于数据面组件运行在客户ECS服务器上,因此数据面组件运行的稳定性需要阿里云容器服务与客户共同维护。

阿里云容器服务ACK对数据面组件提供以下支持:
  • 提供组件的参数化设置管理、定期功能优化、BugFix、CVE补丁等功能,并给出相应的指导文档。
  • 提供组件的监控与报警等可观测能力的建设,部分核心组件会提供组件日志,并通过SLS透出给客户。
  • 提供配置最佳实践和建议,容器服务将根据集群规模大小给出组件配置建议。
  • 提供组件的定期巡检能力和一定的报警通知能力,检查项包括但不限定于:组件版本、组件配置、组件负载、组件部署分布拓扑、组件实例数等。
您在使用数据面组件时,请遵循以下建议:
  • 使用最新的组件版本。组件经常会发布新版本以修复BUG或提供新特性。您需要在新版本的组件发布后,在保证业务稳定的前提下选择合适的时机,遵循组件升级指导文档中的说明进行升级操作。更多信息,请参见组件概述
  • 请在容器服务ACK的报警中心中设置联系人的邮箱地址、手机号码,并设置相应的报警信息接收方式,阿里云将通过这些渠道推送容器服务的报警信息、产品公告等。更多信息,请参见容器服务报警管理消息接收管理设置
  • 在您收到组件稳定性风险报告后,请及时按照相关指引进行处理,消除安全隐患。
  • 当您在使用数据面组件时,请通过容器服务控制台集群管理页面运维管理 > 组件管理的方式或者OpenAPI的方式配置组件的自定义参数。通过其他渠道修改组件配置可能会导致组件功能异常。更多信息,请参见管理组件
  • 请勿直接使用IaaS层产品的OpenAPI来变更组件的运行环境,包括但不限定于使用ECS的OpenAPI更改ECS运行状态、修改Worker节点的安全组配置、更改Worker节点的网络配置以及通过负载均衡的OpenAPI修改SLB配置等,擅自改动IaaS层资源可能会导致数据面组件异常。
  • 部分数据面组件受上游社区版组件影响,可能存在有Bug或漏洞,请注意及时升级组件,以避免开源组件Bug或漏洞导致您的业务受损。

集群升级相关

请务必通过容器服务ACK的集群升级功能升级集群的K8s版本,自行升级K8s版本可能导致ACK集群的稳定性和兼容性问题。详细操作,请参见升级ACK集群K8s版本

阿里云容器服务ACK对集群升级提供以下支持:
  • 提供集群K8s新版本的升级功能。
  • 提供K8s新版本升级的前置检查功能,确保集群当前状态支持升级。
  • 提供K8s新版本的版本说明文档,包括相较于前版本的变化。
  • 提示升级到K8s新版本时因资源变化可能会发生的风险。
您在使用集群升级功能时,请遵循以下建议:
  • 在集群升级前运行前置检查,并根据前置检查结果逐一修复集群升级的阻塞点。
  • 详细阅读K8s新版本的版本说明文档,并根据ACK所提示的升级风险确认集群和业务的状态,自行判断升级风险。详细信息,请参见Kubernetes版本发布概览
  • 由于集群升级不提供回滚功能,请做好充分的升级计划和预后备案。
  • 根据容器服务ACK的版本支持机制,在当前版本的支持周期内及时升级集群K8s版本。更多信息,请参见版本机制

Kubernetes原生配置相关

  • 请勿擅自修改Kubernetes的关键配置,例如以下文件的路径、链接和内容:
    • /var/lib/kubelet
    • /var/lib/docker
    • /etc/kubernetes
    • /etc/kubeadm
    • /var/lib/containerd
  • 在YAML模板中请勿使用Kubernetes集群预留的Annotation,否则会造成资源不可用、申请失败、异常等问题。以kubernetes.io/k8s.io/开头的标签为核心组件预留标签。违规示例:pv.kubernetes.io/bind-completed: "yes"。

注册集群相关

  • 通过容器服务管理控制台的注册集群功能接入外部Kubernetes集群时,请确保外部集群与阿里云之间的网络稳定性。
  • 容器服务ACK提供外部Kubernetes集群的注册接入,但无法管控外部集群自身的稳定性以及不当操作。因此当您通过注册集群配置外部集群节点的Label、Annotation、Tag等信息时,可能导致应用运行异常,请谨慎操作。

应用目录相关

为了丰富Kubernetes应用,容器服务ACK的应用市场提供了应用目录,它们是基于开源软件做了适配和二次开发的应用。ACK无法管控开源软件本身产生的缺陷,请知晓此风险。更多信息,请参见应用市场

高危操作

在使用容器服务ACK过程中相关功能模块存在高危操作,可能会对业务稳定性造成较大影响。在使用前请认真了解以下高危操作及其影响。

集群相关高危操作

分类 高危操作 影响 恢复方案
API Server 删除API Server所使用的SLB。 导致集群不可操作。 不可恢复,请重新创建集群。
Worker节点 修改集群内节点安全组。 可能导致节点不可用。 将节点重新添加到集群自动创建的节点安全组中,请参见ECS实例加入安全组
节点到期或被销毁。 该节点不可用。 不可恢复。
重装操作系统。 节点上组件被删除。 节点移出再加入集群。
自行升级节点组件版本。 可能导致节点无法使用。 回退到原始版本。
更改节点IP。 节点不可用。 改回原IP。
自行修改核心组件(kubelet、docker、containerd 等)参数。 可能导致节点不可用。 按照官网推荐配置参数。
修改操作系统配置。 可能导致节点不可用。 尝试还原配置项或删除节点重新购买。
Master节点(ACK专有版集群) 修改集群内节点安全组。 可能导致Master节点不可用。 将节点重新添加到集群自动创建的节点安全组中,请参见ECS实例加入安全组
节点到期或被销毁。 该Master节点不可用。 不可恢复。
重装操作系统。 Master节点上组件被删除。 不可恢复。
自行升级Master或者etcd组件版本。 可能导致集群无法使用。 回退到原始版本。
删除或格式化节点/etc/kubernetes等核心目录数据。 该Master节点不可用。 不可恢复。
更改节点IP。 该Master节点不可用。 改回原IP。
自行修改核心组件(etcd、kube-apiserver、docker等)参数。 可能导致Master节点不可用。 按照官网推荐配置参数。
自行更换Master或etcd 证书 可能导致集群无法使用。 不可恢复。
自行增加或减少Master节点。 可能导致集群无法使用。 不可恢复。
其他 通过RAM执行权限变更或修改操作。 集群部分资源如负载均衡可能无法创建成功。 恢复原先权限。

节点池相关高危操作

高危操作 影响 恢复方案
删除伸缩组。 导致节点池异常。 不可恢复,只能重建节点池。
通过kubectl移除节点。 节点池节点数显示和实际不符。 通过容器服务管理控制台或者节点池相关API移除指定节点(参见移除节点)或者修改节点池的期望节点数缩容(参见调整期望节点数)。
直接释放ECS实例。 可能导致节点池详情页面显示异常。开启期望节点数的节点池为维持期望节点数,将会根据相应节点池配置自动扩容到期望节点数。 不可恢复。正确做法是通过容器服务管理控制台或者节点池相关API修改节点池的期望节点数缩容(参见调整期望节点数)或移除指定节点(参见移除节点)。
对开启自动伸缩的节点池手动扩容或缩容。 自动伸缩组件会根据策略自动调整节点数,导致结果与期望不符。 不可恢复。自动伸缩节点池无需手动干预。
修改ESS伸缩组的最大或最小实例数。 可能导致扩缩容异常。
  • 对于未开启自动伸缩组的节点池,ESS伸缩组最大和最小实例数改为默认值2000和0。
  • 对于开启自动伸缩的节点池,将ESS伸缩组最大和最小实例数修改为与节点池最大和最小节点数一致。
添加已有节点前不做数据备份。 添加前实例上的数据丢失。 不可恢复。
  • 手动添加已有节点前必须对要保留的所有数据做提前备份。
  • 自动添加节点时会执行系统盘替盘操作,需要您提前备份保存在系统盘中的有用数据。
在节点系统盘中保存重要数据。 节点池的自愈操作可能通过重置节点配置的方式修复节点,因此可能导致系统盘数据丢失。 不可恢复。正确做法是将重要数据存放于额外的数据盘或者云盘、NAS、OSS。

网络与负载均衡相关高危操作

高危操作 影响 恢复方案
修改内核参数net.ipv4.ip_forward=0 网络不通。 修改内核参数为net.ipv4.ip_forward=1
修改内核参数:
  • net.ipv4.conf.all.rp_filter = 1|2
  • net.ipv4.conf.[ethX].rp_filter = 1|2
    说明 ethX代表所有以eth开头的网卡。
网络不通。 修改内核参数为:
  • net.ipv4.conf.all.rp_filter = 0
  • net.ipv4.conf.[ethX].rp_filter = 0
修改内核参数net.ipv4.tcp_tw_reuse = 1 导致Pod健康检查异常。 修改内核参数为net.ipv4.tcp_tw_reuse = 0
修改内核参数net.ipv4.tcp_tw_recycle = 1 导致NAT异常。 修改内核参数net.ipv4.tcp_tw_recycle = 0
修改内核参数net.ipv4.ip_local_port_range 导致网络偶发不通。 修改内核参数到默认值net.ipv4.ip_local_port_range="32768 60999"
安装防火墙软件,例如Firewalld或者ufw等。 导致容器网络不通。 卸载防火墙软件并重启节点。
节点安全组配置未放通容器 CIDR的53端口UDP。 集群内DNS无法正常工作。 按照官网推荐配置放通安全组。
修改或者删除ACK添加的SLB的标签。 导致SLB异常。 恢复SLB的标签。
通过负载均衡控制台修改ACK管理的SLB的配置,包括SLB、监听及虚拟服务器组。 导致SLB异常。 恢复SLB的配置。
移除Service中复用已有SLB的Annotation,即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} 导致SLB异常。 在Service中添加复用已有SLB的Annotation。
说明 复用已有SLB的Service无法直接修改为使用自动创建SLB的Service。您需要重新创建Service。
通过负载均衡控制台删除ACK创建的SLB。 可能导致集群网络异常。 通过删除Service的方式删除SLB。
在安装Nginx Ingress Controller组件的情况下手动删除 kube-system命名空间下的nginx-ingress-lb Service。 Ingress Controller工作不正常,严重时产生崩溃。 使用以下YAML新建一个同名Service。
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    app: nginx-ingress-lb
  name: nginx-ingress-lb
  namespace: kube-system
spec:
  externalTrafficPolicy: Local
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    port: 443
    protocol: TCP
    targetPort: 443
  selector:
    app: ingress-nginx
  type: LoadBalancer

存储相关高危操作

高危操作 影响 恢复方案
控制台手动解挂云盘。 Pod写入报IO Error。 重启Pod,手动清理节点挂载残留。
节点上umount磁盘挂载路径 Pod写入本地磁盘。 重启Pod。
节点上直接操作云盘。 Pod写入本地磁盘。 不可恢复。
多个Pod挂载相同云盘。 Pod写入本地磁盘或者报错IO Error。 确保一个云盘给一个Pod使用。
手动删除NAS挂载目录。 Pod写入报IO Error。 重启Pod。
删除在用的NAS盘或挂载点。 Pod出现IO Hang。 重启ECS节点。

日志相关高危操作

高危操作 影响 恢复方案
删除宿主机/tmp/ccs-log-collector/pos目录。 日志重复采集。 不可恢复。该目录下的文件记录了日志的采集位置。
删除宿主机/tmp/ccs-log-collector/buffer目录。 日志丢失。 不可恢复。该目录是待消费的日志缓存文件。
删除aliyunlogconfig CRD资源。 日志采集失效。 重新创建删除的CRD以及对应的资源,但失效期间日志无法恢复。

删除CRD会关联删除对应所有的实例,即使恢复CRD后还需要手动创建被删除的实例。

删除日志组件。 日志采集失效。 重新安装日志组件并手动恢复aliyunlogconfig CRD实例,删除期间日志无法恢复。

删除日志组件相当于删除aliyunlogconfig CRD以及日志采集器Logtail,期间日志采集能力全部丢失。