Table of Contents generated with DocToc
数据流转图
- apiServer : 提供资源操作的唯一入口,提供api注册、发现、认证、访问控制等功能
- 整个系统的数据总线和数据中心,负责各模块通讯
- 提供各类资源对象(pod,service等)的增、删、改、查等Restful接口
- 集群内各个功能模块之间数据交互和通信的中心枢纽
- 集群的API入口
- 资源配额入口
- 提供安全机制
- etcd:
- 一个key-value数据库
- 保存整个机器的状态
- controller-manager:
- 负责维护机器状态,比如:自动扩容、故障检查、滚动更新
- 实现集群自动化的关键组件
- scheduler
- 作用:将待调度的pod按照调度算法绑定到合适的Node上
// https://github.com/kubernetes/kubernetes/blob/27e23bad7d595f64519de70f1a82539d14327a28/cmd/kube-controller-manager/app/controllermanager.go
func NewControllerInitializers(loopMode ControllerLoopMode) map[string]InitFunc {
controllers := map[string]InitFunc{}
// All of the controllers must have unique names, or else we will explode.
register := func(name string, fn InitFunc) {
if _, found := controllers[name]; found {
panic(fmt.Sprintf("controller name %q was registered twice", name))
}
controllers[name] = fn
}
register("endpoint", startEndpointController)
register("endpointslice", startEndpointSliceController)
register("endpointslicemirroring", startEndpointSliceMirroringController)
register("replicationcontroller", startReplicationController)
register("podgc", startPodGCController)
register("resourcequota", startResourceQuotaController)
register("namespace", startNamespaceController)
register("serviceaccount", startServiceAccountController)
register("garbagecollector", startGarbageCollectorController)
register("daemonset", startDaemonSetController)
register("job", startJobController)
register("deployment", startDeploymentController)
register("replicaset", startReplicaSetController)
register("horizontalpodautoscaling", startHPAController)
register("disruption", startDisruptionController)
register("statefulset", startStatefulSetController)
register("cronjob", startCronJobController)
register("csrsigning", startCSRSigningController)
register("csrapproving", startCSRApprovingController)
register("csrcleaner", startCSRCleanerController)
register("ttl", startTTLController)
register("bootstrapsigner", startBootstrapSignerController)
register("tokencleaner", startTokenCleanerController)
register("nodeipam", startNodeIpamController)
register("nodelifecycle", startNodeLifecycleController)
if loopMode == IncludeCloudLoops {
register("service", startServiceController)
register("route", startRouteController)
register("cloud-node-lifecycle", startCloudNodeLifecycleController)
// TODO: volume controller into the IncludeCloudLoops only set.
}
register("persistentvolume-binder", startPersistentVolumeBinderController)
register("attachdetach", startAttachDetachController)
register("persistentvolume-expander", startVolumeExpandController)
register("clusterrole-aggregation", startClusterRoleAggregrationController)
register("pvc-protection", startPVCProtectionController)
register("pv-protection", startPVProtectionController)
register("ttl-after-finished", startTTLAfterFinishedController)
register("root-ca-cert-publisher", startRootCACertPublisher)
register("ephemeral-volume", startEphemeralVolumeController)
if utilfeature.DefaultFeatureGate.Enabled(genericfeatures.APIServerIdentity) &&
utilfeature.DefaultFeatureGate.Enabled(genericfeatures.StorageVersionAPI) {
register("storage-version-gc", startStorageVersionGCController)
}
if utilfeature.DefaultFeatureGate.Enabled(kubefeatures.DynamicResourceAllocation) {
register("resource-claim-controller", startResourceClaimController)
}
return controllers
}
- ReplicationController
- 确保集群中Pod副本一直保持预设状态
- 确保集群中有正确数量的副本(spec.replicas)
- 通过修改spec.replicas实现扩容和缩容
- 通过修改pod模板实现系统滚动升级
- NodeController
- 作用:通过apiserver实时获取node相关信息,实现管理和监控Node的功能
- 监控、管理功能举例:
- 设置节点状态信息:Ready、Not Ready、UnKnown
- 长时间未收到kubelet的心跳信息则删除etcd中的存储信息
- ResourceQuotaController
- 作用:听资源配额管理,确保资源占用不会超过系统物理资源
- 管理维度包括:
- 容器级别:对CPU和Memory进行限制
- Pod级别:对pod内所有容器的可用资源进行限制
- Namespace级别:
- pod数量
- service数量
- secret数量
- pv数量
-
NamespaceController 作用:定时通过Apiserver获取保存在etcd中的namespace,并控制namespace的创建、删除等操作
-
Endpoints Controller 什么是endpoints? 一个service对应的所有pod的访问地址
- 作用:负责生成和维护所有的endpoint对象,供给kube-proxy做负载均衡
- Service Controller
- 作用:k8s与外部云平台之间的接口控制器,监听service的变化,确保正确的loadbalance被创建
- 预选调度:遍历所有节点,选出符合要求的候选节点
- 确定最优节点:基于上一步,采用优选策略,计算出候选节点积分,最高分为分配的节点
默认的预选策略包括5个维度的筛选,只有都通过了才作为候选节点 预选策略说明:
- NoDiskConflict:Volume相关冲突检测
- PodFitsResources:资源是否满足的检测
- PodSelectorMatches:pod标签选择器的检测
- PodFitsHost:是否指定被调度到特定Node的检测
- CheckNodeLabelPresense:判断label设定备选节点时,是否选择备选节
LeastRequestedPriority:选出资源消耗最小的节点 CalculateNodeLabelPriority:通过调用用户注册的策略计算 BalancedResourceAllocation:选出各项资源使用率最均衡的节点
-
kubelet:
- 负责容器生命周期管理,比如:创建、删除
- 同时负责Volume,网络的管理
-
kube-proxy
- 负责为Service提供负载均衡、服务发现
-
Container Runtime
- 容器运行环境
- 默认是Docker,同时还支持其他容器引擎
- Pod是k8s中最重要最基本的资源
- pod是在容器之外又封装的一层概念
- pod是容器调度的基本单元(不是docker容器)
- 每个pod包含一个特殊的根容器:Pause容器,和一个或多个业务容器
- 每个pod有唯一的ip,pod内的容器可通过localhost通讯
- 实现Pod自动编排:创建、删除、扩容、缩容
- 通过replicas控制pod数量,template控制要创建的pod的模板
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s-demo
namespace: spring-test
spec:
replicas: 3
template:
metadata:
labels:
app: k8s-demo
spec:
containers:
- name: k8s-demo
image: k8s-demo:0.0.1-SNAPSHOT
ports:
- containerPort: 8080
- k8s里最核心的资源之一,类似微服务架构中的“微服务”
- 前端应用通过入口地址访问服务,服务通过label对接到后端的pod,即使pod的ip变了
- kube-proxy负责把service请求转发到后端,并做负载均衡
- service整个生命周期内,ClusterIp不会变,对外提供的服务地址也就不会变
apiVersion: v1
kind: Service
metadata:
name: k8s-demo
namespace: spring-test
spec:
type: NodePort
selector:
app: k8s-demo
ports:
- protocol: TCP
port: 8888
targetPort: 8080
nodePort: 30003
service提供了ip:port的访问方式,即工作在tcp/ip层,而http服务需要将不同的url对应到不同的后端服务,service是无法实现这一功能的
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: k8s-demo
namespace: spring-test
spec:
rules:
- host: www.k8s-demo.com
http:
paths:
- path: /hello
backend:
serviceName: k8s-demo
servicePort: 8888
- Ingress提供http层的负载分发功能
- Ingress可以实现不同的请求,分发到不同的后端服务
- Ingress定义后,需要结合Ingress Controller,才能形成完整的功能