基本概念

Pod是kubernetes集群中最基本的资源对象。每个pod由一个或多个业务容器和一个根容器(Pause容器)组成。Kubernetes为每个pod分配唯一的ip,pod内的所有容器共享这个Ip。

可以通过如下操作查看pods:

  1. kubectl get pods -o wide --all-namespaces
  2. NAME READY STATUS RESTARTS AGE IP NODE
  3. missionlive-dz11-com-1622786470-2sk1r 1/1 Running 0 12h 172.17.2.3 ops-k8s-node-252

可以通过如下操作查看详细的Pod信息:

  1. kubectl describe po missionlive-dz11-com-1622786470-2sk1r
  2. Name: missionlive-dz11-com-1622786470-2sk1r
  3. Namespace: default
  4. Node: ops-k8s-node-252/10.1.61.252
  5. Start Time: Mon, 03 Jul 2017 10:30:21 +0800
  6. Labels: envrion=live
  7. name=missionlive-dz11-com
  8. pod-template-hash=1622786470
  9. Status: Running
  10. IP: 172.17.2.3
  11. Controllers: ReplicaSet/missionlive-dz11-com-1622786470
  12. Containers:
  13. missionlive-dz11-com:
  14. Container ID: docker://bf2af6beca7192273a7fb62a150d065564802b2a761fa3715f827cf822f9a021
  15. Image: dk-reg.op.douyuyuba.com/library/missionlive:latest
  16. Image ID: docker-pullable://dk-reg.op.douyuyuba.com/library/missionlive@sha256:2004b8fb41c0e326b9e0816f786dbbe696cf6908e255170a97b0372c9d42888e
  17. Port: 80/TCP
  18. State: Running
  19. Started: Mon, 03 Jul 2017 10:30:27 +0800
  20. Ready: True
  21. Restart Count: 0
  22. Volume Mounts:
  23. /usr/local/ngx_openresty/nginx/conf/vhost from nginx-conf (rw)
  24. Environment Variables:
  25. memory_limit: <set to the key 'memory_limit' of config map 'missionlive-1'>
  26. msgserver: <set to the key 'msgserver' of config map 'missionlive-1'>
  27. post_max_size: <set to the key 'post_max_size' of config map 'missionlive-1'>
  28. str_ip: <set to the key 'str_ip' of config map 'missionlive-1'>
  29. Conditions:
  30. Type Status
  31. Initialized True
  32. Ready True
  33. PodScheduled True
  34. Volumes:
  35. nginx-conf:
  36. Type: ConfigMap (a volume populated by a ConfigMap)
  37. Name: missionlive-2
  38. QoS Class: BestEffort
  39. Tolerations: <none>
  40. No events.

通过使用二层虚拟网络技术(如flannel),kubernetes集群底层网络支持一个Pod容器和另外一个node上的pod内容器之间的tcp/ip通信。

下面是一个pod的示例文件test-pod.yml:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: test-pod
  5. spec:
  6. containers:
  7. - image: docker.io/busybox
  8. command:
  9. - "echo"
  10. args:
  11. - "hello world"

执行kubect create -f test-pod.yml完成pod的创建。

pod创建成功以后,就会被持久化到etcd中,master节点会把pod调度到某个具体的node上,并由该node上的kubelet进程启动相关的docker容器。如果Pod中的容器停止时,kubernetes会重新启动这个Pod,pod所在node节点宕机,则这个Node上的所有pod会被调度到其他 node上。

pod资源配额

Kubernetes可以为Pod设置资源配额,目前支持对cpu核的数量和内存大小两种资源设置限额。

示例如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: frontend
  5. spec:
  6. containers:
  7. - name: db
  8. image: mysql
  9. resources:
  10. requests:
  11. memory: "64Mi"
  12. cpu: "250m"
  13. limits:
  14. memory: "128Mi"
  15. cpu: "250m"
  16. - name: wordpress
  17. image: workdpress
  18. resources:
  19. requests:
  20. memory: "64Mi"
  21. cpu: "250m"
  22. limits:
  23. memory: "128Mi"
  24. cpu: "500m"

spec.containers.resources.requests表示该资源的最小申请量,即pod容器启动时必须要满足的。

