其他分享
首页 > 其他分享> > K8S最小调度单元Pod概述

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