一、Kubernetes
Kubernetes 是一个可扩展的开源平台(Google 在 2014 年开源),用于管理容器化的工作负载和服务,可促进声明式配置和自动化。名称 Kubernetes 源于希腊语,意为“舵手”或“飞行员”,通常简称为k8s。
二、Kubernetes集群架构
和大多数集群一样,通常,一个Kubernetes集群也由多个节点(node)组成,分别叫做管理节点(master node)和工作节点(worker node)。工作节点托管Pod。管理节点管理集群中的工作节点和 Pod。最新的概念上,node特指工作节点,管理节点一般跨多个主机运行,则称为控制平面(control plane)。
三、控制平面组件
即master组件,四必备一可选:
1、kube-apiserver
该组件公开Kubernetes API,是Kubernetes控制平面的前端和核心。kube-apiserver可以通过部署多个实例进行水平伸缩,平衡流量。API 服务器负责提供 HTTP API,使你可以查询和操纵 Kubernetes API 中对象(例如:Pod、Namespace、ConfigMap 和 Event,Kubernetes 平台视一切皆为 API 对象)的状态。部分操作都可以通过 kubectl 命令行接口或 类似 kubeadm 这类命令行工具来执行, 这些工具在背后也是调用 API。当然,我们也可以使用 REST 调用来访问这些 API。
2、etcd
etcd是Kubernetes保存所有集群数据的数据库。是一个兼具一致性和高可用性的键值数据库。
3、kube-scheduler
调度器,负责监视新创建的、未指定运行节点(node)的 Pods,选择节点让 Pod 在上面运行。
4、kube-controller-manager
运行控制器的组件。从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。控制器的全集:attachdetach、bootstrapsigner、cloud-node-lifecycle、clusterrole-aggregation、cronjob、csrapproving、csrcleaner、csrsigning、daemonset、deployment、disruption、endpoint、endpointslice、endpointslicemirroring、ephemeral-volume、garbagecollector、horizontalpodautoscaling、job、namespace、nodeipam、nodelifecycle、persistentvolume-binder、persistentvolume-expander、podgc、pv-protection、pvc-protection、replicaset、replicationcontroller、resourcequota、root-ca-cert-publisher、route、service、serviceaccount、serviceaccount-token、statefulset、tokencleaner、ttl、ttl-after-finished。标红部分是使用Kubernetes过程中中最经常接触到概念,可以看到它们都有对应的控制器,这些控制器都由kube-controller-manager管理。
5、cloud-controller-manager(可选)
云控制器管理器,是指嵌入特定云的控制逻辑的控制平面组件。仅运行特定于云平台的控制回路。
四、Node组件
即在工作节点上运行到组件,有三个:
1、kubelet
kubelet是一个在集群中每个节点(node)上运行的代理。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。
2、kube-proxy
kube-proxy是集群中每个节点上运行的网络代理,实现Kubernetes 服务(Service)概念的一部分。
3、容器运行时
容器运行时是负责运行容器的软件。可类比JVM之于Java程序。容器运行时不仅有我们常用到docker,还有containerd、CRI-O等。
五、插件(Addons)
Kubernetes是可扩展的。常用的KubernetesWeb界面(仪表盘)就是一个插件。插件使用 Kubernetes 资源(DaemonSet、 Deployment等)实现集群功能。
六、Pod
Pod (荚果,如豌豆荚)是一组(一个或多个)容器;这些容器共享存储、网络、以及怎样运行这些容器的声明。Pod是一个逻辑主机。相比Docker,Kubernetes不直接创建容器,而是创建Pod。创建Pod时要指定其中运行的容器。Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。
一个裸Pod的定义示例:
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
wechat: devopscd
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
七、工作负载资源
通常,作为用户,我们很少在 Kubernetes 中直接创建一个个的裸Pod,而是通过工作负载资源来创建和管理多个Pod。工作负载资源简称负载资源,Deployment、ReplicaSet、DaemonSet、Job是比较常见的负载资源。它们都有对应的控制器,在控制平面的kube-controller-manager组件介绍中,我们有列出。
负载资源的控制器通常使用 Pod 模板(Pod Template)来替我们创建和管理 Pod。Pod 模板是包含在工作负载资源中的规范,用来创建 Pod。工作负载的控制器会使用负载对象中的 PodTemplate
来生成实际的 Pod。 PodTemplate
是我们用来运行应用时指定的负载资源的目标状态的一部分。在资源定义yaml中,我们使用template来定义Pod模版。下面介绍几个常用的工作负载资源
1、ReplicaSet
我们以一个ReplicaSet负载资源的定义yaml,来学习template的使用:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: hello1_app
wechat: devopsce
spec:
replicas: 3
selector:
matchLabels:
wechat: devopscd
template:
metadata:
labels:
wechat: devopscd
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
可以看到ReplicaSet的spec嵌套了template,template的spec和前面定义Pod的格式是一致的。
2、Deployment
ReplicaSet 确保任何时间都有指定数量的 Pod 副本在运行。然而,Deployment 是一个更高级的概念,它管理 ReplicaSet,并向 Pod 提供声明式的更新以及许多其他有用的功能。这意味着,你可能永远不需要操作 ReplicaSet 对象:而是使用 Deployment,并在 spec 部分定义你的应用。
一个Deployment示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
提交这个Deployment定义,Kubernetes将创建其中的.spec.replicas所定义的 ReplicaSet 及其管理的 Pod。
3、Job
Job 示例。它负责计算 π 到小数点后 2000 位,并打印结果。
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
Job通常作为一次性的任务执行使用,而非长时间驻留。Job有一些特有的模式,如串、并行、重试次数等。
八、服务(Service)
服务是将运行在一组 Pods 上的应用程序公开为网络服务的抽象方法。简单说,即暴露外部访问的端口,供终端用户使用。
服务在 Kubernetes 中也是一个 REST 对象。也有对应的控制器。
以下是一个服务定义,它将Pod内部的80端口以8080端口对外暴露:
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 8080
九、总结
以上,先介绍了Kubernetes的起源、架构、管理平面组件+节点组件+插件,从点到面、由面到体,使得读者对Kubernetes有了宏观上的整体认识。然后介绍了Pod、工作负载资源、服务,由浅入深,循序渐进,让读者了解Kubernets常用概念的实际作用和区别。
小编看了一遍就懂了!