导图社区 kubernetes进阶学习导图
kubernetes进阶学习,致力于帮助容器编排技术的初级和中级用户循序渐进地理解与使用Kubernetes系统。
编辑于2019-10-09 03:02:00Kubernetes进阶实战
1. 系统基础
概述
简史
特性
自动装箱
构建于容器之上,基于资源依赖以及其他约束自动完成容器部署且不影响其可用性
自我修复(自愈)
支持容器故障后自动重启、节点故障后重新调度容器及其他节点、容器健康检查失败后的重建自我修复机制
水平扩展
通过简单命令或UI手动水平扩展,以及基于CPU等资源负载率的自动水平扩展机制。
服务发现和负载均衡
通过其附件组件KubeDNS(或CoreDNS)为系统内置了服务发现功能,为Service配置DNS名称,Service通过iptables或ipvs内建了负载均衡机制。
自动发布和回滚
支持“灰度”更新应用程序或其配置信息,它会监控更新过程中应用程序的健康状态,以确保它不会在同一时刻杀掉所有实例,而此过程中若有故障发生,则立即执行回滚操作。
密钥和配置管理
其ConfigMap实现了配置数据与Docker镜像解耦
提供了Secret对象为其解耦,即便利了应用的快速开发与交付,又提供了一定的安全保障。
存储编排
支持Pod对象按需自动挂载不同类型的存储系统
本地存储
公有云
AWS
GCP
网络存储系统
NFS
iSCSI
GlusterFS
Ceph
Cinder
Flocker
批处理执行
支持批处理作业
CI(持续集成)
概念和术语
Master
Node
资源对象
Pod
资源标签(Label)
标签选择器
Pod控制器
ReplicationController
ReplicaSet
Deployment
StatefulSet
Job
服务资源(Service)
存储卷(Volume)
Name和Namespace
Annotation
Ingress
集群组件
Master组件
API Server
集群状态存储(etcd)
由CoreOS基于Raft协议开发的分布式键值存储
用于服务发现、共享配置以及一致性保障(数据库主节点选择、分布式锁)
监听机制(watch)用于监听和推送变更
控制器管理器(Controller Manager)
生命周期功能
Namespace创建和生命周期
Event垃圾回收
Pod终止相关的垃圾回收
级联垃圾回收
Node垃圾回收
API业务逻辑
ReplicaSet执行Pod扩展
调度器(Scheduler)
Node组件
Node的核心代理程序(kubelet)
kube-proxy
容器运行时环境
Docker
RKT
cri-o
Fraki
核心组件
KubeDNS
在集群中调度运行提供DNS服务的Pod,1.11版本后默认改使用CoreDNS
Kubernetes Dashboard
管理集群中的应用甚至是集群自身的基于Web的UI
Heapster
容器和节点的性能监控与分析系统,收集并解析多种指标数据,新的版本逐渐由Prometheus结合其他组件所取代。
Ingress Controller
Service是一种工作于传统层的负载均衡器,而Ingress是在应用层实现HTTP(s)负载均衡机制。
Ingress资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则需要通过Ingress控制器发挥作用。
可用项目有Nginx、Traefik、Envory、HAProxy等
网络模型基础
存在四种类型的通信
同一Pod的容器间通信
各Pod彼此之间的通信
Pod与Service间的通信
集群外部的流量同Service之间的通信
为Pod和Service资源对象分别使用各自的专有网络
Pod网络由Kubernetes的网络插件配置实现
Service的网络由Kubernetes集群予以指定
使用的网络插件需要满足的需求
所有Pod间均可不经NAT机制而直接通信
所有节点均可不经NAT机制而直接与所有容器通信
容器自己使用的IP也是其他容器或节点直接看到地址(所有Pod对象都位于同一平面网络中,而且可用使用Pod自身的地址直接通信)
集群应包含的三个网络
各主机(Master、Node、etcd等)自身所属的网络,其地址配置于主机的网络接口,用于各主机之间的通信
集群上专用于Pod资源对象的网络
是一个虚拟网络
用于为各Pod对象设定IP地址等网络参数,其地址配置于Pod中容器的网络接口之上
Pod网络需要借助kubenet插件或CNI插件实现,插件可独立部署于kubernetes集群之外,也可托管于kubernetes之上
CNI是指容器网络接口,由CNCF维护的项目
构建集群时由管理员定义,而后在创建Pod对象时由其自动完成各网络参数的动态配置
集群上专用于Service资源对象的网络
是一个虚拟网络
用于为kubernetes集群之中的Service配置IP地址
地址并不配置于任何主机或容器的网络接口之上,而是通过Node之上的kube-proxy配置为iptables或ipvs规则,从而将发往此地址的所有流量调度至其后端的各Pod对象之上。
Service网络在集群创建时予以指定,各Service的地址则在用户创建Service时予以动态配置
集群上的网络通信
客户端
API Server客户端
包含人类用户和Pod对象两种
通过API Server访问kubernetes集群完成管理任务
应用程序客户端(运行为Pod中的容器)
包含人类用户和Pod对象两种
访问目标是Pod上运行于容器中的应用程序提供的各种具体服务,如redis和nginx
访问目标对象的操作要经由第一类客户端创建和配置完成后才能进行
2. 快速入门
核心对象
Pod资源对象
共享网络
共享存储卷
Controller
Service
仅用于集群内部通信的ClusterIP类型
接入集群外部请求的NodePort类型
LoadBalancer类型
集群部署
部署工具
kubeadm init
kubeadm join
运行模式
独立组件
静态Pod模式
"自托管"模式
使用基础与示例
创建资源对象
查看资源对象
打印资源对象的详细信息
在容器中执行命令
删除资源对象
命令式容器应用编排
基础管理操作
通过合用的Controller类的资源创建并管控Pod对象以运行特定应用程序
为Pod对象创建Service对象
随时按需获取各资源对象的简要或详细信息
手动对支持扩容的Controller组件进行扩容或缩容 或 为支持HPA的Controller组件创建HPA资源对象以实现自动伸缩
滚动更新
部署应用
创建Deployment控制器对象
kubectl run $DEPLOY_NAME --image= --port= --replicas= --dry-run
打印资源对象的相关信息
kubectl get
探查Pod及应用详情
查看Pod对象的详细描述
kubectl describe pods $POD_NAME
查看容器日志
kubectl logs $POD_NAME
在容器中运行额外的程序
kubectl exec -it $POD_NAME /bin/bash
部署Service对象
创建Service对象
kubectl expose --port= --name=
查看Service资源对象的描述
kubectl describe service
扩缩容
kubectl scale --replicas
修改和删除对象
kubectl delete
kubectl edit
3. 资源管理基础
资源对象及API群组
资源对象
工作负载(workload)
无状态
ReplicationController
ReplicaSet
Deployment
有状态
StatefulSet
DaemonSet
Job
发现和负载均衡(Discovery&LB)
Service
Endpoint
Ingress
配置和存储(Config&Storage)
Volume
CSI(Container Storage Interface)
ConfigMap
Secret
集群(Cluster)
Namespace
Node
Role
ClusterRole
RoleBinding
ClusterRoleBinding
元数据(Metadata)
HorizontalPodAutoscaler
pod template
limitRange
资源及其在API中的组织形式
资源类别
对象类(Object)
列表类(List)
简单类(Simple)
API群组
核心群组(core group)
/api/v1
命名的群组(named group)
/apis/$GROUP_NAME/$VERSION
用户自定义资源类型
修改Kubernetes源代码自定义类型
创建一个自定义的API Server
使用自定义资源(Custom Resource Definition,CRD)
访问kubernetes REST API
使用curl作为HTTP客户端访问
kubeadm部署的集群仅支持https访问接口,需要一系列认证,故可借助kubectl proxy命令在本地主机上为API Server启动一个代理网关
对象类资源格式
资源配置清单
metadata嵌套字段
spec和status字段
资源配置清单格式文档
kubectl explain pods
kubectl explain pods.spec
kubectl get TYPE NAME -o yaml --export(--export选项用于省略输出系统生成的信息)
资源对象管理方式
陈述式命令(imperative command)
run
expose
delete
get
陈述式对象配置(imperative object configuration)
create
delete
get
replace
声明式对象配置(declarative object configuration)
apply
kubectl命令与资源管理
管理名称空间资源
Pod资源的基础管理操作
陈述式对象配置管理方式
声明式对象配置管理方式
4. 管理Pod资源对象
容器与Pod资源对象
分布式系统设计的模型
Sidecar pattern(边车模型或跨斗模型)
Ambassador pattern(大使模型)
Adapter pattern(适配器模型)
管理Pod对象的容器
镜像及其获取策略
Always
IfNotPresent
Never
暴露端口
自定义运行的容器化应用
command
args
环境变量
env
envFrom
共享节点的网络名称空间
设置Pod对象的安全上下文
标签与标签选择器
标签概述
键值要求
必须不能多于63个字符
以字母或数字开头及结尾
中间仅能使用字母、数字、连接号(-)、下划线(_)或点号(.)
版本标签
release:stable
release:canary
release:beta
环境标签
environment:dev
environment:qa
environment:production
应用标签
app:ui
app:as
app:pc
架构层级标签
tier:frontend
tier:backend
tier:cache
分区标签
partition:customerA
partition:customerB
品控级别标签
track:daily
track:weekly
管理资源标签
kubectl get pods --show-labels
kubectl get pods -L key1,key2,…
kubectl label [--overwrite]
标签选择器
基于等值关系(equality-based)
=
= =
!=
基于集合关系(set-based)
in
notin
exists
!key
matchLabels
matchExpressions
形如:{ key:KEY_NAME,operator:OPERATOR,values:[ VALUE1,VALUE2,…]}
Pod节点选择器nodeSelector
资源注解
查看资源注解
管理资源注解
Pod对象的生命周期
Pod的相位(phase)
Pending
Running
Succeeded
Failed
Unknown
Pod的创建过程
1. 时序图
2. 客户端提交Pod Spec给API Server
3. API Server将Pod对象信息存入etcd中
4. API Server反映etcd中的状态变化
5. k8s组件均使用“watch”机制跟踪检查API Server上的相关变动
6. kube-scheduler(调度器)通过watcher觉察到API Server创建了新的Pod对象但尚未绑定至任何工作节点
7. scheduler为Pod对象挑选一个工作节点并将结果信息更新至API Server
8. 调度结果信息由API Server更新至etcd存储系统,而且API Server也开始反映此Pod对象的调度结果
9. Pod被调度到目标工作节点上的kubelet尝试在当前节点上调用Docker启动容器,并将容器的结果状态回送至API Server
10. API Server将Pod状态信息存入etcd系统中
11. 在etcd确认写入操作成功完成后,API Server将确认信息发送至相关的kubelet,事件将通过它被接受
Pod生命周期中的重要行为
初始化容器
必须运行完成直至结束,若失败则重启直至成功完成
每个初始化容器必须按定义的顺序串行运行
生命周期钩子函数
postStart
容器创建完成后立即运行钩子处理器(handler)
preStop
容器终止操作之前立即运行的钩子处理器,以同步方式调用,在其完成前会阻塞容器的操作的调用
实现方式
Exec
在钩子事件触发时直接在当前容器中运行由用户定义的命令
HTTP
在当前容器中向某URL发起HTTP请求
容器探测
ExecAction
TCPSocketAction
HTTPGetAction
存活性检测(livenessProbe)
就绪性检测(readinessProbe)
容器的重启策略
Always
OnFailure
Never
Pod的终止过程
1. 客户端发送删除Pod对象的命令
2. API Server中的Pod对象随着时间的推移而更新,在宽限期内(默认30s)Pod被视为“dead”
3. 将Pod标记为“Terminating”状态
4. (与第3步同时)kubelet在监控到Pod对象转为“Terminating”状态的同时启动Pod关闭过程
5. (与第3步同时)端点控制器监控到Pod对象的关闭行为时将其从所有匹配到此端点的Service资源的端点列表中移除
6. 当Pod定义了preStop钩子处理器,则在其标记为“terminating”后以同步方式启动执行;若宽限期结束后,preStop仍未结束,则第2步会被重新执行并额外获取一个时长为2s的小宽限期
7. Pod对象中的容器进程收到TERM信号
8. 宽限期结束,若存在任何一个人在运行的进程,那么Pod对象即会收到SIGKILL信号
9. Kubelet请求API Server将此Pod资源的宽限期设置为0从而完成删除操作,它变得对用户不再可见
10. 时序图
Pod存活性探测
设置exec探针
设置HTTP探针
设置TCP探针
存活性探测行为属性
initialDepaySeconds<Integer>
timeoutSeconds<integer>
periodSeconds<integer>
successThreshold<integer>
failureThreshold
Pod就绪性探测
与存活性探测相同,不同的是失败后不会重启容器,而是通知其尚未就绪,触发依赖于其就绪的操作确保不会有客户端接入此Pod
资源需求及资源限制
资源需求
资源限制
容器的可见资源
Pod的服务质量类别
Guaranteed
Burstable
BestEffort
5. Pod控制器
基本组成
标签选择器
期望的副本数(DeamonSet无该项)
Pod模板
ReplicaSet控制器(RS)
实现的功能
确保Pod资源对象的数量精确反映期望值
确保Pod健康运行
弹性伸缩
创建ReplicaSet
ReplicaSet管控下的Pod对象
更新ReplicaSet控制器
删除ReplicaSet控制器资源
Deployment控制器
创建Deployment
更新策略
滚动更新(rolling update)-默认
重新创建(recreate)
升级Department
金丝雀发布
回滚Department控制器下的应用发布
扩缩容
DaemonSet控制器
场景
运行集群存储的守护进程(glusterd或ceph)
在各个节点上运行的日志收集守护进程(fluentd或logstash)
在各个节点上运行的监控系统的代理守护进程(prometheus Node Exporter、collectd、Datadog agent、New Relic agent或Ganglia gmond)
创建DaemonSet资源对象
更新DaemonSet对象
RollingUpdate(滚动更新)-默认
OnDelete(删除时更新)
Job控制器
类型
单工作队列(work queue)的串行式Job
多工作队列的并行式Job
创建Job对象
并行式Job
parallelism
completions
Job扩容
删除Job
backoffLimit
activeDeadlineSeconds
CronJob控制器
创建CronJob对象
CronJob的控制机制
concurrentPolicy<String>
Allow(允许)
Forbid(禁止)
Replace(替换)
ReplicationController
Pod中断预算(PodDisruptionBudget, PDB)
selector<Object>
minAvailable<string>
maxUnavailable<string>
6. Service和Ingress
Service资源及其实现模型
userspace代理模型
iptables代理模型
ipvs代理模型
Service资源的基础应用
创建Service资源
kubectl expose
资源配置文件
向Service对象请求服务
Service会话粘性(Session affinity)
服务发现
实现方式
客户端发现
服务端发现
环境变量
Kubernetes Service环境变量
Docker Link形式的环境变量
ClusterDNS
拥有ClusterIP的Servie资源
A记录:<service>.<ns>.svc.<zone>.<ttl> IN A <cluster-ip>
SRV记录:_<port>._<proto>.<service>.<ns>.SVC.<zone>.<ttl> IN SRV <weight> <priority> <port-number> <service>.<ns>.svc.<zone>
PTR记录:<d>.<c>.<b>.<a>.in-addr.arpa.<ttl> IN PTR <service>.<ns>.svc.<zone>
Headless类型的Sevice资源
A记录:<service>.<ns>.svc.<zone>.<ttl> IN A <endpoint-ip>
SRV记录:_<port>._<proto>.<service>.<ns>.SVC.<zone>.<ttl> IN SRV <weight> <priority> <port-number> <hostname>.<service>.<ns>.svc.<zone>
PTR记录:<d>.<c>.<b>.<a>.in-addr.arpa.<ttl> IN PTR <hostname>.<service>.<ns>.svc.<zone>
ExternalName类型的Service资源
CNAME记录:<service>.<ns>.svc.<zone>.<ttl> IN CNAME <extname>
DNS
.{SVCNAME}.{NAMESPACE}.{CLUSTER_DOMAIN}
.{SVCNAME}.{NAMESPACE}.svc.{CLUSTER_DOMAIN}
服务暴露
Service类型
ClusterIP
NodePort
LoadBalancer
ExternalName
NodePort类型的Service资源
LoadBalancer类型的资源
ExternalName Service
Headless类型的Service资源
Ingress资源
Ingress和Ingress Controller
创建Ingress资源
rules<Object>
backend<Object>
serviceName
servicePort
tls<Object>
Ingress资源类型
单Service资源型Ingress
基于URL路径进行流量分发
基于主机名称的虚拟主机
TLS类型的Ingress资源
部署Ingress控制器(Nginx)
以Deployment控制器管理Ingress控制器的Pod资源
借助于DaemonSet控制器,将Ingress控制器的Pod资源各自以单一实例的方式运行于集群的所有或部分工作节点之上
7. 存储卷和数据持久化
临时存储卷
emptyDir存储卷
gitRepo存储卷
kubernetes 1.12起已废弃
构建于emptyDir存储卷之上
节点存储卷
hostPath
节点存储卷hostPath
网络存储卷
持久存储卷
downwardAPI存储卷
8. 配置容器应用:ConfigMap和Secret
容器化应用配置方式
通过命令行参数进行配置
将配置文件嵌入镜像文件
通过环境变量向容器注入配置信息
通过存储卷向容器注入配置信息
借助Docker config进行容器配置
通过命令行参数配置容器应用
command
args
利用环境变量配置容器应用
env
name
value
valueFrom
应用程序配置管理及ConfigMap资源
创建ConfigMap对象
利用直接值创建
--from-literal
基于文件创建
--from-file
基于目录创建
使用清单创建
向Pod环境变量传递ConfigMap对象键值数据
ConfigMap存储卷
挂载整个存储卷
挂载存储卷中的部分键值
独立挂载存储卷中的键值
容器应用重载新配置
使用ConfigMap资源得注意事项
Secret资源
Secret概述
创建Secret资源
命令创建
清单式创建
Secret存储卷
imagePullSecret资源对象
9. StatefulSet控制器
10. 认证、授权和准入控制
访问控制概述
用户账号与用户组
认证、授权与准入控制基础
服务账户管理与应用
Service Account自动化
创建服务账户
调用imagePullSecret资源对象
X.509数字证书认证
kubernetes中的SSL/TLS认证
客户端配置文件kubeconfig
TLS bootstrapping机制
基于角色的访问控制:RBAC
RBAC授权插件
Role和RoleBinding
ClusterRole和ClusterRoleBinding
聚合型ClusterRole
aggregationRule
面向用户的内建ClusterRole
其他内建ClusterRole和ClusterRoleBinding
Kubernetes Dashboard
准入控制与应用示例
LimitRange资源与LimitRanger准入控制器
ResourceQuota资源与准入控制器
PodSecurityPolicy
11. 网络模型和网络策略
Kubernetes网络模型及CNI插件
Docker容器的网络模型
Closed container(封闭式容器)
Bridged container(桥接式容器)
Open container(开放式容器)
Joined container(联盟式容器)
Kubernetes网络模型
容器间通信
Pod间通信
Service与Pod间的通信
集群外部到Pod对象之间的通信
Pod网络的实现方式
CNI插件及其常见的实现
flannel网络插件
网络策略
Calico网络插件
12. Pod资源调度
预选策略
优选函数
节点亲和调度
节点硬亲和性
nodeSelector
nodeAffinity中的matchExpressions
节点软亲和性
nodeAffinity中的weight
Pod资源亲和调度
位置拓扑
Pod硬亲和调度
Pod软亲和调度
Pod反亲和调度
污点和容忍度
优先级和抢占式调度
13. Kubernetes系统扩展
自定义资源类型(CRD)
自定义API
集群高可用
部署模式
14. 资源指标及HPA控制器
15. Helm程序包管理器