转自:https://blog.csdn.net/yan234280533/article/details/72567261

Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。例如一个web站点应用由前端、后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我们可以创建包含三个container的pod。本文将对Kubernetes的基本处理流程做一个简单的分析。

Pod的创建(单独创建,或者通过deployment创建和管理多个pod)流程如下图所示(图片来源于网络):

具体的创建步骤包括:

1、客户端提交创建请求,可以通过API Server的Restful API,也可以使用kubectl命令行工具。支持的数据类型包括JSON和YAML。

2、API Server处理用户请求,存储Pod数据到etcd。

3、调度器通过API Server查看未绑定的Pod。尝试为Pod分配主机。

4、过滤主机 (调度预选):调度器用一组规则过滤掉不符合要求的主机。比如Pod指定了所需要的资源量,那么可用资源比Pod需要的资源量少的主机会被过滤掉。

5、主机打分(调度优选):对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略,比如把容一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等。

6、选择主机:选择打分最高的主机,进行binding操作,结果存储到etcd中。

7、kubelet根据调度结果执行Pod创建操作: 绑定成功后,scheduler会调用APIServer的API在etcd中创建一个boundpod对象,描述在一个工作节点上绑定运行的所有pod信息。运行在每个工作节点上的kubelet也会定期与etcd同步boundpod信息,一旦发现应该在该工作节点上运行的boundpod对象没有更新,则调用Docker API创建并启动pod内的容器。

另一张更为简洁(来自于网络):

通过 yaml创建简单pod

[root@k8s-master k8s-objs]# cat pod-solo.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: simple-sample-pod
  labels:
    purpose: pod-test
spec:
  containers:
    - name: test-container
      image: tomcat:8
      #command: ["/bin/bash","-c","echo hihihi"] ##加上此句会报错,不知为何,kubectl explain pod.spec.containers.command #查看yaml该项,说The docker image's ENTRYPOINT is used if this is not provided
      env:
        - name: DEMO_GREETING
          value: "hellothefirstk8spod"
  restartPolicy: Never
[root@k8s-master k8s-objs]#
[root@k8s-master k8s-objs]# kubectl create -f pod-solo.yaml
pod/simple-sample-pod created
[root@k8s-master k8s-objs]# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
hello-5cd4456b66-gstq6   1/1     Running     1          7d21h
hello-5cd4456b66-sb5px   1/1     Running     1          7d21h
simple-sample-pod          1/1     Running   0          15s
[root@k8s-master k8s-objs]# kubectl logs simple-sample-pod
11-Apr-2019 11:12:32.972 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.39
11-Apr-2019 11:12:33.018 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Mar 14 2019 11:24:26 UTC
11-Apr-2019 11:12:33.018 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.39.0
11-Apr-2019 11:12:33.018 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux [root@k8s-master k8s-objs]# kubectl describe pod simple-sample-pod
Name:               simple-sample-pod
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               k8s-node1/192.168.111.131
Start Time:         Thu, 11 Apr 2019 19:12:15 +0800
Labels:             purpose=pod-test
Annotations:        <none>
Status:             Running
IP:                 10.244.1.68
Containers:
  test-container:
    Container ID:   docker://fd1c4cdad785bd1ec39372c45d44dbc1fe4c4cb2b1dbbfb8d2ecbf004b13d474
    Image:          tomcat:8
    Image ID:       docker-pullable://tomcat@sha256:3e3d18321127bb9114f4226f95802d3899aeec4c36df84d0359e5da300e9bc72
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 11 Apr 2019 19:12:27 +0800
    Ready:          True
    Restart Count:  0
    Environment:
      DEMO_GREETING:  hellothefirstk8spod
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-92rjn (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-92rjn:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-92rjn
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age    From                Message
  ----    ------     ----   ----                -------
  Normal  Scheduled  2m53s  default-scheduler   Successfully assigned default/simple-sample-pod to k8s-node1
  Normal  Pulled     2m42s  kubelet, k8s-node1  Container image "tomcat:8" already present on machine
  Normal  Created    2m42s  kubelet, k8s-node1  Created container test-container
  Normal  Started    2m41s  kubelet, k8s-node1  Started container test-container
[root@k8s-master k8s-objs]#

删除:

[root@k8s-master k8s-objs]# ls
pod-solo.yaml
[root@k8s-master k8s-objs]# kubectl get pod
NAME                       READY   STATUS    RESTARTS   AGE
hello-2-5bf86f6c95-rpvxb   1/1     Running   0          106m
hello-5cd4456b66-gstq6     1/1     Running   1          8d
hello-5cd4456b66-sb5px     1/1     Running   1          8d
simple-sample-pod          1/1     Running   0          4m30s
[root@k8s-master k8s-objs]#
[root@k8s-master k8s-objs]# kubectl delete -f pod-solo.yaml
pod "simple-sample-pod" deleted
[root@k8s-master k8s-objs]# kubectl get pods
NAME READY STATUS RESTARTS AGE
hello-5cd4456b66-gstq6 / Running 7d21h
hello-5cd4456b66-sb5px / Running 7d21h
[root@k8s-master k8s-objs]#

Kubernetes中pod创建流程的更多相关文章

  1. k8s功能、各组件介绍以及pod创建流程

    一.什么是Kubernetes Kubernetes(k跟s中间隔了8个字母又称k8s) 是谷歌开源的容器集群管理系统,是 Google 多年大规模容器管理技术Borg 的开源版本,主要功能包括: 基 ...

  2. k8s 基础 pod创建流程

    Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例.例如一个web站点应用由前端.后端及数据库构建而成,这三个组件将运行在各自的容器中,那么我 ...

  3. Kubernetes中 Pod 是怎样被驱逐的?

    前言 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO).可压缩资源不可能导致 Pod 被驱 ...

  4. Kubernetes中Pod的健康检查

    本文介绍 Pod 中容器健康检查相关的内容.配置方法以及实验测试,实验环境为 Kubernetes 1.11,搭建方法参考kubeadm安装kubernetes V1.11.1 集群 0. 什么是 C ...

  5. Kubernetes中Pod健康检查

    目录 1.何为健康检查 2.探针分类 2.1.LivenessProbe探针(存活性探测) 2.2.ReadinessProbe探针(就绪型探测) 3.探针实现方法 3.1.Container Exe ...

  6. 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储

    容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...

  7. Kubernetes中资源清单与Pod的生命周期(二)

    一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...

  8. (译)Kubernetes中的多容器Pod和Pod内容器间通信

    原文:https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/Pave ...

  9. 傲视Kubernetes(三):Kubernetes中的Pod

    从本文开始,将正式开始Kubernetes的核心内容学习.首先要了解的是Pod,总共大约分为六篇左右,本篇是第一篇,相信学完之后,我们会对Pod有一个整体的理解. 本文内容: 1.什么是Pod 2.P ...

