上文说了一下k8s的简单使用,接下来就让我们来具体深入了解一下Pod。为了避免篇幅太长,所以会分成几篇。

目录:

  • Pod定义详解
  • 静态Pod
  • Pod容器共享Volume

一、Pod定义详解

先看一个简单的nginx的Pod定义:

apiVersion: v1
kind: Pod
metadata:
nam: nginx-test
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80

  

上述是一个Pod内包含一个容器,容器中运行nginx,容器对外暴漏80端口

Pod定义主要分成四大块:

(1)api

apiVersion: v1

  

(2)kind

kind: Pod

  

(3)metadata

metadata是Pod的元数据定义

metadata: #元数据
name: string #Pod名称
namespace: string #Pod所属命名空间,缺省默认是default
labels: #自定义标签列表
- key: value
annotations: #自定义注解列表
- key: value

  

(4)spec

spec是Pod中容器的详细定义,主要分成以下几块

containers

containers是Pod中的容器列表,数组类型。

spec:
containers: #容器列表
- name: string #容器名称
image: string #所用镜像
imagePullPolicy: [Always|Never|IfNotPresent] #镜像拉取策略
command: [string] #容器的启动命令列表
args: [string] #启动命令参数列表
workingDir: string #工作目录
volumeMounts: #挂载在容器内部的存储卷配置
- name: string #共享存储卷名称
mountPath: string #存储卷绝对路径
readOnly: boolean #是否只读
ports: #容器需要暴露的端口号列表
- name: string #端口名称
containerPort: int #容器监听端口
hostPort: int #映射宿主机端口
protocol: string #端口协议
env: #环境变量
- name: string
value: string
resources: #资源限制
limits:
cpu: string #单位是core
memory: string #单位是MiB、GiB
livenessProbe: #探针,对Pod各容器健康检查的设置,如几次无回应,则会自动重启
exec:
command: [string]
httpGet:
path: string
port: number
host: string
scheme: string
httpHeaders:
- name: string
value: string
tcpSocket:
port: number
initialDelaySeconds: 0 #启动后多久进行检测
timeoutSeconds: 0 #超时时间
periodSeconds: 0 #间隔时间
successThreshold: 0 #
failureThreshold: 0
securityContext: #权限设置
privileged: false #是否允许创建特权模式的Pod

  

探针测试:

列出文件或文件夹aaa(此目录是不存在的),容器启动后5s开始执行探针,每隔5s执行一次,

apiVersion: v1
kind: Pod
metadata:
name: nginx-test
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
livenessProbe:
exec:
command: ["ls","aaa"]
initialDelaySeconds: 5
timeoutSeconds: 5

  

查看探针三次失败后是否有重启容器:

使用如下命令查看容器的Event项

kubectl describe pods/nginx-test

  

从上图可以看到,容器重启了5次

restartPolicy

容器重启策略:

spec:
restartPolicy: [Always|Never|OnFailure]

  

  • Always:Pod一旦终止运行,kubelet都会进行重启,这也是默认值
  • Never:不会进行重启
  • OnFailure:容器非正常退出(即是退出码不为0),kubelet会重启容器,反之不会重启。

nodeSelector

指定Pod被调度到哪个节点运行。

spec:
nodeSelector:
K: V

  

比如想把一个Pod调度给cnode-2节点运行:

获取集群中所有节点列表:

给cnode-2节点打标签:

kubectl label nodes/cnode-2 name=cnode-2

  

查看cnode-2节点标签信息:

定义Pod的yaml文件:nginx-ns.yaml

apiVersion: v1
kind: Pod
metadata:
name: nginx-test
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
nodeSelector:
name: cnode-2

  

使用如下命令创建Pod:

kubectl create -f nginx-ns.yaml

  

查看这个Pod运行在哪个节点:

imagePullSecrets

拉取镜像时使用的Secret名称,以name:secretKey格式指定

spec:
imagePullSecrets:
name: secretKey

  

Secret是用来保存私密凭据的,比如密码等信息

hostNetwork

是否使用主机网络模式

spec:
hostNetwork: true|false

  

如果使用主机网络模式的话,Pod的IP就是跟宿主机IP是一样的

例如:创建下列Pod

apiVersion: v1
kind: Pod
metadata:
name: nginx-test
labels:
app: nginx-test
spec:
containers:
- name: nginx-test
image: nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
nodeSelector:
name: cnode-3
hostNetwork: true

  

然后查看Pod被分配的IP与主机IP是否相同

volumes

Pod上定义的共享存储列表:

