ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

K8S最小调度单元Pod概述

2022-08-28 22:31:48  阅读:200  来源: 互联网

标签:master1 kubectl K8S 概述 Pod k8s root 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有