Pod资源对象

简介

  Pod 是 Kubernetes 系统的基础但是远, 是自愿对象模型中可由用户创建或者部署调度的最小单位。

  Pod 对象是一组容器的集合,这些容器共享 network 、UTS 及 IPC名称空间,具有相同的域名, 主机名, 和网络接口,可通过 IPC 直接进行通信。但分别拥有各自独立的 MNT, USR 和 PID 名称空间。

Pod 的管理

快速生成 yaml 文件

1. kubectl run nginx --image=nginx --dry-run -o yaml

查看帮助

kubectl explain pods.metadata

pod中镜像下载策略

     kubernetes 中支持自定义镜像文件的获取策略,

字段: imagePullPolicy
    值: Always: 总是从指定的仓库中获取镜像.
         IfNotPresent: 仅当地镜像缺失时候方才从目标仓库下载镜像.
         Never: 禁止从仓库下载镜像,即仅适用本地镜像.

  示例:

 1 [root@k8s ~]# cat nginx.yaml 
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   labels:
 6     run: nginx
 7   name: nginx
 8 spec:
 9   containers:
10   - image: nginx
11     imagePullPolicy: IfNotPresent
12     name: nginx
13   restartPolicy: Always
实例

pod中容器的运行命令

  修改默认运行的命令,即修改指定容器运行时的命令.

方法1:
    command: ['sh','-c','echo OK! && sleep 60']

方法2: 
	command:
	- sh
	- -c 
	- echo OK! && sleep 60

方法3:
	args:
	-sh 
	- -c 
	- echo OK! && sleep 60

方法4:
	command: ['/bin/sh']
	args: ['-c','echo OK! && sleep 60']

实例:

 1 [root@k8s ~]# cat busybox.yaml 
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   labels:
 6     run: busybox
 7   name: busybox
 8 spec:
 9   containers:
10   - image: busybox
11     imagePullPolicy: IfNotPresent
12     name: busybox
13     command: ['sh','-c','echo OK! && sleep 60']
14   restartPolicy: Always
实例

pod中使用变量

方法:
env:
- name: key1
  value: value1 
- name: key2
  value: value2

说明:
	name: 环境变量名称即key
	value: 传递给环境变量的值, 通过 $(VAR_NAME)引用,逃逸格式为$$(VAR_NAME) 默认值为空

实例:

 1 [root@k8s ~]# cat busybox.yaml 
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   labels:
 6     run: busybox
 7   name: busybox
 8 spec:
 9   containers:
10   - image: busybox
11     imagePullPolicy: IfNotPresent
12     name: busybox
13     command: ['sh','-c','echo OK! && sleep 60']
14     env:
15     - name: devops
16       value: kubernetes
17   restartPolicy: Always
实例

pod重启策略

    定义 pod 生命周期和异常退出时的重启策略.

字段:
restartPolicy: Never	
值: 
    Always: 总是重启
    OnFailure: 失败了才会重启
    Never: 从不重启  

实例:

 1 [root@k8s ~]# cat busybox.yaml 
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   labels:
 6     run: busybox
 7   name: busybox
 8 spec:
 9   containers:
10   - image: busybox
11     imagePullPolicy: IfNotPresent
12     name: busybox
13     command: ['shs','-c','echo OK! && sleep 60']     # 故意写错
14     env:
15     - name: devops
16       value: kubernetes
17   restartPolicy: OnFailure
实例

初始化容器

    初始化容器主要为运行的容器做一些初始化的工作提前准备工作. 比如一个容器 A 依赖其他容器运行,可以为 A 设置多个依赖容器,比如 A1 A2. A1,A2的初始化容器会按照顺序启动,如果A1没有启动成功,A2则也不会启动,只有所有的初始化容器运行完毕后,容器A 才会运行.

关键字:
initContainers:
''   下面定义一个个初始化的容器 ''
  - name: init-poda
    image: busybox
    command: ['sh','-c','touch /work-dir/aa.txt']
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"

实例:

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: myapp-initpod
 5   labels:
 6     app: myapp
 7 spec:
 8   volumes:
 9   - name: workdir
10     emptyDir: {}
11   containers:
12   - name: myapp-nginx
13     image: nginx
14     imagePullPolicy: IfNotPresent
15     volumeMounts:
16     - name: workdir
17       mountPath: "/text"
18   initContainers:
19   - name: init-poda
20     image: busybox
21     command: ['sh','-c','touch /work-dir/aa.txt']
22     volumeMounts:
23     - name: workdir
24       mountPath: "/work-dir"
实例

资源调度对象

主机过滤

主机打分
手动指定pod运行位置

标签

kubectl get pods --show-labels
kubectl top pods -l name=cpu-utilizer

kubectl label nodes --all aa/111=abc
kubectl label nodes --all disktype=ssd
kubectl label nodes test1 aa/111=abc
kubectl label nodes test1 aa/111-         取消标签  
 
手动指定pod 运行在指定的标签(node)上
 
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx-selector
  name: nginx-selector
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - image: nginx
    name: nginx-selector
    resources: {}
    imagePullPolicy: IfNotPresent
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

cordon

    设置 cordon 状态的 node ,新创建的 pod 请求不会调度到此node 上, 但是现有运行中的 pod 不会受到影响.
设置cordon状态: kubectl cordon node_name    
取消cordon状态: kubectl uncordon node_name     

drain

    设置 drain 状态的 node, 会把此node 标记为不可用.新创建的 pod 不会调度到此node 上, 同时会把此node 上运行的pod迁移走. 普通pod 没有此特性, deployment 等控制器有此特性.
设置 drain状态: kubectl drain node_name 
取消 drain状态: kubectl uncordon node_name 

taint

    设置node 污点,如果node 上有污点 新创建的 pod 不会调度到此node上,但是可以修改 pod 参数使其可以容忍污点.
设置污点: kubectl taint node node_name aaa=123:NoSchedule
取消污点: kubectl taint node node_name aaa-
查看污点: kubectl describe nodes node_name | grep Taints   

# pod 容忍污点配置
tolerations:
- key: "aaa"
  operator: "Equal"
  value: "123"
  effect: "NoSchedule"

  

 
 
 

作者:闫世成

出处:http://cnblogs.com/yanshicheng

联系:yans121@sina.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。如有问题或建议,请联系上述邮箱,非常感谢。
原文地址:https://www.cnblogs.com/yanshicheng/p/13179575.html