spec:
volumes: #存储卷
- name: string
emptyDir: {} #表示与Pod同生命周期的一个临时目录
hostPath: #宿主机Host
path: string
secret: #挂载集群预定义的secret对象到容器内部
secretName: string
items:
- key: string
path: string
configMap: #挂载集群预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string

  

二、静态Pod

由kubelet管理的仅存在于特定Node上的Pod,不能通过API Service进行管理,无法与RC、deployment或DaemonSet进行关联,并且kubelet也无法对他们进行健康检查,有kubelet创建并运行在kubelet所在的Node上运行。

静态Pod的yaml文件在修改之后,kubelet会进行自动重启该Pod至配置文件生效

创建静态Pod有两种方式:配置文件或者HTTP方式。

下面说一下配置文件的创建方式:

配置文件

需要设置kubelet启动参数“--config”,指定kubelet需要监控的配置文件所在的目录,kubelet会定期扫描该目录,并根据目录中的yaml或json文件进行创建操作

(1)如果集群是通过kubeadm创建的,那么已经配置好了静态pod的路径

查看kubelet的启动参数配置文件路径:

systemctl status kubelet

  

查看配置文件:

启动参数配置在一个叫/var/lib/kubelet/config.yaml的文件中

在此文件中会发现由下图中的配置,也就是静态Pod路径配置为/etc/kubernetes/manifests路径

所以只需要将静态Pod的yaml文件放置在此目录下即可。

这四个Master上运行的核心组件就是通过此方式进行创建的。

例如上图中我将static-nginx.yaml放到/etc/kubernetes/manifests目录下:

apiVersion: v1
kind: Pod
metadata:
name: static-nginx
labels:
name: static-nginx
spec:
containers:
- name: static-nginx
image: nginx
ports:
- containerPort: 80

  

此时使用kubelet get pods就可以查看到相应的Pod

(2)如果不是由kubeadm创建的集群,则需要在kubelet启动参数配置文件中添加如下一行:

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true

  

修改配置之后需要重启kubelet

systemctl stop kubelet
systemctl daemon-reload
systemctl start kubelet

  

例如我在cnode-2上配置了kubelet的启动参数,将静态Pod文件目录设置为/usr/soft/k8s/yaml/staticPod,然后重启kubelet

此时在目录下放置一个yaml文件

保存后就可以查看到相应的Pod是否已创建

【注意】如果Pod没创建成功,可以使用如下命令查看日志

systemctl status kubelet -l

  

我这边因为是之前配置了Pod安全策略,所以导致无法创建,我排查了一天啊我天

,痛苦的教训

Http方式

通过设置kubelet的启动参数“--manifest-url”,kubelet将会定期从该URL地址下载Pod的定义文件,并以.yaml或.json文件的格式进行解析, 然后创建Pod。其实现方式与配置文件方式是一致的。

【注意】静态Pod无法通过kubectl delete进行删除,只能删除对应的yaml文件

三、Pod容器共享Volume

在同一个Pod中的多个容器能够共享Pod级别的存储卷Volume,可以定义为各种类型,至于Volume是何种类型,在k8s基本概念中已有提到,多个容器各自进行挂载,将一个Volume挂在为容器内部需要的目录

比如:Pod里面有两个容器,分别是tomcat和busybox,tomcat往/usr/local/tomcat/logs写日志,busybox从/logs目录读取日志。

新建一个yaml文件:

这里设置的Volume名为app-logs,类型为emptyDir,挂载到tomcat容器内 的/usr/local/tomcat/logs目录,同时挂载到busybox容器内的/logs目录。

apiVersion: v1
kind: Pod
metadata:
name: volume-pod
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: app-logs
mountPath: /usr/local/tomcat/logs
- name: busybox
image: busybox
command: ["sh","-c","tail -f /logs/catalina*.log"]
volumeMounts:
- name: app-logs
mountPath: /logs
volumes:
- name: app-logs
emptyDir: {}

  

创建之后查看busybox的日志输出:

kubectl logs pods/volume-pod -c busybox

  

进入tomcat容器中查看日志文件:

#进入tomcat容器,-c参数指明是哪个容器
kubectl exec -it pods/volume-pod -c tomcat /bin/bash

  

进入在Pod创建时设置的日志目录:

/usr/local/tomcat/logs

  

===============================

我是Liusy,一个喜欢健身的程序员。

欢迎关注微信公众号【Liusy01】,一起交流Java技术及健身,获取更多干货,领取Java进阶干货,领取最新大厂面试资料,一起成为Java大神。

来都来了,关注一波再溜呗。