spec.containers.resources.limits表示该资源的最大允许数量,当pod内容器使用超过这个量时,该Pod会被kubernetes杀掉并重启。

上面定义mysql容器申请0.25个cpu及64MB内存,运行过程中不超过0.5个cpu和128MB内存

需要说明的是,要使用pod的配额功能,需要在kubernetes的apiserver的配置文件里启用ResourceQuota插件。示例:

  1. KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

容器的健康检查

pod通过LivenessProbe和ReadinessProbe两种探针来检查容器的健康状态:

  • LivenessProbe用于判断容器是否健康,如果LivenessProbe探测到容器不健康,kubelet将删除该容器并根据容器的重启策略做相应的处理。如果容器不包含LivenessProbe,则kubelet认为该容器的LivenessProbe探针永远返回sucess。
  • ReadinessProbe用于判断容器是否启动完成且准备接受请求。如果该探针探测到失败,则Endpoint Controoler将会从Service的Endpoint中删除包含该容器Pod的条目。

Kubelet定期调用容器中的LivenessProbe来检查容器的健康状态。

关于探针的配置参考Configuring Liveness and Readiness Probes

下面给出一个HttpGetAction探针的示例:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. test: liveness
  6. name: liveness-http
  7. spec:
  8. containers:
  9. - name: liveness
  10. args:
  11. - /server
  12. image: gcr.io/google_containers/liveness
  13. livenessProbe:
  14. httpGet:
  15. path: /healthz
  16. port: 8080
  17. httpHeaders:
  18. - name: X-Custom-Header
  19. value: Awesome
  20. initialDelaySeconds: 3
  21. periodSeconds: 3

静态pod

最后简单说一说静态pod。什么是静态pod?我们知道在k8s的整个体系中,实际上实际控制pod启停的组件只有一个,那就是kubelet。kubelet的运行方式 有两种,一种是通过与kubernetes的master节点连接,接受任务并执行。另外一种则是可以作为一个独立组件运行。监听某个目录中的yml文件,当发现变化,就执行yml文件,我们可以在这个目录中定义启动Pod的yml文件,这样不需要master端,kubelet也会自行启动pod,但通过这方式启动的pod没法被master端调度。只能在当前的kubelet主机节点上运行,这种pod就被称作静态pod。另外多说一句,其实在最新版本的kubernetes中,使用kubeadm初始化集群的方式就是借助了这种方式 将master作为容器运行在kubelet管理的静态pod中。

下面是一个kubelet监听本地目录的启动参数示例:

  1. /usr/bin/kubelet --cgroup-driver=systemd --max-pods=30 --allow-privileged=true --pod-infra-container-image=dk-reg.op.douyuyuba.com/kubernetes/pause-amd64:3.0 --pod-manifest-path=/etc/kubernetes/manifests --logtostderr=true --v=2 --address=10.1.61.129 --hostname-override=10.1.61.129

在上面的示例中,kubelet不用连接master,它只需要监听/etc/kuernetes/manifests目录即可。/etc/kubernetes/mainfests目录定义的一个yml文件示例如下:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. annotations:
  5. scheduler.alpha.kubernetes.io/critical-pod: ""
  6. creationTimestamp: null
  7. labels:
  8. component: etcd
  9. tier: control-plane
  10. name: etcd
  11. namespace: kube-system
  12. spec:
  13. containers:
  14. - command:
  15. - etcd
  16. - --advertise-client-urls=http://127.0.0.1:2379
  17. - --data-dir=/var/lib/etcd
  18. - --listen-client-urls=http://127.0.0.1:2379
  19. image: dk-reg.op.douyuyuba.com/kubernetes/etcd-amd64:3.0.17
  20. livenessProbe:
  21. failureThreshold: 8
  22. httpGet:
  23. host: 127.0.0.1
  24. path: /health
  25. port: 2379
  26. scheme: HTTP
  27. initialDelaySeconds: 15
  28. timeoutSeconds: 15
  29. name: etcd
  30. resources: {}
  31. volumeMounts:
  32. - mountPath: /var/lib/etcd
  33. name: etcd
  34. - mountPath: /etc/localtime
  35. name: localtime
  36. hostNetwork: true
  37. volumes:
  38. - hostPath:
  39. path: /data/etcd
  40. name: etcd
  41. - hostPath:
  42. path: /etc/localtime
  43. name: localtime
  44. status: {}

