欢迎访问我的博客,你的支持,是我最大的动力!

kubernetes权威指南笔记(四)

Docker 小马奔腾 301℃ 评论
目录:
[显示]

kubernetes 集群管理

Node的管理

Node的隔离与恢复
使node脱离集群的调度范围

kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}'
kubectl cordon k8s-node-1
kubectl uncordon k8s-node-1
新pod不会调度到该node但运行中的pod不受影响

Node的扩容

添加新服务器
在新node上安装docker,kubelet,kube-proxy 然后配置kubelet和kube-proxy的启动参数,将master url指定为当前集群的地址,然后启动服务,默认会自动注册到集群

更新资源对象的Label

# 添加标签
kubectl label pod xxxxx role=backend
# 查看标签
kubectl get pod -Lrole
# 删除标签
kubectl label pod xxxxx role-
# 修改标签
kubectl label pod xxxxx role=master --overwrite

Namespace: 集群环境共享与隔离

使用 Context 可以指定默认的namespace
kubectl config set-context xxx --namespace=xxx --cluster=xxx --user=xxx
kubectl config view

设置工作组在特定Context环境下工作
kubectl config use-context xxx

Kubernetes 资源管理

使用资源限额
spec.container[].resources.requests.cpu
spec.container[].resources.requests.memory #不会传递给docker run
spec.container[].resources.limits.cpu
spec.container[].resources.limits.memory

LimitRange 解决request与limit的默认值和合法取值范围等问题
ResourceQuota 解决约束租户的资源配额问题

计算资源管理

十进制:E、P、T、G、M、K
二进制:Ei、Pi、Ti、Gi、Mi、Ki

大内存页 huge page
使用大内存页比使用4KB的内存页性能可提高 10%~15%

资源配置范围管理 LimitRange

LimitRange 可应用到某一个命名空间,可以限制最大及最小值范围、Requests和Limits的默认值,Limits与Requests的最大比例上限等

资源服务质量管理 Resource Qos

超售机制能有效提高资源的利用率,同时不会影响容器申请的完全可靠资源的可靠性
Guaranteed 完全可靠
Burstable 弹性波动,较可靠的
BestEffort 尽力而为,不太可靠

Requests值在未定义时,默认等于Limits
Limits未定义时,默认等于节点资源的上限

资源配额管理 Resource Quotas

不管是资源竞争还是配额的修改,都不会影响已创建的资源使用对象

kubectl describe quota xxx --namespace=myspace

限制的作用域不仅可限制为命名空间,还可以指定到QoS级别
如仅限制 BestEffort 的Pod总数,防止集群资源被大量 BestEffort Pod耗尽

资源紧缺时的Pod驱逐机制

驱逐策略

一旦出现资源紧缺的迹象,kubelet会主动终止一个或多个pod的运行,以回收紧缺的资源

驱逐信号
memory.availabel
nodefs.available 保存kubelet的卷和守护进程日志等
nodefs.inodesFree
imagefs.availabel 在容器运行时保存镜像及可写入层
imagefs.inodesFree

驱逐阈值
kubelet可定义驱逐阈值,一旦超了阈值,就会触发kubelet进行资源回收操作
定义:<evication-signal> <operator> <quantity>
operator 仅支持小于 <
quantity 支持绝对值或百分比
示例:
memory.availabel<10%
memory.availabel<1GiB

驱逐软阈值
由驱逐阈值和宽限期定义
pod.Spec.TerminationGracePeriodSeconds和宽限期均设置时,取较小的值
参数:
--eviction-soft 描述驱逐阈值,如 memory.availabel<1GiB
--eviction-soft-grace-period 宽限期,如 memory.availabel=1m30s
--eviction-max-pod-grace-period 终止pod的最大宽限时间 单位s

驱逐硬阈值
没有宽限期,达到阈值将立即杀掉pod进行资源回收
参数:
--eviction-hard 描述驱逐阈值,如 memory.availabel<1GiB

驱逐监控频率
由kubelet的 --housekeeping-interval 定义

节点状况
无论触发了硬阈值还是软阈值,kubelet都会认为当前节点的压力太大
MemoryPressure -> memory.availabel
DiskPressure -> nodefs.available nodefs.inodesFree imagefs.availabel imagefs.inodesFree
kubelet会持续向master报告节点状态,频率由参数 --node-status-update-frequency 指定

节点状况的抖动
解决节点状况在软阈值上下抖动,但没有超过宽限期导致的节点状态在true/false间变换,影响调度
参数 --eviction-pressure-transition-period 等待时间,默认为5m0s
作用,kubelet把压力状态设置为False前,检查时间窗口

回收Node级别的资源
达到驱逐阈值且过了宽限期,kubelet会回收超出限量的资源,直到驱逐信号量回到阈值以内
驱逐用户pod前,会尝试回收node级别资源
有imagefs的情况:
- nodefs达阈值,删掉死掉的pod
- imagefs达阈值,删掉无用的镜像
无imagefs的情况:
- nodefs达阈值,删掉死掉的pod 删掉无用的镜像

驱逐用户的Pod
按照 QoS 及紧缺资源消耗最多选择pod进行驱逐 (磁盘 本地卷+日志+容器写入层所占空间计算)

资源最少回收量
--eviction-minimum-reclaim 回收量为:该值定义的量加上阈值定义的量
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.availabel<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.availabel=2Gi"
若是内存触发阈值驱逐,则回收量为 500Mi+0Mi=500Mi

节点资源紧缺时的系统行为
MemoryPressure 不再调度新的 BestEffort Pod 到该节点
DiskPressure 不再调度Pod
DaemonSet 类pod的驱逐,因kubelet无法分辨DaemonSet,故建议不要在DaemonSet中创建BestEffort类型的Pod,避免产生驱逐方面的问题

