k8s最佳实践
构建小的镜像
通过下面两种方式可以减小构建镜像大小:
- Small Base Images:有些base镜像有非常齐全的工具链,考虑考虑是否需要这些工具链,还是只需要精简镜像版镜像并补充所需的工具
- Builder Pattern:对于一些go、c语言项目,使用docker提供的builder pattern,先构建一个容器用来编译代码,并将编译结果拷贝到最终镜像中,最终镜像就是一个精简版linux镜像+可执行文件
小镜像可以提升两点:
- 性能:提升构建、上传、下载镜像的时间,可以极大降低新加宿主机的负载
- 安全性:镜像越小代表容器越小,容器越小代表容器可以被攻击的地方就越少,也就越安全
使用namespace
使用namespace将集群资源切分成多块,可以提高集群内部隔离性、管理效率和性能
使用Readiness和Liveness Probes做health check
k8s提供了两种容器的health check机制:
- Readiness:用来check容器是否可以接收流量,如果check失败,就不让容器接收流量
- Liveness:用来check容器是否存活,如果check失败,就重启容器
默认,k8s认为Liveness Check成功的容器,Readiness Check也成功,于是可以直接接收流量
k8s提供三种Probe用来check容器是否health
- Http Probes:发送http请求,如果返回200 ~ 300,表明health
- Command Probes:在容器中执行命令,如果返回0,表明health
- TCP Probes:与指定port建立连接,如果成功连接,则表明health
给资源设置request和limit
k8s在调度的时候,会以request作为参考依据,并以limit限制资源使用
- ResourceQuotas:限制namespace的总cpu、mem等资源的request和limit
- LimitRanges:限制namespace中每个pod的cpu、mem等资源的request和limit,避免超小或者超大的pod,并提供pod的cpu、mem默认值
通过使用request和limit进行超售,cpu是可压缩资源,推荐超售,内存是不可压缩资源,不可超兽
优雅退出
当pod被删除或者杀死的时候,会走优雅退出流程:
- 给pod设置Terminating状态,并等待pod中容器退出
- 执行pod的preStop Hook逻辑。可以是一个发送给容器的command或者http请求,可以帮助那些没有优雅退出逻辑的容器,提前做一些预清理操作
- 发送SIGTERM给pod
- 当容器成功退出后,或等待时间超过优雅退出的最大时间(默认30s),发送SIGKILL给pod,pod被彻底清理
映射外部服务
当希望在k8s集群中访问外部服务时,需要知道外部服务的域名、或者ip+port。通常域名这种比较固定,可以hard code,但是ip+port变化比较频繁,需要保证这些信息可配置化
- 使用ConfigMap:需要在deployment中引入ConfigMap,并且当ConfigMap中配置的Endpoint变化时,还需要重启deployment中的container才能生效
- 使用
Static kubernetes Service
:一种后端没有映射任何pod的Service,可以用来映射kubernetes Endpoints
,并在Endpoint中配置外部服务的ip+port。通过将访问Service Name来映射到该Service后端的Endpoint,最后映射到具体的ip+port。每次ip+port有变动,直接修改Endpoint中信息即可
zero downtime升级集群
集群分master和node,先升级master,再升级node
- master:将新版本master部署在单独的zone,保证multi-zone集群共同工作,并通过vip分流,将老版本zone停服,流量自动转移到新版本zone
- node:提前部署好新版本node节点,组织成node pool。按node为粒度,将老版本node中pod逐步rolling update到新版本node上

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
kubernetes(k8s)搭建实践
碎碎念 按网上有些文章的意思,之前k8s是有提供安装的版本,并且有yum源,但是看目前是不需要安装的,解压可用 官网地址:https://github.com/kubernetes/kubernetes 可以自己下载源码包进行编译,不过需要go的支持,而且在墙内的话会编译不过,原因是需要的镜像被墙了,所以直接下载release版本即可,地址:https://github.com/kubernetes/kubernetes/releases 笔者使用的是Release v1.2.0-alpha.6,这个包已经有496 MB之大了,而之前的Release v1.1.4版本才182M,可见更新之快,之多,笔者之前还使用过1.0.1版本,有些接口和参数就已经发生变化了,比如之前kubectl expose的参数是public-ip,而现在改为externalIPs,所以大家实践时要根据自己的版本 环境说明: 2台机器,167和168,系统都是centos6.5 167上面会跑etcd,flannel,kube-apiserver,kube-controller-manager,kube-sch...
- 下一篇
K8s权威指南学习
第一章 k8s入门(简单的Java web项目) 环境: VMware Workstation在本机虚拟一个64位的Centos7虚拟机 环境准备 关闭防火墙 systemctl disable firewalld systemctl stop firewalld 安装etcd和Kubernetes软件(会自动安装Docker软件) yum install -y etcd kubernetes 按顺序启动所有服务 systemctl start etcd systemctl start docker systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl start kubelet systemctl start kube-proxy 启动MySQL服务 MySQL镜像 docker pull daocloud.io/library/mysql:latest 构建Mysql RC定义文件(可以使用vim创建),命名mys...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程