用户数从 0 到亿,我的 K8s 踩坑血泪史

tJn每天发布大量与生活相关的资讯平台

导读:容器服务 Kubernetes 是目前炙手可热的云原生基础设施,作者过去一年上线了一个用户数极速增长的应用:该应用一个月内日活用户从零至四千万,用户数从零到一亿的裂变式增长,充分享受了容器服务快速简便的扩容操作和高可用特性。作者使用容器服务 Kubernetes 集群将公司内系统完全上云 1 年多,本篇文章记录了其中的踩坑与优化记录。

创建集群

创建集群时,做好规划,选择优化好的集群配置,可以大大减少后期运维工作,其中部分集群的配置在建立后再也没法修改或者修改极其麻烦。tJn每天发布大量与生活相关的资讯平台

集群规划

  • 网络规划:
  • 网络类型: Flannel、Terway

Terway 是阿里云容器服务自研的网络插件,功能上完全兼容 Flannel,如果保守,还是使用 Flannel tJn每天发布大量与生活相关的资讯平台

  • Pod 网络 CIDR

默认 16 的大网段,有效的网段或者其子网 10.0.0.0/8,172.16-31.0.0/12-16,192.168.0.0/16tJn每天发布大量与生活相关的资讯平台

  • Service CIDR
  • 默认 20 的网段,可选:10.0.0.0/16-24,172.16-31.0.0/16-24,192.168.0.0/16-24
  • 网段不能冲突重复,建立后没法修改;
  • 多个区域的多个交换机。
  • 公网访问 ApiServer
  • 对于线上等安全要求高的集群,可以选择不暴露 apiserver, 只有私网 SLB, 但是这样没法使用云效发布;
  • 日常预发等集群,可以暴露公网 SLB 到 apiserver, 集群建立后立即为 slb 建立访问控制,限制 slb 只能云效访问;

注: K8s 每次安全漏洞几乎都与 ApiServer 有关,对于线上 K8s 集群,要及时升级补丁,或者不开放公网 apiserver,使用严格的安全组和访问控制。tJn每天发布大量与生活相关的资讯平台

  • 安全组
  • 设置安全组限定访问范围,为 master 与 worker 机器使用。
  • Master 机器规划

为了高可用,一般使用 3 节点,Master 选择规则如下:tJn每天发布大量与生活相关的资讯平台

tJn每天发布大量与生活相关的资讯平台

master 机器的存储建议高性能的 50-100G SSD,因为会运行 ETCD,操作系统占用不超过 8G。tJn每天发布大量与生活相关的资讯平台

  • Worker 机器规划
  • 阿里云首推神龙机器,没有神龙机器的区域,选用高配 ECS,配置规格根据部署的 POD 规格乘以一定倍数,比如 Java 应用 pod 一般选择 4C8G,ECS 则购买 32C64G 或者 64C128G 为好,设置部署的时候为 pod 设置固定的 request/limit;
  • 我们选用的机器配置:
  • 32C64G ECS
  • 存储。系统盘:100G SSD, 数据盘:400G 高效云盘
  • 操作系统:centos 7.4 64 位

集群建立与配置

建立集群时设置:tJn每天发布大量与生活相关的资讯平台

  • 通过控制台建立集群,阿里云容器服务提供的非常简易的一键部署集群功能,通过向导完成 K8S 集群的建立;
  • 按照以上规划设置 master,worker 节点,挂载 /var/lib/docker 到数据盘;
  • 设置合理的 Pod 网络 CIDR, Service CIDR ip 网段;
  • 设置合理的安全策略,是否暴露 apiserver(需要直接云效发布的,需要开放公网暴露,并做严格的访问控制);
  • ingress 选择安全,可以使用内网,如果需要公网,可以在控制台很方便建立,同时做好访问控制;
  • kube-proxy 模式,因为 iptables 模式在更新一条规则时把 iptables 锁住引发的性能问题,建议使用 IPVS 模式;
  • 节点 POD 数量,默认 128 太大,一个节点不可能部署这么多,建议改为 64;
  • 节点服务端口访问 (NodePort,SLB),可以适当扩大,默认的也一般足够用。

