K8S最小调度单元Pod概述
作者:互联网
注:k8s集群节点信息如下:
[root@k8s-master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master1 Ready control-plane,master 26d v1.20.6 k8s-node1 Ready worker 26d v1.20.6 k8s-node2 Ready worker 26d v1.20.6
一、k8s核心资源Pod介绍
K8s官方文档:https://kubernetes.io/
K8s中文官方文档: https://kubernetes.io/zh/
K8s Github地址:https://github.com/kubernetes/
1、什么是pod
官方文档:https://kubernetes.io/docs/concepts/workloads/pods/
Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器需要指定一个镜像,这样就可以用来运行具体的服务。
一个Pod封装一个容器(也可以封装多个容器),Pod里的容器共享存储、网络等。也就是说,应该把整个pod看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
Pod是需要调度到k8s集群的工作节点来运行的,具体调度到哪个节点,是根据scheduler调度器实现的。
从docker角度来讲,Pod 类似于一组具有共享命名空间和共享文件系统卷的 Docker 容器。
1.1 Pods 如何管理多个容器
Pod中可以同时运行多个容器。同一个Pod中的容器会自动的分配到同一个 node上。同一个Pod中的容器共享资源、网络环境,它们总是被同时调度,在一个Pod中同时运行多个容器是一种比较高级的用法,只有当容器需要紧密配合协作的时候才考虑用这种模式。例如,有一个容器作为web服务器运行,需要用到共享的volume,有另一个“sidecar”容器来从远端获取资源更新这些文件,如图所示:
一些 Pod 有初始化容器也应用容器. Init 容器在应用容器启动之前运行并完成。
Pod 本身为其组成容器提供两种共享资源: 网络和存储
1.2 pod网络
Pod是有IP地址的,每个pod都被分配唯一的IP地址(IP地址是靠网络插件calico、flannel、weave等分配的),POD中的容器共享网络名称空间,包括IP地址和网络端口。
Pod内部的容器可以使用localhost相互通信。 Pod中的容器也可以通过网络插件calico与其他节点的Pod通信。
1.3 pod存储
创建pod的时候可以指定挂载的存储卷。
pod中的所有容器都可以访问共享卷,允许这些容器共享数据。
pod只要挂载持久化数据卷,Pod重启之后数据还是会存在的。
2. pod的工作方式
在K8s中,所有的资源都可以使用一个yaml文件来创建,创建Pod也可以使用yaml配置文件。或者使用kubectl run在命令行创建Pod(不常用)。
2.1 自主式pod
所谓的自主式pod,就是直接定义一个pod资源。如下:
[root@k8s-master1 ~]# mkdir pod [root@k8s-master1 ~]# cd pod/ [root@k8s-master1 pod]# vim pod-tomcat.yaml [root@k8s-master1 pod]# cat pod-tomcat.yaml apiVersion: v1 kind: Pod metadata: name: tomcat-test namespace: default labels: app: tomcat spec: containers: - name: tomcat-java ports: - containerPort: 8080 image: tomcat:8.5-jre8-alpine imagePullPolicy: IfNotPresent
更新yaml资源清单文件
[root@k8s-master1 pod]# kubectl apply -f pod-tomcat.yaml pod/tomcat-test created
查看pod是否创建成功
[root@k8s-master1 pod]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-test 1/1 Running 0 2m32s 10.244.169.129 k8s-node2 <none> <none>
自主式Pod是存在一个问题的,假如不小心删除了pod,pod将不存在。
[root@k8s-master1 pod]# kubectl delete pod tomcat-test pod "tomcat-test" deleted You have new mail in /var/spool/mail/root [root@k8s-master1 pod]# kubectl get pod -o wide No resources found in default namespace.
通过上面可以看到,如果直接定义一个Pod资源,那Pod被删除,就彻底被删除了,不会再创建一个新的Pod,这在生产环境还是具有非常大风险的,所以一般使用pod时,都是由控制器管理的。
2.2 控制器管理的Pod
常见的管理Pod的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。
控制器管理Pod可以确保Pod始终维持在指定的副本数运行。
如:通过Deployment管理Pod。
创建资源清单文件
[root@k8s-master1 pod]# vim nginx-deploy.yaml [root@k8s-master1 pod]# cat nginx-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test labels: app: nginx-deploy spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: my-nginx image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80
更新资源清单文件,查看资源
[root@k8s-master1 pod]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-test 2/2 2 2 32s [root@k8s-master1 pod]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-test-7d464f958f 2 2 2 34s [root@k8s-master1 pod]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-test-7d464f958f-4srgk 1/1 Running 0 39s 10.244.36.76 k8s-node1 <none> <none> nginx-test-7d464f958f-k5nmh 1/1 Running 0 39s 10.244.169.130 k8s-node2 <none> <none>
删除pod:nginx-test-7d464f958f-4srgk,再次查看pod资源
[root@k8s-master1 pod]# kubectl delete pod nginx-test-7d464f958f-4srgk pod "nginx-test-7d464f958f-4srgk" deleted [root@k8s-master1 pod]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-test 2/2 2 2 2m6s [root@k8s-master1 pod]# kubectl get rs NAME DESIRED CURRENT READY AGE nginx-test-7d464f958f 2 2 2 2m11s [root@k8s-master1 pod]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-test-7d464f958f-k5nmh 1/1 Running 0 2m14s 10.244.169.130 k8s-node2 <none> <none> nginx-test-7d464f958f-pxwkv 1/1 Running 0 18s 10.244.36.77 k8s-node1 <none> <none>
发现又重新创建一个新的pod :nginx-test-7d464f958f-pxwkv
通过上面可以发现通过deployment管理的pod,可以确保pod始终维持在指定副本数量。
2.3 通过kubectl run创建Pod
[root@k8s-master1 pod]# kubectl run tomcat-test --image=tomcat:8.5-jre8-alpine --image-pull-policy='IfNotPresent' --port=8080 pod/tomcat-test created You have new mail in /var/spool/mail/root [root@k8s-master1 pod]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-test-7d464f958f-k5nmh 1/1 Running 0 18m nginx-test-7d464f958f-pxwkv 1/1 Running 0 17m tomcat-test 1/1 Running 0 4s
二、创建pod资源流程
Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。
例如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么也可以创建包含三个container的pod。
创建pod资源的流程,如下图所示:
第一步:客户端提交创建Pod的请求,可以通过调用API Server的Rest API接口,也可以通过kubectl命令行工具。如kubectl apply -f filename.yaml(资源清单文件)
第二步:apiserver接收到pod创建请求后,会将yaml中的属性信息(metadata)写入etcd。
第三步:apiserver触发watch机制准备创建pod,信息转发给调度器scheduler,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver将绑定的node信息写入etcd
调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。
scheduler 查看 k8s api ,类似于通知机制。
首先判断:pod.spec.Node == null?
若为null,表示这个Pod请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node。
然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
第四步:apiserver又通过watch机制,调用kubelet,指定pod信息,调用Docker API创建并启动pod内的容器。
第五步:创建完成之后反馈给kubelet, kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd
三、编写yaml文件的方法
如:创建pod资源的yaml文件
通过kubectl explain 查看定义Pod资源包含哪些字段。
[root@k8s-master1 pod]# kubectl explain pod KIND: Pod VERSION: v1 DESCRIPTION: Pod is a collection of containers that can run on a host. This resource is created by clients and scheduled onto hosts. FIELDS: apiVersion <string> APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources kind <string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds metadata <Object> Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata spec <Object> Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status status <Object> Most recently observed status of the pod. This data may not be up to date. Populated by the system. Read-only. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
查看pod.metadata字段如何定义
[root@k8s-master1 pod]# kubectl explain pod.metadata
查看pod.spec字段如何定义
[root@k8s-master1 pod]# kubectl explain pod.spec
查看pod.spec.containers字段如何定义
[root@k8s-master1 pod]# kubectl explain pod.spec.containers
查看pod.spec.container.ports字段如何定义
[root@k8s-master1 pod]# kubectl explain pod.spec.containers.ports KIND: Pod VERSION: v1 RESOURCE: ports <[]Object> DESCRIPTION: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. ContainerPort represents a network port in a single container. FIELDS: containerPort <integer> -required- Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. #containerPort是必须字段, pod中的容器需要暴露的端口。
hostIP <string> What host IP to bind the external port to. #将容器中的服务暴露到宿主机的端口上时,可以指定绑定的宿主机 IP hostPort <integer> Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.
#容器中的服务在宿主机上映射的端口
name <string> If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. protocol <string> Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".
标签:master1,kubectl,K8S,概述,Pod,k8s,root,pod 来源: https://www.cnblogs.com/jiawei2527/p/16633372.html