pod基础概念

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes
中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于
暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等

使用方式:

  • 一个Pod中运行一个容器。“每个Pod中一个容器”的模式是最常见的用法;在这种使用方式中,你可以把Pod想象成是单个容器的封装,kuberentes管理的是Pod而不是直接管理容器。
  • 在一个Pod中同时运行多个容器。一个Pod中也可以同时封装几个需要紧密耦合互相协作的容器,它们之间共享资源。这些在同一个Pod中的容器可以互相协作成为一个service单位,比如一个容器共享文件,另一个“sidecar"容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理

一个Pod下的容器必须运行于同一节点上。现代容器技术建议一个容器只运行一个进程,该进程在容器中PID命令空间中的进程号为1,可直接接收并处理信号,进程终止时容器生命周期也就结束了。若想在容器内运行多个进程,需要有一个类似Linux操作系统init进程的管控类进程,以树状结构完成多进程的生命周期管理。运行于各自容器内的进程无法直接完成网络想信,这是由于容器间的隔离机制导致,k8s中的Pod资源抽象正是解决此类问题,Pod对象是一组容器的集合,这些容器共享Network、UTS及IPC命令空间,因此具有相同的域名、主机名和网络接口,并可通过IPC直接通信

Pod资源中针对各容器提供网络命令空间等共享机制的是底层基础容器pause,基础容器(也可称为父容器)pause就是为了管理Pod容器间的共字操作,这个父容器需要能够准确地知道如何去创建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这个父容器的构想,kubernetes中,用pause容器来作为一个Pod中所有容器的父容器。这个pause容器有两个核心的功能,一是它提供整个Pod的Linux命名空间的基础。二来启用PID命名空间,它在每个Pod中都作为PID为1进程(init进程) ,并回收僵尸进程

pod分类

自主式Pod
这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱

控制器管理的Pod

Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可 以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器

k8s核心组件

k8s架构图

  • etcd 保存了整个集群的状态;
  • API Server 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • Controller Manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • Scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • Kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
  • Container Runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
  • Kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;

Pod

Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器。

Volume

卷,用来管理k8s存储,是用来申明在Pod中的容器可以访问文件的目录,一个卷可以被挂载在Pod中一个或者多个容器的指定路径下面。一个Volume可以支持多种后端的存储,比如ceph,GlusterFS。

Volume的生命周期和Pod生命周期绑定,无法解决数据持久化存储的问题,如果想要数据能够持久化,需要将Pod和卷的生命周期分离,因此引入持久卷(PV)。

Deployment

Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,它也会去帮助 Deployment 自动恢复失败的 Pod。

Namespace

Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,比如刚才讲的 Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名。

kubectl常用命令

 get (列出所有的pod)

