Pod(下)

参考文章

K8s创建pod yaml文件详解 - 大川哥 - 博客园 (cnblogs.com)

上一节中,介绍了 pod 的特性,以及创建一个简单的 pod 流程。这一节中,重点介绍一些 pod 中的各个属性的含义。

基础

进阶

从网上随便找了一个 pod 的 yaml 描述文件:

apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中  
kind: Pod #指定创建资源的角色/类型  
metadata: #资源的元数据/属性  
  name: web04-pod #资源的名字,在同一个namespace中必须唯一  
  labels: #设定资源的标签,详情请见http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:            #自定义注解列表  
    - name: String        #自定义注解名字  
spec:#specification of the resource content 指定该资源的内容  
  restartPolicy: Always #表明该容器一直运行,默认k8s的策略,在此容器退出后,会立即创建一个相同的容器  
  nodeSelector:     #节点选择,先给主机打标签kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  containers:  
  - name: web04-pod #容器的名字  
    image: web:apache #容器使用的镜像地址  
    imagePullPolicy: Never #三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略,
                           # Always,每次都检查
                           # Never,每次都不检查(不管本地是否有)
                           # IfNotPresent,如果本地有就不检查,如果没有就拉取
    command: ['sh'] #启动容器的运行命令,将覆盖容器中的Entrypoint,对应Dockefile中的ENTRYPOINT  
    args: ["$(str)"] #启动容器的命令参数,对应Dockerfile中CMD参数  
    env: #指定容器中的环境变量  
    - name: str #变量的名字  
      value: "/etc/run.sh" #变量的值  
    resources: #资源管理,请求请见http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行  
        cpu: 0.1 #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
        memory: 32Mi #内存使用量  
      limits: #资源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器开发对外的端口
      name: httpd  #名称
      protocol: TCP  
    livenessProbe: #pod内容器健康检查的设置,详情请见http://blog.csdn.net/liyingke112/article/details/77531584
      httpGet: #通过httpget检查健康,返回200-399之间,则认为容器正常  
        path: / #URI地址  
        port: 80  
        #host: 127.0.0.1 #主机地址  
        scheme: HTTP  
      initialDelaySeconds: 180 #表明第一次检测在容器启动后多长时间后开始  
      timeoutSeconds: 5 #检测的超时时间  
      periodSeconds: 15  #检查间隔时间  
      #也可以用这种方法  
      #exec: 执行命令的方法进行监测,如果其退出码不为0,则认为容器正常  
      #  command:  
      #    - cat  
      #    - /tmp/health  
      #也可以用这种方法  
      #tcpSocket: //通过tcpSocket检查健康   
      #  port: number   
    lifecycle: #生命周期管理  
      postStart: #容器运行之前运行的任务  
        exec:  
          command:  
            - 'sh'  
            - 'yum upgrade -y'  
      preStop:#容器关闭之前运行的任务  
        exec:  
          command: ['service httpd stop']  
    volumeMounts:  #详情请见http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #挂载设备的名字,与volumes[*].name 需要对应    
      mountPath: /data #挂载到容器的某个路径下  
      readOnly: True  
  volumes: #定义一组挂载设备  
  - name: volume #定义一个挂载设备的名字  
    #meptyDir: {}  
    hostPath:  
      path: /opt #挂载设备类型为hostPath,路径为宿主机下的/opt,这里设备类型支持很多种

 上面描述文件中对于各个属性的含义介绍也比较清楚了。不过,我也还要从我的角度再解释一些,以下均是我踩过的坑,以及对学习过程中不理解的地方的一些解释。

apiVersion、kind、metadata.name 这几个属性在上一节已经介绍过了,就不再过多阐述了。

Label

metadata,之前也说过,这个属性它只是用来标识 API 对象的,并不影响 pod 的正常运行。

但是也要简要了解一些它的含义和使用场景。

