Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。Kubernetes提供了一种方便的方式来管理容器化应用程序,使得开发人员和运维人员可以更加轻松地部署、扩展和管理应用程序。Kubernetes可以在多个云平台和本地环境中运行,支持多种容器运行时,并提供了丰富的API和工具来管理和监控容器化应用程序。
主要由以下几个部分组成:
-
Master节点:是Kubernetes集群的控制中心,负责管理和监控所有的 Node 节点和 Pod。Master节点由多个组件组成:API Server、Etcd和Controller Manager和kube schedule等。在Kubernetes集群中,可以设置多个Master节点,其中一个是主节点,其他节点是备份节点。如果主节点挂掉了,备份节点将自动接管控制权。
-
Node节点:是Kubernetes集群中的工作节点,它们运行着应用程序的容器和Kubernetes的各种组件,如kubelet、container-runtime和kube-proxy等。node节点和master节点通过网络连接进行通信,并协同工作以保证应用程序的高可用性和可伸缩性。
-
Pod:是Kubernetes中最小的可部署单元,它是一个或多个容器的集合,这些容器共享网络和存储。Pod通常用于运行一个应用程序或一组相关的进程。
-
Service:Kubernetes通过Service对象来对外提供服务。Service是一个抽象的逻辑概念,它定义了一组Pod的访问方式以及访问这组Pod的策略。当一个Service被创建后,Kubernetes会为它分配一个虚拟IP地址,称为ClusterIP,这个IP地址可以被集群内的其他服务或者客户端使用来访问这个Service。如果需要将Service暴露给集群外部,可以使用LoadBalancer或者NodePort类型的Service。使用LoadBalancer类型的Service时,Kubernetes会在Service后面自动创建一个负载均衡器,并将请求分发给Service后面的多个Pod。使用NodePort类型的Service时,Kubernetes会在每个节点上监听一个固定的端口,并将请求转发给Service后面的Pod。Service是通过kube-proxy实现负载均衡的。
-
Volume:是Kubernetes中用于持久化数据的抽象,它可以将容器中的数据持久化到磁盘上,以便在容器被重新调度或重启时保留数据。
-
Namespace:是Kubernetes中用于隔离和管理资源的虚拟集群,它可以将集群中的资源划分为不同的逻辑单元,以便更好地管理和监控资源。
pod挂掉如何处理
在Kubernetes中当一个Pod挂掉时,Kubernetes会自动检测到该Pod的状态,并且会根据你的配置进行自动恢复。如果你的Pod是由Deployment、StatefulSet或者ReplicaSet控制的,Kubernetes会自动创建一个新的Pod实例来替代挂掉的Pod。如果你的Pod是由一个Job或者CronJob控制的,Kubernetes会重新启动它,直到它成功完成为止。
在Pod挂掉时,你可以使用kubectl命令来查看Pod的状态和日志,以便找出问题所在。如果问题是由容器本身引起的,你可以检查容器的日志来查找错误信息。如果问题是由Pod所在的节点引起的,你可以检查节点的日志和状态来查找问题所在。
master节点的组件
- API Server 是 Master 节点的核心组件,它提供了 Kubernetes 集群中所有资源对象的访问接口,包括 Pod、Service、Deployment 等
- Controller Manager负责监控集群状态,确保系统中的各种资源对象处于预期的状态。Controller Manager 包含了多个控制器,每个控制器都负责监控和管理一个特定的资源对象。例如,Replication Controller 控制器负责管理 Pod 的副本数量,Deployment 控制器负责管理Pod的创建、更新和删除,Service 控制器负责为 Pod 提供服务发现和负载均衡等功能
- etcd是一个分布式的键值对存储数据库,主要是用于保存k8s集群状态数据。
- kube scheduler负责集群资源调度,其作用是将待调度的pod通过一系列复杂的调度算法计算出最合适的node节点,然后将pod绑定到目标节点上。shceduler会根据pod的信息,全部节点信息列表,过滤掉不符合要求的节点,过滤出一批候选节点,然后给候选节点打分,选分最高的就是最佳节点,scheduler就会把目标pod安置到该节点。
kubelet的作用
Kubelet是Kubernetes中一个非常重要的组件,它运行在每个节点上,负责管理节点上的容器。具体来说,Kubelet的作用包括以下几个方面:
- 监控容器状态:Kubelet会定期向Docker或者其他容器运行时查询容器的状态,并将状态信息汇报给Kubernetes的控制平面。
- 启动和停止容器:当Kubernetes需要启动一个新的Pod时,它会向Kubelet发送一个启动容器的请求,Kubelet会根据Pod的定义启动相应的容器;当Pod被删除时,Kubelet会停止Pod中所有容器的运行。
- 挂载存储卷:Kubelet会根据Pod的定义,将存储卷挂载到相应的容器中。
- 执行健康检查:Kubelet会定期执行容器的健康检查,如果发现容器不健康,会将容器标记为失败,并通知Kubernetes的控制平面。
- 安全性管理:Kubelet会确保Pod中的容器只能使用分配给它们的资源,并确保容器不会访问它们不应该访问的资源。
container-runtime
容器运行时环境,即运行容器所需要的一系列程序,目前k8s支持的容器运行时有很多,如docker、rkt或其他,比较受欢迎的是docker。
kubectl常用命令
- kubectl get:获取资源的信息,例如获取Pod列表、获取Deployment列表等。
- kubectl describe:获取资源的详细信息,例如获取Pod的详细信息、获取Deployment的详细信息等。
- kubectl create:创建资源,例如创建Pod、创建Deployment等。
- kubectl apply:应用配置文件,例如应用Pod配置文件、应用Deployment配置文件等。
- kubectl delete:删除资源,例如删除Pod、删除Deployment等。
- kubectl exec:在容器内部执行命令,例如在Pod中的容器内部执行命令。
- kubectl logs:获取容器日志,例如获取Pod中容器的日志。
- kubectl port-forward:将Pod中的端口转发到本地,例如将Pod中的80端口转发到本地的8080端口。
- kubectl rollout:管理部署的滚动更新,例如回滚到之前的版本、暂停和恢复滚动更新等。
- kubectl scale:扩展或缩小资源的副本数量,例如扩展Deployment的副本数量。
service配置
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- name: http
port: 80
targetPort: 8080
type: LoadBalancer
在这个例子中,我们创建了一个名为my-service的Service对象,并将其类型设置为LoadBalancer。当你使用LoadBalancer类型的Service时,Kubernetes会在Service后面自动创建一个负载均衡器,并将请求分发给Service后面的多个Pod。还可以在配置中指定使用的镜像和pod实例数等信息。
kind字段用于指定Kubernetes资源对象的类型,常见的值有以下几种
- Pod:代表一个或多个容器的运行实例。
- Service:定义了一组Pod的访问方式和网络策略,使其能够作为一个抽象服务对外提供访问。
- Deployment:用于声明式地定义Pod的部署配置,管理Pod副本的创建和更新。
- ReplicaSet:用于定义Pod副本的规模和创建策略。
- StatefulSet:与Deployment类似,但为有状态应用程序提供有序部署和唯一标识的网络标识。
- DaemonSet:确保每个节点上都运行一个Pod副本,用于在整个集群中运行系统级任务或日志收集等操作。
- Job:用于一次性或定期执行任务,直至成功完成。
- CronJob:基于时间表的任务调度器,用于按照预定的时间表周期性地运行任务。










网友评论