第一章、前言

  在上一篇博客中,我们大致简述了一般情况下资源清单的格式,以及如何获得清单配置的命令帮助,下面我们再讲解下清单中spec字段中比较常见的字段及其含义

第二章、常用字段讲解

spec.containers <[]object>

spec.containers <[]object>
spec.containers.name <string>             #pod的名称,必须字段,名称唯一且对象创建后不可以被修改
spec.containers.image <string>               #镜像仓库的路径/镜像的名称:镜像的标签
spec.containers.image.imagePullPolicy <string>        #镜像的下载策略。有三种:Always(总是去仓库下载) ,Never(从不去仓库下载) , IfNotPresent(如果本地没有就去仓库下载)
默认是"IfNotPresent" 但是,如果镜像的标签是latest,则总会是"Always,并且对象一旦被创建,这个字段不允许被改变
spec.containers.ports:       #容器公开的端口列表。在这里公开端口可以为系统提供关于容器使用的网络连接的额外信息,但主要是提供信息。在这里不指定端口不会阻止该端口被公开。任何监听容器内默认的“0.0.0.0”地址的端口都可以从网络访问
spec.containers.ports.containerPort <integer> -required- #pod暴露的端口,此端口仅是额外的信息,对端口是否被暴露没有影响
spec.containers.ports.hostPort <integer> #主机上公开的端口
spec.containers.ports.protocol <string> #端口的协议
spec.containers.ports.hostIP <string> #指定要绑定的主机
spec.containers.command <[]string> #运行的程序,类似于docker中的entrypiont,并且这里的命令不会运行在shell中,如果没有这个字段docker镜像会运行自己entrypiont中的指令
spec.containers.args <[]string> #向docker镜像中传递参数 如果定义了这个字段,docker镜像中cmd命令不会被执行,如果引用变量使用$(VAR_NAME)格式引用,如果想使用命令引用的的方式,需要使用$$(VAR_NAME)方式来引用
#关于args和command的官方文档链接:https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/ 
pod.spec.containers.volumeMounts
  pod.spec.containers.volumeMounts.name
  pod.spec.containers.volumeMounts.mountPath #可以被容器挂载的存储卷的路径,路径不能包含':' 符号
  pod.spec.containers.volumeMounts.subPath #可以被容器挂载的存储卷的路径,并且不会覆盖挂载点中的文件
  pod.spec.containers.volumeMounts.readOnly #是否只读,默认为false
pod.spec.containers.resources
  spec.containers.resources.limits #资源限制
    spec.containers.resources.limits.cpu : CPU 上限, 可以短暂超过, 容器也不会被停止
    spec.containers.resources.limits.memory : 内存上限, 不可以超过; 如果超过, 容器可能会被终止或调度到其他资源充足的机器上
  spec.containers.resources.requests #资源需求
    spec.containers.resources.requests.cpu : CPU 请求, 也是调度 CPU 资源的依据, 可以超过
    spec.containers.resources.requests.memory : 内存请求, 也是调度内存资源的依据, 可以超过; 但如果超过, 容器可能会在 Node 内存不足时清理

spec.nodeSelector <map[string]string>

pod.spec.nodeSelector: #指定对象的调度节点,节点必须存在

pod.spec.restartPolicy <string>

pod.spec.restartPolicy:#容器的重启策略。有三种Always(只有退出就重启),OnFailure(失败退出时不重启),Never(只要退出就不重启),kubelet重新启动的已退出容器将以指数退避延迟(10秒,20秒,40秒......)重新启动,上限为五分钟,并在成功执行十分钟后重置

第三章、简单示例

1.常见pod清单(使用ConfigMap传递环境变量)

[root@k8s-master01 ~]#kubectl create configmap special-config --from literal=special.how=very --from-literal=sepcial.type=charm  #创建一个ConfigMap,ConfigMap是用来存储配置文件的kubernetes资源对象,获取命令帮助kubectl create configmap -h
[root@k8s-master01 ~]#kubectl create configmap env-config --from-literal=log_level=INFO
[root@k8s-master01 ~]#kubectl get configmap special-config -o go-template='{{.data}}' #查看ConfigMap的内容
[root@k8s-master01 ~]#kubectl get configmap env-config -o go-template='{{.data}}'
[root@k8s-master01 manifests]# kubectl label node k8s-node01 disk=ssd #对集群中的一个节点打上标签
[root@k8s-master01 manifests]# cat test-pod.yaml #创建一个测试pod清单
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: test-container #容器名称
image: busybox #镜像路径
command: ["/bin/sh", "-c", "env"] #执行命令,需要注意command、args和container中的entrypiont中的命令和参数相互的关系
env: #配置env
- name: SPECIAL_LEVEL_KEY    #env名称
valueFrom:    #指定env的来源
configMapKeyRef:    #表示从ConfMap中选择
name: special-config    #ConfigMap的文件名称
key: special.how    #ConfigMap中的key名称
- name: SPECIAL_TYPE_KEY
valueFrom:
configMapKeyRef:
name: special-config
key: sepcial.type
envFrom:     #容器中填充环境变量的列表
- configMapRef:           #指定ConfigMap文件
name: env-config         #ConfigMap文件
restartPolicy: Never         #定义重启策略
nodeSelector:           #node选择器
disk: ssd

2.常见pod清单(使用secret传递环境变量)