[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg   0/1     Pending   0          12m

//列出所有pod并提供详细信息
[root@master ~]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-f6kcg   0/1     Pending   0          12m   <none>   <none>   <none>           <none>

//指定列出某个pod的信息
[root@master ~]# kubectl get deployment nginx
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   0/1     1            0           13m

//以JSON输出格式列出单个 Pod
[root@master ~]# kubectl get -o json pod nginx-6799fc88d8-f6kcg
{
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
        "creationTimestamp": "2021-12-19T11:19:41Z",
        "generateName": "nginx-6799fc88d8-",
        "labels": {
            "app": "nginx",
            "pod-template-hash": "6799fc88d8"
        },
        "managedFields": [
            {
                "apiVersion": "v1",
                "fieldsType": "FieldsV1",
                "fieldsV1": {
                    "f:metadata": {
                        "f:generateName": {},
                        "f:labels": {
                            ".": {},
                            "f:app": {},
                            "f:pod-template-hash": {}
                        },
                        "f:ownerReferences": {
                            ".": {},
                            "k:{\"uid\":\"4f9058eb-59c8-4168-bd80-6413e2b3f945\"}": {
                                ".": {},
                                "f:apiVersion": {},
                                "f:blockOwnerDeletion": {},
                                "f:controller": {},
                                "f:kind": {},
                                "f:name": {},
                                "f:uid": {}
                            }
                        }
                    },
                    "f:spec": {
                        "f:containers": {
                            "k:{\"name\":\"nginx\"}": {
                                ".": {},
                                "f:image": {},
                                "f:imagePullPolicy": {},
                                "f:name": {},
                                "f:resources": {},
                                "f:terminationMessagePath": {},
                                "f:terminationMessagePolicy": {}
                            }
                        },
                        "f:dnsPolicy": {},
                        "f:enableServiceLinks": {},
                        "f:restartPolicy": {},
                        "f:schedulerName": {},
                        "f:securityContext": {},
                        "f:terminationGracePeriodSeconds": {}
                    }
                },
                "manager": "kube-controller-manager",
                "operation": "Update",
                "time": "2021-12-19T11:19:41Z"
            },
            {
                "apiVersion": "v1",
                "fieldsType": "FieldsV1",
                "fieldsV1": {
                    "f:status": {
                        "f:conditions": {
                            ".": {},
                            "k:{\"type\":\"PodScheduled\"}": {
                                ".": {},
                                "f:lastProbeTime": {},
                                "f:lastTransitionTime": {},
                                "f:message": {},
                                "f:reason": {},
                                "f:status": {},
                                "f:type": {}
                            }
                        }
                    }
                },
                "manager": "kube-scheduler",
                "operation": "Update",
                "time": "2021-12-19T11:19:41Z"
            }
        ],
        "name": "nginx-6799fc88d8-f6kcg",
        "namespace": "default",
        "ownerReferences": [
            {
                "apiVersion": "apps/v1",
                "blockOwnerDeletion": true,
                "controller": true,
                "kind": "ReplicaSet",
                "name": "nginx-6799fc88d8",
                "uid": "4f9058eb-59c8-4168-bd80-6413e2b3f945"
            }
        ],
        "resourceVersion": "1607",
        "uid": "6b047ec2-9e5d-4ab5-874c-47205ac5ce48"
    },
    "spec": {
        "containers": [
            {
                "image": "nginx",
                "imagePullPolicy": "Always",
                "name": "nginx",
                "resources": {},
                "terminationMessagePath": "/dev/termination-log",
                "terminationMessagePolicy": "File",
                "volumeMounts": [
                    {
                        "mountPath": "/var/run/secrets/kubernetes.io/serviceaccount",
                        "name": "default-token-4lktd",
                        "readOnly": true
                    }
                ]
            }
        ],
        "dnsPolicy": "ClusterFirst",
        "enableServiceLinks": true,
        "preemptionPolicy": "PreemptLowerPriority",
        "priority": 0,
        "restartPolicy": "Always",
        "schedulerName": "default-scheduler",
        "securityContext": {},
        "serviceAccount": "default",
        "serviceAccountName": "default",
        "terminationGracePeriodSeconds": 30,
        "tolerations": [
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/not-ready",
                "operator": "Exists",
                "tolerationSeconds": 300
            },
            {
                "effect": "NoExecute",
                "key": "node.kubernetes.io/unreachable",
                "operator": "Exists",
                "tolerationSeconds": 300
            }
        ],
        "volumes": [
            {
                "name": "default-token-4lktd",
                "secret": {
                    "defaultMode": 420,
                    "secretName": "default-token-4lktd"
                }
            }
        ]
    },
    "status": {
        "conditions": [
            {
                "lastProbeTime": null,
                "lastTransitionTime": "2021-12-19T11:19:41Z",
                "message": "0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.",
                "reason": "Unschedulable",
                "status": "False",
                "type": "PodScheduled"
            }
        ],
        "phase": "Pending",
        "qosClass": "BestEffort"
    }
}

create(创建pod)

//创建一个deployment类型叫test1的pod
[root@master ~]# kubectl create deployment test1 --image nginx
deployment.apps/test1 created

//查看
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg   0/1     Pending   0          17m
test1-6d5588f8cc-m2jrv   0/1     Pending   0          40s

//创建一个名为test2的pod,并执行sleep 600命令
[root@master ~]# kubectl create deployment test2 --image busybox -- sleep 600
deployment.apps/test2 created

//查看
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg   0/1     Pending   0          18m
test1-6d5588f8cc-m2jrv   0/1     Pending   0          104s
test2-84c4957768-wbts8   0/1     Pending   0          3s


//创建3个名为testweb的pod(名字中不能含有符号)
[root@master ~]# kubectl create deployment testweb --image nginx --replicas 3
deployment.apps/testweb created