设置系统保留资源
kubelet启动参数: --system-reserved=memory=1.5Gi
# 系统预留内存也包括资源驱逐阈值

现阶段段的问题
1、kubelet 无法及时观测到内存压力
较可靠的方式是设置驱逐阈值大约为 75% 这有助于提高驱逐标准,降低OOM几率,有助于集群状态平衡
2、kubelet 可能会错误地驱逐更多 Pod
原因是状态搜集存在时间差

Pod Disruption Budget 主动驱逐保护

主要针对两种场景
- 节点维护或升级时 kubectl drain
- 应用的自动缩容操作 autoscaling down
PodDisruptionBudget 资源对象,用于指定一个pod集合在一段时间内存活的最小实例数量或百分比(保护作用仅针对主动驱逐场景)
在主动驱逐时,如果违反了PodDisruptionBudget的约定,会被api拒绝 (主动驱逐 /eviction API来完成)

Kubernetes 集群高可用部署方案

etcd 数据存储的高可用性
master 组件的高可用性

etcd 的高可用部署
etcd需要以集群的方式进行部署,etcd存储需要使用可靠的存储设备
etcd支持静态部署和动态部署
etcd部署示例: page 725(698)
# etcd集群检查命令
etcdctl cluster-health
etcdctl member list

master的高可用部署
以kube-apiserver,kube-scheduler,kube-controller-manager为一个部署单元,至少三台服务器安装master服务
k8s建议master的三个组件以容器形式启动,启动它们的基础工具是 kubelet,以静态pod的形式由kubelet监控和自动重启
kubelet本身的高可用由操作系统来完成,如使用systemd进行管理
对api server,需要配置一个前端负载均衡,如haproxy+keepalived
# 需要注意的是 如果master开启了安全认证机制,ca证书中需要包含负载均衡服务节点的IP
# 对于外部的访问,如通过kubelet访问api server,需要配置为访问负载均衡的ip

kube-controller-manager kube-scheduler的高可用
在其启动参数中设置 --leader-elect=true 保证同一时间只会有一个实例可修改集群信息
指定master时,使用本服务器上运行的master api-server 即可,不需要使用负载均衡的ip

kubeadm的高可用部署方案
kubeadm提供了两种高可用方案:
堆叠方案,etcd服务与控制平面被部署在同样的节点中,对基础设施要求较低,对故障的应对能力也较低
外置etcd方案,etcd与控制平面分离,需要更多的硬件,有更好的保障能力
部署过程需要scp传输文件,所以需要操作机到所有节点的ssh连接能力
使用 controlPlaneEndpoint: "xxx.xxx.xxx.xxx:xxxx" 指定负载均衡的地址端口
--experimental-upload-certs 该参数专门用于高可用部署,可将需要在不同控制平面之间传递的证书文件上传到集群中,以secret保存,并使用token进行加密
该secret会在2小时后过期,更新方法:kubeadm init phase upload-certs --experimental-upload-certs

外置etcd方案,在kubeadm-config.yaml中要加入etcd的访问信息

Kubernetes 集群监控

通过Metrics Server监控Pod和Node的CPU和内存资源使用
/apis/metrics.k8s.io/v1beta1

Promethues+Grafana集群性能监控平台

集群统一日志管理

容器中输出到控制台的日志,都会以*-json.log 的命名方式保存在 /var/lib/docker/containers/ 目录下,是json格式的文件

k8s推荐 Fluentd+Elasticsearch+Kibana 方案
前置条件:
API Server正确配置了CA证书
DNS 服务启动运行

Fluentd的部署方式:
- 直接在主机上部署
- 利用 kubelet 的 --config 使用静态pod的方式
- DaemonSet

Kubernetes的审计机制

审计日志:Audit Log,按时间顺序记录与安全相关的各种事件
--feature-gates=AdvancedAuditing=true 默认是启用的
Audit Policy规定哪些事件及数据需要记录
支持写到日志文件和通过webhook发送给后端程序

其它

使用Dashboard管理集群

Helm: Kubernetes应用包管理工具

在仓库Repository中查找需要的Chart,然后将Chart以Release形式安装到K8s集群中
HelmClient (依赖socat)
TillerServer

Trouble Shooting

查错方法
- 查看对象的运行时信息,特别是与对象关联的Event事件
- 查看容器运行日志
- 查看k8s组件日志

常见问题
1、由于无法下载pause镜像导致Pod一直处于Pending状态
kubelet --pod_infra_container_image=<registry_ip>:<port>/pause:3.1
2、Pod创建成功,但restarts数量持续增加
容器的启动命令不能保持在前台运行
3、通过服务名无法访问服务
查看service后端endpoint是否正常
查看service的名称能否被正确解析为clusterip地址
查看kube-proxy的转发规则是否正确
-> ipvsadm iptables

Kubernetes开发中的新功能

对windows容器的支持

k8s 1.14对windows容器的支持提升为GA稳定版
windows server最佳版本为2019
windows server可作为node加入到集群中,集群master仍为linux

对GPU的支持

以Device Plugin方式供kubelet调用

Pod的垂直护缩容

Pod的垂直护缩容,简称VPA,使用CRD方式为Pod定义垂直扩缩容规则
https://github.com/kubernetes/autoscaler
- 集群节点扩缩容 ClusterAutoScaler
- Pod垂直扩缩容 Vertical Pod autoscaler
- Addon Resizer ,VPA的简化版

部署VPA
前置条件,需要Metrics Server
VPA对Pod的更新会造成Pod的重新创建和调度
VPA不能和使用CPU/MEM指标的HPA共用

转载请注明:轻风博客 » kubernetes权威指南笔记(四)

喜欢 (0)or分享 (0)