[root@k8s-master01 manifests]# cat secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MTIzNDU2Cg== #这里的环境变量的值需要使用base64加密,例如:echo "admin"|base64[加密] , echo "YWRtaW4K"|base64 -d [解密]
username: YWRtaW4K
[root@k8s-master01 manifests]# cat secrets-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-nginx
labels:
name: secret-nginx
spec:
volumes:
- name: secret-nginx
secret:
secretName: mysecret
containers:
- name: secret-nginx
image: nginx:1.14.-alpine
volumeMounts:
- name: secret-nginx
mountPath: "/etc/secrets"
readOnly: true
ports:
- name: www
containerPort:
hostPort:

pod清单配置3(定义pod postStart或preStop,即容器创建后和容器中止前需要做的操作)

[root@k8s-master01 manifests]# cat poststart-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: poststart-pod
spec:
containers:
- name: buxybox-httpd
image: busybox
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["mkdir", "-p"," /data/web/html"] #注意,此处command和下面的command不可以有强依赖关系,下面的command会在此处command先执行
command: ["/bin/sh","-c","sleep 3600"]

pod清单配置4(以exec方式对pod进行存活性探测)

[root@k8s-master01 manifests]# cat liveness-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec-pod
spec:
containers:
- name: liveness-exec-pod
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["/bin/sh","-c","touch /tmp/healthy;sleep 30;rm -rf /tmp/healthy;sleep 3600"]
livenessProbe:
exec: #探测方式由三种,exec(执行命令探测) HttpGet(Http请求) tcpSocket(TCP端口探测)
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 2 #容器启动后多长时间开始探测
periodSeconds: 5 #每次探测的间隔时间,单位为秒

pod清单配置5(以HttpGet方式对pod进行存货性探测)

[root@k8s-master01 manifests]# cat liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget-pod
spec:
containers:
- name: liveness-httpget-pod
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
port:
path: /index.html
initialDelaySeconds:
periodSeconds:

pod清单配置6(使用httpget方式对pod进行就绪性探测)

[root@k8s-master01 manifests]# cat readiness-httpget.yaml  #与存活性探测相类似
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
spec:
containers:
- name: readiness-httpget-pod
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
port:
path: /index.html
initialDelaySeconds:
periodSeconds:

k8s学习笔记之五:Pod资源清单spec字段常用字段及含义的更多相关文章

  1. k8s学习笔记之六:Pod控制器(kube-controller-manager)

    第一章.什么是kube-controller-manager? Controller Manager 由 kube-controller-manager 和 cloud-controller-mana ...

  2. K8S学习笔记之Pod的Volume emptyDir和hostPath

    0x00 Volume的类型 Volume是Kubernetes Pod中多个容器访问的共享目录. Volume被定义在Pod上,被这个Pod里的多个容器挂在到相同或不同的路径下. Volume的生命 ...

  3. k8s学习笔记之四:资源清单定义入门

    第一章.k8s中的资源 1.什么叫资源? k8s中所有的内容都抽象为资源, 资源实例化之后,叫做对象 2.在k8s中有哪些资源? 工作负载型资源(workload): Pod ReplicaSet D ...

  4. 【K8s学习笔记】K8s是如何部署应用的?

    本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...

  5. Pod中spec的字段常用字段及含义

    一.Pod中spec的字段常用字段及含义 1.pod.spec.containers ²  spec.containers.name <string>  #pod的名称,必须字段,名称唯一 ...

  6. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息

    Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...

  7. k8s学习笔记

    9.deployment:声明式的升级应用 9.1.使用RC实现滚动升级 #kubectl rolling-update kubia-v1 kubia-v2 --image=luksa/kubia:v ...

  8. k8s 学习笔记

    常用的kubectl命令   kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1   --image 指定镜像 - ...

  9. ASP.NET Core微服务 on K8S学习笔记(第一章:详解基本对象及服务发现)

    课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务1:课程介绍 任务2:Labels and Selectors 所有资源对 ...

随机推荐

  1. Makefile 系统论述

    该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 概述 什么是make ...

  2. librdkafka安装和php扩展php-rdkafka安装

    1.安装librdkafka mac下   brew install librdkafka linux下 git clone https://github.com/edenhill/librdkafk ...

  3. servlet运行“/*”引起的java.lang.StackOverflowError

    <servlet> <servlet-name>login</servlet-name> <servlet-class>com.jd.login.UI. ...

  4. method&interface

    method Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型组合 只能为同一个包的类型定义方法 Receiver可以是类型的值或指针 不存在方法重载 可以使 ...

  5. python day18--面向对象,继承

    # class Animal: # breath = '呼吸' # # def __init__(self, name, sex, age): # self.name = name # self.se ...

  6. 神州数码OSPF路由协议

    实验要求:熟练掌握OSPF配置方法 拓扑如下 R1 enable 进入特权模式 config 进入全局模式 hostname R1 修改名称 interface s0/1 进入端口 ip addres ...

  7. CentOS7 cannot find a valid baseurl for repo base

    找到文件夹: cd /etc/sysconfig/network-scripts/ 然后找ifcfg 开头的文件,挨个打开 里面有下面那些代码前三行的就是,添加后面DNS两行,保持并退出,然后继续执行 ...

  8. ES5与ES6中的继承

    ES5继承在ES5中没有类的概念,所以一般都是基于原型链继承,具体的继承方法有以下几种: 父类: function Father (name) { this.name = name || 'sam' ...

  9. RESTful Loads

    RESTful 一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 概述 ...

  10. 细谈getRequestDispatcher()与sendRedirect()的区别

    问题?细谈getRequestDispatcher()与sendRedirect()的区别 首先我们要知道: (1)request.getRequestDispatcher()是请求转发,前后页面共享 ...