Kubernetes系统组件及运行逻辑回顾与扩展01.md
回顾
kubernetes概念:
容器编排系统:
以应用为中心,
构建其他平台的平台,
声明式API,终态声明
控制器模式,支撑声明式API得以落地
系统组件
控制平面:
controller Manager:打包在一起的很多controller,其中有seivces 、 node、等控制器,这些就是API server里的声明式的效果支撑。 # 好比一个个专业模块的运维工程师。
API Server,API 声明的有pod,就应该有pod controller,注意pod controller不在controller Manager中,而是在么个节点之上叫kubelet。
scheduler,调度的
etcd,API Server依赖的组件
Cloud Manger,很多时候用不到它,如果部署到云端,就用得到这个组件来调用云服务的API。比如按需创建ECS,把其配置成node,加入到集群,扩展集群。
数据平面:
Kubelet,其实就是在每个node上工作的pod调度器,当scheduler调度器决定把某个pod调度到某个node后,那个node就得把那个节点得定义--终态声明读取过来,在当前节点之上,通过调用docker或者containerd或cri创建容器,同时调用cni设定网络环境,调用csi设定存储--这个不是必须得。 # kubelet可以理解为kubernetes集群的代理,每各节点上都有这么一各agent来解决与pod相关的所有具体事务。
CRI :
containerd
Docker
docker-shim 已废弃
cri-dockerd
CRI-O
kube proxy
附件
编排运行一个服务端应用--非作业(job)类:
工作负责控制器编排运行pod
depolyment,编排无状态应用的
statefulSet,有状态应用
DaemonSet,系统应用
我们要选择一个控制器来编排pod,而控制器怎么知道哪些pod和自己相关👇,通过label selector 标签选择器。 3个重要的属性: replicas--运行副本数量、 labelselector--标签选择器、 template--pod模板。
deployment好比运维工程师,能够完成应用生命周期里的功能,部署、卸载、更新。
service
pod是动态的,直接访问不显示,前端就需要一个LB,也就是service。
①服务发现,一个depolyment或statefaulSet编排之下的 服务端的数量--pod有哪些,一样是通过label selector 发现的
②负载均衡,服务发现完成后,就可以将这些发现出来的pod定义成一个服务集群LB Cluster。这个LB的实现就是Iptables /ipvs规则。这些规则是怎么实现的,在哪些节点上实现--对应每一个services在集群中的任何一个node上都会生产相应的iptables/ipvs规则,因为这个LB是client端负载均衡。
所以要编排一个服务端应用,一般要做两个操作:
①定义工作负载型控制器资源--来编排运行这些pods。
②定义service资源--来发现这组pods把他定义成服务,并且还能为其作LB。
③然后在每个node上面是如何把service定义成iptable/ipvs规则的,如果这些service删了这些规则也要自动删掉,那就是kubeproxy来实现的。
④每当用户给API SERVER创建一个service,kube proxy是API SERVER的client端,就能读到那个sevice定义或变动,然后将其转成当前node的iptabes/ipvs的规则。
# calico 其实就是daemonset和deployment来自动创建的。
root@k8s-master01:~# kubectl get pods -n calico-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
calico-apiserver-6c76dfc8c9-dztlw 1/1 Running 0 6d 10.244.32.133 k8s-master01 <none> <none>
calico-apiserver-6c76dfc8c9-pbdbq 1/1 Running 0 6d 10.244.32.136 k8s-master01 <none> <none>
calico-kube-controllers-ddc6d7f8-4svwq 1/1 Running 0 6d 10.244.32.134 k8s-master01 <none> <none>
calico-node-484wh 1/1 Running 0 6d 192.168.39.31 k8s-master01 <none> <none>
calico-node-4krc5 1/1 Running 0 5d23h 192.168.39.32 k8s-master02 <none> <none>
calico-node-8kpt2 1/1 Running 0 5d22h 192.168.39.42 k8s-node02 <none> <none>
calico-node-gbqqz 1/1 Running 0 5d22h 192.168.39.43 k8s-node03 <none> <none>
calico-node-tzn4w 1/1 Running 0 5d22h 192.168.39.41 k8s-node01 <none> <none>
calico-node-wxbks 1/1 Running 0 5d23h 192.168.39.33 k8s-master03 <none> <none>
calico-typha-77d67d9597-9mzns 1/1 Running 0 5d23h 192.168.39.32 k8s-master02 <none> <none>
calico-typha-77d67d9597-lphtf 1/1 Running 0 5d22h 192.168.39.41 k8s-node01 <none> <none>
calico-typha-77d67d9597-qc6cn 1/1 Running 0 6d 192.168.39.31 k8s-master01 <none> <none>
csi-node-driver-bqjqn 2/2 Running 0 6d 10.244.32.129 k8s-master01 <none> <none>
csi-node-driver-k9m9v 2/2 Running 0 5d22h 10.244.58.193 k8s-node02 <none> <none>
csi-node-driver-kt2qj 2/2 Running 0 5d23h 10.244.122.128 k8s-master02 <none> <none>
csi-node-driver-lttb7 2/2 Running 0 5d22h 10.244.85.193 k8s-node01 <none> <none>
csi-node-driver-s6vsp 2/2 Running 0 5d22h 10.244.135.129 k8s-node03 <none> <none>
csi-node-driver-sz56f 2/2 Running 0 5d23h 10.244.195.1 k8s-master03 <none> <none>
goldmane-6885dcb7d-v5sz6 1/1 Running 0 6d 10.244.32.135 k8s-master01 <none> <none>
whisker-cb8f7dc8-l4ctr 2/2 Running 0 6d 10.244.32.132 k8s-master01 <none> <none>
root@k8s-master01:~#
root@k8s-master01:~# kubectl get daemonset -n calico-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
calico-node 6 6 6 6 6 kubernetes.io/os=linux 6d
csi-node-driver 6 6 6 6 6 kubernetes.io/os=linux 6d
root@k8s-master01:~# kubectl get deployment -n calico-system
NAME READY UP-TO-DATE AVAILABLE AGE
calico-apiserver 2/2 2 2 6d
calico-kube-controllers 1/1 1 1 6d
calico-typha 3/3 3 3 6d
goldmane 1/1 1 1 6d
whisker 1/1 1 1 6d
root@k8s-master01:~#
# nginx-demo其实的deployment创建的
root@k8s-master01:~# kubectl get pods
NAME READY STATUS RESTARTS AGE
backend-79f8849978-z2q4p 1/1 Running 0 4d4h
nginx-c9fcd5b48-s6lj5 1/1 Running 0 25h
nginx-demo-6dbf7cbd6f-4qztw 1/1 Running 0 4d21h
nginx-demo-6dbf7cbd6f-66d94 1/1 Running 0 4d21h
nginx-demo-6dbf7cbd6f-v8jsv 1/1 Running 0 4d21h
whoami-7fd8895794-6szhw 1/1 Running 0 4d
whoami-7fd8895794-dhk6k 1/1 Running 0 4d
root@k8s-master01:~#
root@k8s-master01:~# kubectl get deployment nginx-demo
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-demo 3/3 3 3 4d21h
root@k8s-master01:~#
安全性
.kube/config文件相当重要,谁拿到了,谁就可以使用kubectl调用API SERVER
API资源规范

