构建小的镜像
经过下面两种方式能够减少构建镜像大小:node
- Small Base Images:有些base镜像有很是齐全的工具链,考虑考虑是否须要这些工具链,仍是只须要精简镜像版镜像并补充所需的工具
- Builder Pattern:对于一些go、c语言项目,使用docker提供的builder pattern,先构建一个容器用来编译代码,并将编译结果拷贝到最终镜像中,最终镜像就是一个精简版linux镜像+可执行文件
小镜像能够提高两点:linux
- 性能:提高构建、上传、下载镜像的时间,能够极大下降新加宿主机的负载
- 安全性:镜像越小表明容器越小,容器越小表明容器能够被攻击的地方就越少,也就越安全
使用namespace
使用namespace将集群资源切分红多块,能够提升集群内部隔离性、管理效率和性能docker
使用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是可压缩资源,推荐超售,内存是不可压缩资源,不可超兽ui
优雅退出
当pod被删除或者杀死的时候,会走优雅退出流程:google
- 给pod设置Terminating状态,并等待pod中容器退出
- 执行pod的preStop Hook逻辑。能够是一个发送给容器的command或者http请求,能够帮助那些没有优雅退出逻辑的容器,提早作一些预清理操做
- 发送SIGTERM给pod
- 当容器成功退出后,或等待时间超过优雅退出的最大时间(默认30s),发送SIGKILL给pod,pod被完全清理
映射外部服务
当但愿在k8s集群中访问外部服务时,须要知道外部服务的域名、或者ip+port。一般域名这种比较固定,能够hard code,可是ip+port变化比较频繁,须要保证这些信息可配置化spa
- 使用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上
参考资料