参考:http://blog.frognew.com/2017/01/kubernetes-pods.html

Kubernetes Pod详解的更多相关文章

  1. kubernetes 控制器详解【持续完善中】

    目录 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 4.设置Pod主机名 5.镜像拉取策略(ImagePullPolicy) 二:RC 1.简介 2.模板 三:Deploym ...

  2. pod详解

    什么是pod? 官方说明: Pod是Kubernetes应用程序的最基本执行单元-是你创建或部署Kubernetes对象模型中的最小和最简单的单元. Pod表示在集群上运行的进程.Pod封装了应用程序 ...

  3. kubernetes创建资源对象yaml文件例子--pod详解

    apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...

  4. kubernetes 实践四:Pod详解

    本篇是关于k8s的Pod,主要包括Pod和容器的使用.Pod的控制和调度管理.应用配置管理等内容. Pod的定义 Pod是k8s的核心概念一直,就名字一样,是k8s中一个逻辑概念.Pod是docekr ...

  5. Kubernetes Controller详解

    运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...

  6. Kubernetes ConfigMap详解,多种方式创建、多种方式使用

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 配置是程序绕不开的话题,在Kubernetes中使用ConfigMap来配置,它本质其实就是键值对.本文讲解如何 ...

  7. k8s入坑之路(10)kubernetes coredns详解

    概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...

  8. k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题.   基于 Kubernetes 作为容器集群的管理平 ...

  9. 【转载】k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题. 基于 Kubernetes 作为容器集群的管理平台被 ...

随机推荐

  1. MFC CTreeCtrl运用

    CTreeCtrl运用 删除无效资源 递归的运用 自写遍历目录函数 递归遍历所有子目录 一.删除无效资源 .打开资源文件 .找到无效链接删掉 二.自写遍历目录函数 CFileFind findfile ...

  2. Linux内核中_IO,_IOR,_IOW,_IOWR宏的用法

    #define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0) #define _IOR(type,nr,size)    _IOC(_IOC_RE ...

  3. JAVAWEB 项目注册登录模块问题总结

    tomcat: 假如tomcat服务器启动出现错误,那就可能是servlet或代码的原因 tomcat服务器出现不能访问页面的情况,可以在eclipse tomcat服务器设置里设置为共享服务器模式 ...

  4. [CERC2017]Intrinsic Interval[scc+线段树优化建图]

    题意 给定一个长度为 \(n\) 的排列,有 \(q\) 次询问,每次询问一个区间 \([l,r]\) ,找到最小的包含 \([l,r]\) 的区间,满足这个区间包含了一段连续的数字. \(n\leq ...

  5. Spring Boot(十二):Spring Boot 如何测试打包部署

    有很多网友会时不时的问我, Spring Boot 项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下 Spring Boot 如何开发.调试.打包到最后的投产上线. 开发阶段 ...

  6. Tomcat 基础二

    1.Tomcat 实现了一个新的Servlet容器Catalina: 2.Tomcat:         ROOT         |         |____      /             ...

  7. NodeMCU学习(一) : 开始之前的准备

    安装Aduino开发环境 在官网中下载Arduino开发环境,或者在网盘中下载: 网盘地址: https://pan.baidu.com/s/1OjMhYgKOYW69YC2dEwFgyw: 提取码: ...

  8. npm install的几种命令形式区别

    转自未来与传说.jigetage 我们在使用 npm install 安装模块的时候 ,一般会使用下面这几种命令形式: npm install moduleName # 安装模块到项目目录下 npm ...

  9. 无前趋的顶点优先的拓扑排序方法(JAVA)(转载http://128kj.iteye.com/blog/1706968)

    无前趋的顶点优先的拓扑排序方法 该方法的每一步总是输出当前无前趋(即人度为零)的顶点,其抽象算法可描述为:     NonPreFirstTopSort(G){//优先输出无前趋的顶点       w ...

  10. jmeter学习(1)基础支持+安装部署

    1. Apache jmeter 是100%的java桌面应用程序 支持的协议有:WEB-HTTP/HTTPS   , SOAP,   FTP,  JDBC,  LDAP, MAIL, MongoDB ...