root@k8s-master02:~# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
backend 1/1 1 1 4d21h
nginx 1/1 1 1 42h
nginx-demo 3/3 3 3 5d14h
whoami 2/2 2 2 4d17h
root@k8s-master02:~#
root@k8s-master02:~# kubectl get deployment nginx-demo -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: "2026-05-21T10:15:52Z"
generation: 1
labels:
app: nginx-demo
name: nginx-demo
namespace: default
resourceVersion: "284262"
uid: 2c7cd284-04a9-4d57-9fb3-8c9397e817a4
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx-demo
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- image: nginx:alpine
imagePullPolicy: IfNotPresent
name: nginx
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 3
conditions:
- lastTransitionTime: "2026-05-21T10:27:13Z"
lastUpdateTime: "2026-05-21T10:27:13Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2026-05-21T10:15:52Z"
lastUpdateTime: "2026-05-21T10:27:13Z"
message: ReplicaSet "nginx-demo-6dbf7cbd6f" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 1
readyReplicas: 3
replicas: 3
terminatingReplicas: 0
updatedReplicas: 3
status是当前状态,spec是规划定义的目标,当两者不一致就会同步,这里有一个自动巡检校准机制。
有些资源是没有spec和status,比如namespace。
K8S是以应用为中心的容器编排平台,

以POD为中心,
volume,提供持久化存储的,如conf文件
DaemonSet StatefulSet提供编排功能的
ingress service提供服务发现、LB的
horizontal vertical 实现弹性扩缩容的,水平、垂直扩缩容
只需声明一个应用要多少资源,剩下的会自动挑选服务器完成部署。