随机推荐

  1. Centos7 在 Xshell里 vim的配置

    Centos里的VI只默认安装了vim-minimal-7.x.所以无论是输入vi或者vim查看文件,syntax功能都无法正常启用.因此需要用yum安装另外两个组件:vim-common-7.x和v ...

  2. 搞懂webdriver的底层原理,才敢说自己懂自动化!

    Selenium的历史1 selenium1.x:这个时候的selenium,使用的是JavaScript注入技术与浏览器打交道. 需要Selenium RC启动一个Server,将操作Web元素的A ...

  3. 两种解决方法 PHP Warning: File upload error - unable to create a temporary file in Unknown

    原因:上传文件时,没有管理员权限的你不能读取临时文件夹; 解决方法(两种)找到临时文件夹并给当前访问用户所有权限; 方法一: 找到Apache默认的临时文件,步骤如下: 1.找到临时文件夹,一般在C: ...

  4. Windows安装启动MySQL

    Win安装MySQL数据库将下载下来的mysql解压到指定目录下,cmd切换到bin目录下>mysqld -install 安装服务>mysqld -remove 卸载服务>net ...

  5. 2018/11/5 每日分析-test

    郑醇1901,M30向上一笔中,只是看起来不太值得做,主要因为现在30分钟向上一笔空间无法判定,未必能上去(M5中枢如果向上突破并且不背驰才可能有机会:如果直接下去或者向上后背驰,那么这里就只是一个M ...

  6. keras训练和保存

    https://cloud.tencent.com/developer/article/1010815 8.更科学地模型训练与模型保存 filepath = 'model-ep{epoch:03d}- ...

  7. main.js_vue

    下载依赖包:cnpm install 或者cnpm i 启动项目:npm run dev vue如何加载main.js 如果你是用vue.js官网提供的脚手架工具并沿用默认配置的话,你执行npm ru ...

  8. Vsftp的PASV mode(被动模式传送)和Port模式及 Linux下VsFTP配置全方案

    什么叫做PASV mode(被动模式传送)?他是如何工作的? FTP的连接一般是有两个连接的,一个是客户程和服务器传输命令的,另一个是数据传送的连接.FTP服务程序一般会支持两种不同的模式,一种是Po ...

  9. AS导入项目报错:Plugin with id 'com.android.application' not found.

    从github或第三方Demo中获取的项目导入到AndroidStudio中报错Plugin with id 'com.android.application' not found.:今天导入一个讯飞 ...

  10. Java8之分组

    数据库中根据多个条件进行分组 ) from tableA group by a, b 现在不使用sql,而直接使用java编写分组,则通过Java8根据多个条件进行分组代码如下: List<Us ...