Kubernetes Pod详解
基本概念
Pod是kubernetes集群中最基本的资源对象。每个pod由一个或多个业务容器和一个根容器(Pause容器)组成。Kubernetes为每个pod分配唯一的ip,pod内的所有容器共享这个Ip。
可以通过如下操作查看pods:
kubectl get pods -o wide --all-namespaces
NAME READY STATUS RESTARTS AGE IP NODE
missionlive-dz11-com-1622786470-2sk1r 1/1 Running 0 12h 172.17.2.3 ops-k8s-node-252
可以通过如下操作查看详细的Pod信息:
kubectl describe po missionlive-dz11-com-1622786470-2sk1r
Name: missionlive-dz11-com-1622786470-2sk1r
Namespace: default
Node: ops-k8s-node-252/10.1.61.252
Start Time: Mon, 03 Jul 2017 10:30:21 +0800
Labels: envrion=live
name=missionlive-dz11-com
pod-template-hash=1622786470
Status: Running
IP: 172.17.2.3
Controllers: ReplicaSet/missionlive-dz11-com-1622786470
Containers:
missionlive-dz11-com:
Container ID: docker://bf2af6beca7192273a7fb62a150d065564802b2a761fa3715f827cf822f9a021
Image: dk-reg.op.douyuyuba.com/library/missionlive:latest
Image ID: docker-pullable://dk-reg.op.douyuyuba.com/library/missionlive@sha256:2004b8fb41c0e326b9e0816f786dbbe696cf6908e255170a97b0372c9d42888e
Port: 80/TCP
State: Running
Started: Mon, 03 Jul 2017 10:30:27 +0800
Ready: True
Restart Count: 0
Volume Mounts:
/usr/local/ngx_openresty/nginx/conf/vhost from nginx-conf (rw)
Environment Variables:
memory_limit: <set to the key 'memory_limit' of config map 'missionlive-1'>
msgserver: <set to the key 'msgserver' of config map 'missionlive-1'>
post_max_size: <set to the key 'post_max_size' of config map 'missionlive-1'>
str_ip: <set to the key 'str_ip' of config map 'missionlive-1'>
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
nginx-conf:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: missionlive-2
QoS Class: BestEffort
Tolerations: <none>
No events.
通过使用二层虚拟网络技术(如flannel),kubernetes集群底层网络支持一个Pod容器和另外一个node上的pod内容器之间的tcp/ip通信。
下面是一个pod的示例文件test-pod.yml:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- image: docker.io/busybox
command:
- "echo"
args:
- "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核的数量和内存大小两种资源设置限额。
示例如下:
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: db
image: mysql
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "250m"
- name: wordpress
image: workdpress
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
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插件。示例:
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探针的示例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
args:
- /server
image: gcr.io/google_containers/liveness
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: X-Custom-Header
value: Awesome
initialDelaySeconds: 3
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监听本地目录的启动参数示例:
/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文件示例如下:
apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: null
labels:
component: etcd
tier: control-plane
name: etcd
namespace: kube-system
spec:
containers:
- command:
- etcd
- --advertise-client-urls=http://127.0.0.1:2379
- --data-dir=/var/lib/etcd
- --listen-client-urls=http://127.0.0.1:2379
image: dk-reg.op.douyuyuba.com/kubernetes/etcd-amd64:3.0.17
livenessProbe:
failureThreshold: 8
httpGet:
host: 127.0.0.1
path: /health
port: 2379
scheme: HTTP
initialDelaySeconds: 15
timeoutSeconds: 15
name: etcd
resources: {}
volumeMounts:
- mountPath: /var/lib/etcd
name: etcd
- mountPath: /etc/localtime
name: localtime
hostNetwork: true
volumes:
- hostPath:
path: /data/etcd
name: etcd
- hostPath:
path: /etc/localtime
name: localtime
status: {}
参考:http://blog.frognew.com/2017/01/kubernetes-pods.html
Kubernetes Pod详解的更多相关文章
- kubernetes 控制器详解【持续完善中】
目录 资源创建详解 一:Pod及常用参数 1.简介 2.模板 3.删除pod 4.设置Pod主机名 5.镜像拉取策略(ImagePullPolicy) 二:RC 1.简介 2.模板 三:Deploym ...
- pod详解
什么是pod? 官方说明: Pod是Kubernetes应用程序的最基本执行单元-是你创建或部署Kubernetes对象模型中的最小和最简单的单元. Pod表示在集群上运行的进程.Pod封装了应用程序 ...
- kubernetes创建资源对象yaml文件例子--pod详解
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中 kind: Pod #指定创建资源的角色/类型 metadata: #资源的元数据/属性 name: ...
- kubernetes 实践四:Pod详解
本篇是关于k8s的Pod,主要包括Pod和容器的使用.Pod的控制和调度管理.应用配置管理等内容. Pod的定义 Pod是k8s的核心概念一直,就名字一样,是k8s中一个逻辑概念.Pod是docekr ...
- Kubernetes Controller详解
运行容器化应用是Kubernetes最重要的核心功能.为满足不同的业务需要,Kubernetes提供了多种Controller,主要包括Deployment.DaemonSet.Job.CronJob ...
- Kubernetes ConfigMap详解,多种方式创建、多种方式使用
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 配置是程序绕不开的话题,在Kubernetes中使用ConfigMap来配置,它本质其实就是键值对.本文讲解如何 ...
- k8s入坑之路(10)kubernetes coredns详解
概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...
- k8s入坑之路(2)kubernetes架构详解
每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题. 基于 Kubernetes 作为容器集群的管理平 ...
- 【转载】k8s入坑之路(2)kubernetes架构详解
每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题. 基于 Kubernetes 作为容器集群的管理平台被 ...
随机推荐
- Centos7下python3安装ipython
一.通过压缩包安装ipython 1.下载ipython安装包 [root@localhost ~]# wget https://pypi.python.org/packages/79/63/b671 ...
- R实战 第九篇:数据标准化
数据标准化处理是数据分析的一项基础工作,不同评价指标往往具有不同的量纲,数据之间的差别可能很大,不进行处理会影响到数据分析的结果.为了消除指标之间的量纲和取值范围差异对数据分析结果的影响,需要对数据进 ...
- Security5:授予权限
SQL Server授予用户访问对象的权限,通常的模式是:Grants permissions on a securable to a principal(user or login),也就是说,授予 ...
- Dubbo+zookeeper搭建环境学习笔记
Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起. 1.单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本 ...
- 基于.NET Standard的分布式自增ID算法--Snowflake
概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法.搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier. 那么为何还要引 ...
- CocoStuff—基于Deeplab训练数据的标定工具【二、用已提供的标注数据跑通项目】
一.说明 本文为系列博客第二篇,主要讲述笔者在使用该团队提供已经标注好的COCO数据集进行训练的过程. 由于在windows中编译Caffe和Deeplab特别的麻烦,笔者并没有去探索,后续可能会去尝 ...
- B1004. 成绩排名
这一题总算是把C++的重载活学活用了一回,节省了很多脑细胞. #include<bits/stdc++.h> using namespace std; struct student{ st ...
- 一个http请求发送到后端的详细过程
我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...
- Linux内核分析——第三周学习笔记20135308
第三周 构造一个简单的Linux系统MenuOS 计算机三个法宝: 1.存储程序计算机 2.函数调用堆栈 3.中断 操作系统两把宝剑: 1.中断上下文的切换:保存现场和恢复现场 2.进程上下文的切换 ...
- ELK Stack (2) —— ELK + Redis收集Nginx日志
ELK Stack (2) -- ELK + Redis收集Nginx日志 摘要 使用Elasticsearch.Logstash.Kibana与Redis(作为缓冲区)对Nginx日志进行收集 版本 ...