k8s之深入解剖Pod(一)的更多相关文章

  1. k8s之深入解剖Pod(二)

    目录: Pod配置管理:ConfigMap 容器内获取Pod信息:Downward API Pod生命周期和重启策略 Pod健康检查 一.ConfigMap 将应用所需的配置信息与程序进行分离,可以使 ...

  2. k8s之深入解剖Pod(三)

    目录: Pod的调度 Pod的扩容和缩容 Pod的滚动升级 一.Pod的调度 Pod只是容器的载体,通常需要通过RC.Deployment.DaemonSet.Job等对象来完成Pod的调度和自动控制 ...

  3. k8s核心资源之Pod概念&入门使用讲解(三)

    目录 1. k8s核心资源之Pod 1.1 什么是Pod? 1.2 Pod如何管理多个容器? 1.3 Pod网络 1.4 Pod存储 1.5 Pod工作方式 1.5.1 自主式Pod 1.5.2 控制 ...

  4. k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方?

    k8s集群Job Pod 容器可能因为多种原因失效,想要更加稳定的使用Job负载,有哪些需要注意的地方? 面试官:"计数性Job默认完成模式是什么?Indexed模式如何发布自定义索引呢?& ...

  5. k8s运维之pod排错

    k8s运维之pod排错 K8S是一个开源的,用于管理云平台中多个主机上的容器化应用,Kubernetes的目标是让部署容器化变得简单并且高效 K8S的核心优势: 1,基于yaml文件实现容器的自动创建 ...

  6. 使用Port Forwarding连接k8s集群的pod(redis、mysql等)

    一. 创建Redis的deployment和service 1. 创建Redis deployment redis-master-deployment.yaml  apiVersion: apps/v ...

  7. linux运维、架构之路-K8s通过Service访问Pod

    一.通过Service访问Pod 每个Pod都有自己的IP地址,当Controller用新的Pod替换发生故障的Pod时,新Pod会分配到新的IP地址,例如:有一组Pod对外提供HTTP服务,它们的I ...

  8. kubeadm搭建K8s集群及Pod初体验

    基于Kubeadm 搭建K8s集群: 通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的.只有不断地操作去熟练,强化自己对他的认知,才能提升境界. 我 ...

  9. 12.深入k8s:kubelet创建pod流程源码分析

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 源码版本是1.19 在上一篇中,我们知道在kubelet中,工作核心就是围绕着整个syn ...

随机推荐

  1. CDR简单制作透明字体【6·18特惠倒计时3天!】

    将图片剪贴到文字中是平面设计常用的一种处理方法之一,一般是将图片置入到该文字,且图片的外轮廓是沿着文字的形状剪贴的,这种处理手法被广泛应用于排版设计中.本教程结合蒙版功能加阴影效果做出特殊的视觉效果. ...

  2. [NOIP2013][LGOJ P1967]货车运输

    Problem Link 题目描述 A国有n座城市,编号从1到n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物, 司机们想知道每辆车在不超过车辆限重 ...

  3. CF453C Little Pony and Summer Sun Celebration

    如果一个点需要经过奇数次我们就称其为奇点,偶数次称其为偶点. 考虑不合法的情况,有任意两个奇点不连通(自己想想为什么). 那么需要处理的部分就是包含奇点的唯一一个连通块.先随意撸出一棵生成树,然后正常 ...

  4. E - Knapsack 2 题解(超大01背包)

    题目链接 题目大意 给你一n(n<=100)个物品,物品价值最大为1e3,物品体积最多为1e9,背包最大为1e9 题目思路 如果按照平常的背包来算那么时间复杂度直接O(1e11) 这个你观察就发 ...

  5. SpringBoot整合阿里短信服务

    导读 由于最近手头上需要做个Message Gateway,涉及到:邮件(点我直达).短信.公众号(点我直达)等推送功能,网上学习下,整理下来以备以后使用. 步骤 点我直达 登录短信服务控制台 点我直 ...

  6. Generalizing from a Few Examples: A Survey on Few-Shot Learning 小样本学习最新综述 | 三大数据增强方法

    目录 原文链接:小样本学习与智能前沿 01 Transforming Samples from Dtrain 02 Transforming Samples from a Weakly Labeled ...

  7. 第三十一章、containers容器类部件QDockWidget停靠窗功能介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.概述 QDockWidget类提供了一个可以停靠在QMainWin ...

  8. 第15.31节 PyQt(Python+Qt)入门学习:containers容器类部件GroupBox分组框简介

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 容器部件就是可以在部件内放置其他部件的部件,在Qt Designer中可以使用的容器部件有 ...

  9. 从Linux源码看Socket(TCP)的accept

    从Linux源码看Socket(TCP)的accept 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就从Linux源码的角度看下Serve ...

  10. Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)

    最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法.本篇文章主要包括介绍了存储过程的5个小语法:declare语句的变量.定义条件.处理程 ...