matedata.label 是一对 KV 键值对,对 k8s 本身而言没有直接意义的。但是用户可以通过 Label 来查询或者组织自己的服务。(之后 selector 标签选择器的时候,会用到用户自定义的 Label)

每个对象可以拥有多个 Label,但 key 值必须是唯一的。 且 key 最多63个字符,开始和结束的字符必须是字母或者数字,中间是字母数字和 _ 、- 、. 。

value 值长度不超过 63 个字符,可以为空,首位字符必须为字母数字字符,中间必须是横线、_、.、数字、字母。

 标签除了在 yaml 描述文件中可以预定义以外,在 pod 运行过程中也可以为其添加 Label,具体的命令如下:

// 为 pod 添加 Label
kubectl label pod <pod-name> <label-key>=<label-value>
// 为 pod 删除 Label
kubectl label pod <pod-name> <label-key>-
// 修改 pod 的 Label,需要加上 --overwrite 参数
kubectl label pod <pod-name> <label-key>=<label-value> --overwrite

Annotation

metadata.annotation  注解的意思,和 Label 的性质有点类似,都是用来标识 API 对象的。Label 是可以通过 selector 这个标签选择器来查筛选的;Annotation 则是方便于外部工具进行查找。

例如就可以使用注解来控制是否自动向该 pod 中注入 sidecar (sidecar 辅助容器,之后也会介绍到)。

spec

再接下来就是 spec 中的内容了,很多很杂也很有意思,第一次的话,大概了解一下就可,之后有用到的时候在仔细研究用法。

spec 中重点有四块内容,restartPolicy、nodeselector、container、volume

restartPolicy 是当 pod 在遇到故障之后的重启策略,有如下策略:

  1. always:当容器退出时,总是重启容器,默认策略
  2. onfailure:当容器异常退出(退出 status 非0)时,重启容器
  3. nerver:当容器退出时,从不重启容器

restartPolicy 默认情况下是不填的,使用默认策略就行。只有某些特殊情况下才会去修改策略,例如测试的时候,需要知道 crash 的原因,等等。

nodeSelector 是节点选择器,在上面说过可以为 pod 添加 Label,其中不仅 pod 可以添加 Label,节点 node 也可以添加 Label,添加的命令非常类似。

nodeSelector 是通过节点(node)的 Label,来指定当前的 pod 在哪个 node 上运行。 如果不指定,k8s 调度器会随机的将该 pod 在任意的一个 node 上运行。例如,上面的那个 pod 的描述文件,指定了该 pod 只能运行在带了 "zone: node1" 标签的节点上;如果节点的 Label 上都没带这个 zone: node1" 标签,该 pod 将调度失败。

调度 pod:就是选择一个节点来运行这个 pod;

调度失败的意思就是,这个 pod 很“挑食”,看不上这些节点,不想在这些节点上运行,最终的结果:该 pod 运行不起来。

container 是必须要填写的,也是很重要的,且很杂的,下一篇重点介绍一下吧。

container 中的核心就两个,pod 中容器的名字(name),和容器的镜像地址(image)

有了这两个属性,pod 就可以启动了。

还有一个是 Volume 卷,卷的种类有很多,之后也会介绍到,现在介绍这个,就只是简单的提一些,pod 中就是 通过 Volume 来将本地磁盘或其他地方的磁盘挂载到 pod 中的。

spec 中还有一些其他有意思的属性,例如 HostAliases   

HostAliases:定义了 Pod 中 hosts (/etc/hosts)文件内容,用法如下:

apiVersion: v1
kind: Pod
...
spec:
  hostAliases:
  - ip: "10.111.133.43"
    hostnames:
    - "asa.top"
    - "asa.com"
...

在 k8s 项目中,如果要设置 hosts 文件里的内容,一定要通过这种方法。否则,如果直接修改了 hosts 文件的话,在 pod 被删除重建之后,kubelet 会自动覆盖掉被修改的内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值