集群配置修改:tJn每天发布大量与生活相关的资讯平台

  • 集群扩容,添加已有节点(节点配置参考上文,挂载数据盘使用 /var/lib/docker)
  • Master 机器升配:
  • worker 节点变配或者移除:
  • kubectl drain --ignore-daemonsets {node.name}
  • kubectl delete node {node.name}
  • ECS 升配变配
  • 添加已有节点到集群
  • 命名空间:
  • 按照应用分组建立 namespace,对于资源占用厉害需要限制的应用分组,设置该 NameSpace 的资源配额与限制;
  • 授权:
  • 子账号如何给其他子账号进行 RBAC 授权
  • 通过堡垒机按应用人员设置权限

部署设置

无状态部署tJn每天发布大量与生活相关的资讯平台

使用无状态部署 Deployment,参考这篇文章实现分批发布。tJn每天发布大量与生活相关的资讯平台

优化设置模板: tJn每天发布大量与生活相关的资讯平台

tJn每天发布大量与生活相关的资讯平台

服务设置

因为容器服务的 Cloud Controller Manager 会同步删除 service 建立关联的 SLB,为了防止 service 配置修改误删除 slb 故障,并导致域名、安全等配置需要修改的坑,强烈建议 service 与 slb 解耦,service 采用 NodePort 的方式,slb 另外建立后端服务器指向集群节点,如果需要透传真实 IP,并考虑负载均衡,需要遵守一定的配置规则和方法,参考这个文章(https://open.atatech.org/articles/148053)。tJn每天发布大量与生活相关的资讯平台

NodePort:tJn每天发布大量与生活相关的资讯平台

tJn每天发布大量与生活相关的资讯平台

然后在负载均衡管理页面,选择后端服务器指向集群的 worker 机器,设置端口为以上服务的端口:32653,完成配置,这样在集群 service 修改或者删除重建的时候,slb 不会被集群的 CCM 删除,不会涉及到域名,安全等配置修改。同时,可以设置一些策略,需要升级修改服务配置时,分批切流等。tJn每天发布大量与生活相关的资讯平台

总结

阿里云容器服务控制台虽然是云上新产品,提供了极其简单的一键部署功能,以及简便的控制台管理。过去一年中,笔者一路见识阿里云容器服务控制台从简陋向强大的转变过程,虽然多次踩坑,但阿里云容器服务同学认真负责和极好的服务态度让人佩服。tJn每天发布大量与生活相关的资讯平台

容器服务管理控制台还需要更多的考虑实际运维需求,并紧密结合已有的云产品,比如云效、EDAS、云监控、日志服务等,以应用为单位,提供更好服务。tJn每天发布大量与生活相关的资讯平台

-----------------------------------tJn每天发布大量与生活相关的资讯平台

本文作者:平名tJn每天发布大量与生活相关的资讯平台

原文链接:https://yq.aliyun.com/articles/717100?utm_content=g_1000075423tJn每天发布大量与生活相关的资讯平台

本文为云栖社区原创内容,未经允许不得转载。tJn每天发布大量与生活相关的资讯平台

也许你还喜欢

高品质音乐下载网站有哪些

本文将探讨无损音乐的原理和方法,以及在哪里可以免费下载这种高品质的音乐。

ssd固态硬盘分区详细教程分享

最近很多朋友咨询关于如何给固态硬盘分区的问题,却不知道如何操作,现在就一起来看

photoshop去水印的方法图文步骤详

首先打开PS,打开想要去掉水印的图片

steamid怎么看?在哪里可以找到

首先大家需要设置来把URL地址栏显示出来,用鼠标点击客户端左上角的“steam按钮”,然后再

nvidia游戏优化怎么设置性能达到最

nvidia游戏优化怎么设置性能达到最佳,NVIDIA显卡设置提高游戏优化性能,NVIDIA独立显卡优

电脑怎么下载我的世界图文步骤详细

电脑怎么下载我的世界,怎么下载我的世界Minecraft Java版,正版启动器不能下载我的世界怎

steamfps怎么调出来具体操作方法图

steamfps怎么调出来,Steam如何设置游戏在右上角显示帧数,steamfps如何设置上限,steamfps

steam人机验证过不了怎么解决图文

steam人机验证过不了怎么解决,手机steam人机验证过程,steam人机验证重新登录游戏,steam人

怎么找到steam个人资料链接图文介

怎么找到steam个人资料链接,steam个人资料打不开怎么办,Steam怎么更换个人资料页的背景,s

steam登录不上去怎么解决图文教程

steam登录不上去怎么解决,steam无法登录怎么办,steam登录时出现错误代码怎么解决,steam手