//查看
[root@master ~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg     0/1     Pending   0          19m
test1-6d5588f8cc-m2jrv     0/1     Pending   0          3m10s
test2-84c4957768-wbts8     0/1     Pending   0          89s
testweb-56744c9b58-8fgdn   0/1     Pending   0          3s
testweb-56744c9b58-d8nq7   0/1     Pending   0          3s
testweb-56744c9b58-lc8cl   0/1     Pending   0          3s

run(运行pod)

//以nginx镜像为基础,运行一个名为test3的pod,若没有,就创建
[root@master ~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg     0/1     Pending   0          19m
test1-6d5588f8cc-m2jrv     0/1     Pending   0          3m10s
test2-84c4957768-wbts8     0/1     Pending   0          89s
testweb-56744c9b58-8fgdn   0/1     Pending   0          3s
testweb-56744c9b58-d8nq7   0/1     Pending   0          3s
testweb-56744c9b58-lc8cl   0/1     Pending   0          3s
[root@master ~]# kubectl run test3 --image nginx
pod/test3 created
[root@master ~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg     0/1     Pending   0          21m
test1-6d5588f8cc-m2jrv     0/1     Pending   0          4m45s
test2-84c4957768-wbts8     0/1     Pending   0          3m4s
test3                      0/1     Pending   0          2s
testweb-56744c9b58-8fgdn   0/1     Pending   0          98s
testweb-56744c9b58-d8nq7   0/1     Pending   0          98s
testweb-56744c9b58-lc8cl   0/1     Pending   0          98s

//创建一个带有标签“test=nginx”的pod
[root@master ~]# kubectl run nginx --image nginx --labels "test=nginx"
pod/nginx created
[root@master ~]# kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
nginx                      0/1     Pending   0          3s
nginx-6799fc88d8-f6kcg     0/1     Pending   0          23m

delete(删除pod)

-f 强制删除

-l 指定标签pod删除

//单个指定删除
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  0/1     Pending   0          13m
nginx                    0/1     Pending   0          14m
nginx-6799fc88d8-f6kcg   0/1     Pending   0          37m
test1-6d5588f8cc-m2jrv   0/1     Pending   0          21m
test2-84c4957768-wbts8   0/1     Pending   0          19m
test3                    0/1     Pending   0          16m
[root@master ~]# kubectl delete deployment b2
deployment.apps "test3" deleted
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
busybox                  0/1     Pending   0          13m
nginx                    0/1     Pending   0          14m
nginx-6799fc88d8-f6kcg   0/1     Pending   0          37m
test1-6d5588f8cc-m2jrv   0/1     Pending   0          21m
test2-84c4957768-wbts8   0/1     Pending   0          19m

//全部删除
[root@master ~]# kubectl delete deployment --all
deployment.apps "nginx" deleted
deployment.apps "test1" deleted
deployment.apps "test2" deleted
[root@master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE

//删除带有指定标签的
[root@master ~]# kubectl run test --image nginx --labels "app=nginx"
pod/test created
[root@master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
busybox   0/1     Pending   0          17m
nginx     0/1     Pending   0          18m
test      0/1     Pending   0          1s
[root@master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
busybox   0/1     Pending   0          17m
nginx     0/1     Pending   0          18m

scale

//将名为“nginx”的pod集缩放到 3
[root@master ~]# kubectl scale --replicas 3 deployment/nginx
deployment.apps/nginx scaled
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg   1/1     Pending   0          15s
nginx-6799fc88d8-r3s69   1/1     Pending   0          15s
nginx-6799fc88d8-r5s8s   1/1     Pending   0          26h

//如果名为nginx当前大小的部署为 3,则将 mysql 扩展到 4
[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-f6kcg   1/1     Pending   0          12m
nginx-6799fc88d8-r3s69   1/1     Pending   0          12m
nginx-6799fc88d8-r5s8s   1/1     Pending   0          26h

[root@master ~]# kubectl scale --current-replicas 3 --replicas 4 deployment/nginx
deployment.apps/nginx scaled

[root@master ~]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6799fc88d8-rsod8   1/1     Pending   0          33s
nginx-6799fc88d8-f6kcg   1/1     Pending   0          12m
nginx-6799fc88d8-r3s69   1/1     Pending   0          12m
nginx-6799fc88d8-r5s8s   1/1     Pending   0          26h

autoscale

自动扩展

  1. min:最少扩展
  2. max:最大扩展
  3. percent:百分比
[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx                    1/1     Running   0          28m
nginx-6799fc88d8-rsod8   1/1     Pending   0          9m
nginx-6799fc88d8-f6kcg   1/1     Pending   0          12m
nginx-6799fc88d8-r3s69   1/1     Pending   0          12m
nginx-6799fc88d8-r5s8s   1/1     Pending   0          26h
[root@master ~]# kubectl autoscale --min 1 --max 5 --cpu-percent 50 deploy/nginx 
horizontalpodautoscaler.autoscaling/nginx autoscaled
[root@master ~]# kubectl get hpa 
NAME    REFERENCE          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   <unknown>/50%   1         5         0          9s
[root@master ~]# kubectl get pods 
NAME                     READY   STATUS    RESTARTS   AGE
nginx                    1/1     Running   0          28m
nginx-6799fc88d8-rsod8   1/1     Pending   0          9m
nginx-6799fc88d8-f6kcg   1/1     Pending   0          12m
nginx-6799fc88d8-r3s69   1/1     Pending   0          12m
nginx-6799fc88d8-r5s8s   1/1     Pending   0          26h

kubectl cp

把本机文件复制传输到指定pod的容器

[root@master ~]# ls     
anaconda-ks.cfg  init  kube-flannel.yml
[root@master ~]# kubectl cp /root/anaconda-ks.cfg web:/opt/   
[root@master ~]# kubectl exec web -- ls /opt/
anaconda-ks.cfg

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