Kubernetes中的包含了很多如 Node
、 Pod
、 ReplicationController
、 Service
、 Deployment
等 “资源对象”
,几乎所有的资源对象都可以通过Kubernetes提供的kubectl工具(或者API编程调用)执行增、删、改、查等操作并将其保存在 etcd-v3
中持久化存储。从这个角度来看,Kubernetes其实是一个高度自动化的资源控制系统,它通过跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错的高级功能。
kubernetes资源对象可以通过kubectl的子命令 api-resources
查看。
☸️ devcluster🔥 monitor ~ 🐳 👉 kubectl api-resources
NAME SHORTNAMES APIGROUP NAMESPACED KIND
bindings true Binding
componentstatuses cs false ComponentStatus
configmaps cm true ConfigMap
endpoints ep true Endpoints
events ev true Event
limitranges limits true LimitRange
...
在介绍资源对象之前,我们先了解一下Kubernetes集群的两种管理角色:Master
和 Node
。
Kubernetes里的Master指的是集群控制节点,每一个Kubernetes集群里都必须要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,它来负责具体的执行过程,我们后面执行的所有命令基本都是在Master节点上运行的。我们通常会把Master部署在一个独立的服务器上,如何高可用部署建议用3台服务器,master也可以扩展副本数,来获取更好的可用性和冗余。其主要原因是它太重要了,是整个集群的“首脑brain”,如果宕机或者不可用,那么对集群内容器应用的管理都将失效。
Master节点上运行着以下一组关键进程。
KubernetesAPIServer(kube-apiserver)
:提供了 HTTP Rest 接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。查看具体的哪些API:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#-strong-api-overview-strong-KubernetesControllerManager(kube-controller-manager)
:Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的“大总管”。KubernetesScheduler(kube-scheduler)
:负责资源调度(Pod调度)的进程,安排哪些服务的pod运行在哪些节点上。另外,在Master节点上还需要启动一个etcd服务,正如前面讲到的,Kubernetes里的所有资源对象的数据全部是保存在etcd中的。
除了Master,Kubernetes集群中的其他机器被称为Node节点,在较早的版本中也被称为Minion。与Master一样,Node节点可以是一台物理主机或者是虚拟机。Node节点才是Kubernetes集群中的工作负载节点,每个Node都会被Master分配一些应用程序服务以及云工作流,在有些时候,Master节点上也会 "安排"
一些服务运行,或者说是一些Docker容器,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。
每个Node节点上都运行着以下一组关键进程。
kubelet
:负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。kube-proxy
:实现Kubernetes Service的通信与负载均衡机制的重要组件。DockerEngine(docker)
:Docker引擎,负责本机的容器创建和管理工作。Node节点可以在运行期间动态增加到Kubernetes集群中,前提是这个节点上已经正确安装、配置和启动了上述关键进程,在默认情况下kubelet会向Master注册自己,这也是Kubernetes推荐的Node管理方式。一旦Node被纳入集群管理范围,kubelet进程就会定时向Master节点汇报自身的情报,例如操作系统、Docker版本、机器的CPU和内存情况,以及当前有哪些Pod在运行等,这样Master可以获知每个Node的资源使用情况,并实现高效均衡等资源调度策略。而某个Node超过指定时间不上报信息时,会被Master判断为“失联”,Node的状态被标记为不可用(Not Ready),随后Master会触发“工作负载大转移”的自动流程。
我们可以执行下述命令查看集群中有多少个Node:
☸️ devcluster🔥 monitor ~ 🐳 👉 kubectl get nodes
NAME STATUS ROLES AGE VERSION
dev-k8s-01.kubemaster.top Ready master 141d v1.16.3
dev-k8s-02.kubemaster.top Ready <none> 141d v1.16.3
dev-k8s-03.kubemaster.top Ready <none> 141d v1.16.3
dev-k8s-04.kubemaster.top Ready <none> 141d v1.16.3
dev-k8s-05.kubemaster.top Ready <none> 141d v1.16.3
然后,通过kubectl describe node 来查看某个Node的详细信息:
☸️ devcluster🔥 monitor ~ 🐳 👉 kubectl describe node dev-k8s-01.kubemaster.top
Name: dev-k8s-01.kubemaster.top
Roles: master
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/fluentd-ds-ready=true
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=dev-k8s-01.kubemaster.top
kubernetes.io/os=linux
node-role.kubernetes.io/master=
Annotations: flannel.alpha.coreos.com/backend-data: {"VtepMAC":"16:3b:67:9e:13:e5"}
flannel.alpha.coreos.com/backend-type: vxlan
flannel.alpha.coreos.com/kube-subnet-manager: true
flannel.alpha.coreos.com/public-ip: 172.16.132.231
kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
node.alpha.kubernetes.io/ttl: 0
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Fri, 15 Nov 2019 21:19:02 +0800
Taints: node-role.kubernetes.io/master:NoSchedule
Unschedulable: false
Lease:
HolderIdentity: dev-k8s-01.kubemaster.top
AcquireTime: <unset>
RenewTime: Sun, 05 Apr 2020 09:52:38 +0800
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure False Sun, 05 Apr 2020 09:52:25 +0800 Fri, 15 Nov 2019 21:18:59 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Sun, 05 Apr 2020 09:52:25 +0800 Fri, 15 Nov 2019 21:18:59 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Sun, 05 Apr 2020 09:52:25 +0800 Fri, 15 Nov 2019 21:18:59 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Sun, 05 Apr 2020 09:52:25 +0800 Fri, 15 Nov 2019 21:39:54 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 172.16.132.231
Hostname: dev-k8s-01.kubemaster.top
Capacity:
cpu: 4
ephemeral-storage: 71645Mi
hugepages-2Mi: 0
memory: 8009252Ki
pods: 110
Allocatable:
cpu: 4
ephemeral-storage: 67612704657
hugepages-2Mi: 0
memory: 7906852Ki
pods: 110
System Info:
Machine ID: a9621c1d226d401b979d2e25c6677a95
System UUID: 422A08DE-A266-F7C1-914D-B73AA9A79176
Boot ID: 6b74915e-ed6e-4e0a-90e2-46e285807893
Kernel Version: 3.10.0-957.21.3.el7.x86_64
OS Image: CentOS Linux 7 (Core)
Operating System: linux
Architecture: amd64
Container Runtime Version: docker://18.9.9
Kubelet Version: v1.16.3
Kube-Proxy Version: v1.16.3
PodCIDR: 10.244.0.0/24
PodCIDRs: 10.244.0.0/24
Non-terminated Pods: (11 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
kube-system coredns-5644d7b6d9-hvl2c 100m (2%) 0 (0%) 70Mi (0%) 170Mi (2%) 37d
kube-system etcd-dev-k8s-01.kubemaster.top 0 (0%) 0 (0%) 0 (0%) 0 (0%) 141d
kube-system kube-apiserver-dev-k8s-01.kubemaster.top 250m (6%) 0 (0%) 0 (0%) 0 (0%) 141d
kube-system kube-controller-manager-dev-k8s-01.kubemaster.top 200m (5%) 0 (0%) 0 (0%) 0 (0%) 141d
kube-system kube-flannel-ds-amd64-cjh4s 100m (2%) 100m (2%) 50Mi (0%) 50Mi (0%) 141d
kube-system kube-proxy-h2ltx 0 (0%) 0 (0%) 0 (0%) 0 (0%) 141d
kube-system kube-scheduler-dev-k8s-01.kubemaster.top 100m (2%) 0 (0%) 0 (0%) 0 (0%) 141d
kube-system traefik-ingress-controller-546496659b-jzc5l 1 (25%) 2 (50%) 2Gi (26%) 2Gi (26%) 25d
kubernetes-dashboard kubernetes-dashboard-b65488c4-j2gc2 0 (0%) 0 (0%) 0 (0%) 0 (0%) 37d
logging fluentd-es-glnpb 100m (2%) 0 (0%) 200Mi (2%) 500Mi (6%) 9d
monitor node-exporter-mswv7 150m (3%) 0 (0%) 0 (0%) 0 (0%) 75d
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 2 (50%) 2100m (52%)
memory 2368Mi (30%) 2768Mi (35%)
ephemeral-storage 0 (0%) 0 (0%)
Events: <none>
上述命令展示了Node的如下关键信息。