写在前面的话

前面我们提到过,纯手敲 K8S 名称管理 K8S 服务只是作为我们了解 K8S 的一种方案,而我们最终管理 K8S 的方法还是通过接下来的资源清单的方式进行管理。

所以从本章节开始,将会迎来 K8S 的重中之重,我们能否说我们会 K8S 就看就看接下来的学习。

另外,在 K8S 中,我们需要树立一个这样的概念,几乎能用到的东西都可以把它称作资源,而这个定义了规则的 yaml 文件就是资源清单。

资源清单格式

资源清单格式:

apiVersion: group/apiversion  # 如果没给定 group 名称,默认 core,可使用 kubectl api-versions 查看当前所有
kind: # 资源类别
metadata: # 资源元素据
name
namespace # K8S 自身的 namespace
labels # 标签,键值对
annotations # 资源注解
spec: # 期望的状态(最重要)
status: # 当前状态,用户不用定义

查看支持的 apiVersion:

获取资源清单一级字段:

kubectl explain pod

结果如图:

获取资源清单二级字段:

kubectl explain pod.metadata

结果如图:

同理,查看三级字段继续使用 . 加关键字就行了。

创建第一个 Pod 资源清单

创建一个简单的 Pod 资源清单:

vim pod-demo.yaml

内容如下:

apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: pod-demo
tier: frontend
spec:
containers:
- name: app-container
image: ikubernetes/myapp:v1
- name: busy-container
image: busybox:latest
command: ["/bin/sh", "-c", "sleep 3600"]

简单说明:在我们 explain 查看某个关键字下面的关键字的时候,如果关键字的值类型是:<[]Object>,则代表是列表对象,需要使用 -,如果是:<map[string]string>,则是键值对,不需要 -

在上面的 yaml 中,containers 就是列表对象,而 labels 就是键值对。

我们可以定义多个容器组成一个 Pod,之前我们说过 Pod 由一个或者多个容器组成,同时我们也可以使用 command 指令来修改 Pod 中容器的初始运行命令。可以以列表的形式,也可以是 yaml 格式。我这里为例阅读性,选用的是列表的形式。

根据文件创建 Pod:

# 创建
kubectl create -f pod-demo.yaml # 查看
kubectl get pods -o wide # 查看详情
kubectl describe pod pod-demo

结果如图:

我们可以在 describe 中看到我们在 yaml 中定义的所有信息。甚至更多的包括系统给我们补全的一些默认信息。

此时我们可以内部访问一下我们这个 Pod:

同时,资源清单 yaml 文件还给我们提供了一个方便之处在于,我们删除变得更为简单:

kubectl delete -f pod-demo.yaml

结果如图:可能会出现稍微卡一下

标签选择

我们在这里补充一个知识点,在上面我们定义的资源清单中,在 metadata 中提到了 labels 标签选项,那么对于这个标签我们应该如何利用:

# 查看 pod 的标签
kubectl get pods --show-labels

结果如图:

标签筛选:在判断关系的时候,标签的关系可以是 =,!=,in,notin

# 显示指定标签的值
kubectl get pods -L app # 显示包含指定标签的 pod
kubectl get pods -l app --show-labels # 显示指定标签为指定值的 pod
kubectl get pods -l app=pod-demo,tier=frontend --show-labels # 关系筛选
kubectl get pods -l "app in (pod-demo,pod-test,pod-dev)"

结果如图:

给 Pod 打标签或者修改标签:

# 给 pod 打标签
kubectl label pods pod-demo tag=v1.0 # 修改 pod 标签
kubectl label pods pod-demo tag=v2.0 --overwrite

查看结果:

给节点打标签:

kubectl label nodes node2 serverType=app

查看同理。

pod.spec 字段

对于 yaml 资源清单,我们需要知道的是,其主要配置都在 spec 字段中。我们这里就针对 Pod 资源的 spec 里面常用的方法做个说明:

pod.spec
containers     容器相关配置
  name   容器名称
  image   容器镜像
  imagePullPolicy   容器获取策略,Always / Never / IfNotPresent,镜像版本是 latest 默认 Always
  ports   说明端口。并非暴露端口
    name 给这个端口命名,后面可以根据这个名字调用这个端口
    containerPort 说明具体端口。并非暴露端口
    protocol 协议,UDP / TCP / SCTP,默认 TCP
    hostIP 绑定端口,意义不大,一般默认 0.0.0.0
  command   运行指定命令,替代 docker 中默认定义的
  args   参数,如果有配置,docker 中默认的参数将被改配置取代
  livenessProbe   存活性检测
    exec command <[]string>,通过命令来直接探测
    httpGet HTTP 探测,host 主机一般不配置,port 请求端口,path
    tcpSocket tcp 检测
    failureThreshold 探测失败次数,默认 3 次
    periodSeconds 每次间隔时间,默认 10 秒
    timeoutSeconds 超时时间,默认 1 秒
    initialDelaySeconds 容器启动后多久开始探测
  readinessProbe   就绪性检测
  lifecycle   生命周期
    postStart 启动前,方法和 livenessProbe 类似
    preStop 启动后,方法和 livenessProbe 类似
nodeSelector     节点标签选择器,可以限定 Pod 运行的节点
nodeName     直接指定运行节点
restartPolicy     重启策略,Always / OnFailure / Never,默认 Always

资源清单示例

在这之前我们先给一个节点打标签:

kubectl label nodes node2 serverType=app-server --overwrite

【1】普通的较为完整的资源清单:

apiVersion: v1
kind: Pod
metadata:
name: pod-normal-demo
namespace: default
labels:
app: erp
tier: frontend
release: stable
annotations:
ezops.cn/create-by: "Dylan"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
- name: busybox-demo
image: busybox:latest
imagePullPolicy: Always
command: ["/bin/sh", "-c", "sleep 3600"]
#args: ["-f", "-h /tmp"]
nodeSelector:
serverType: app-server
restartPolicy: Never

我们这里修改了容器内部运行的默认命令。并通过标签选择器选择了指定节点。配置了重启规则。

kubectl create -f pod-normal-demo.yaml

查看创建结果:

可以看到已经成功在我们选择的 Node 2 节点上面运行起来,查看详情:(由于内容太多,我直接贴处理

Name:               pod-normal-demo
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: node2/192.168.100.102
Start Time: Wed, 29 May 2019 09:56:11 +0800
Labels: app=erp
release=stable
tier=
frontend
Annotations: ezops.cn/create-by: Dylan
Status: Running
IP: 10.1.1.14
Containers:
myapp:
Container ID: docker://e4e97361c6cc533a4533080f06f7b596e0bc0caa954f7f2ef503d6d9a2aae631
Image: ikubernetes/myapp:v1
Image ID: docker-pullable://ikubernetes/myapp@sha256:9c3dc30b5219788b2b8a4b065f548b922a34479577befb54b03330999d30d513
Ports: 80/TCP, 443/TCP
Host Ports: 0/TCP, 0/TCP
State: Running
Started: Wed, 29 May 2019 09:56:12 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jr9rz (ro)
busybox-demo:
Container ID: docker://0cce3f9dcc16b40aabcceb94c44be49e3434bff28dfc6800c7769cd8d1d5948f
Image: busybox:latest
Image ID: docker-pullable://busybox@sha256:4b6ad3a68d34da29bf7c8ccb5d355ba8b4babcad1f99798204e7abb43e54ee3d
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3600

State: Running
Started: Wed, 29 May 2019 09:56:14 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-jr9rz (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-jr9rz:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-jr9rz
Optional: false
QoS Class: BestEffort
Node-Selectors: serverType=app-server
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 18m default-scheduler Successfully assigned default/pod-normal-demo to node2
Normal Pulled 18m kubelet, node2 Container image "ikubernetes/myapp:v1" already present on machine
Normal Created 18m kubelet, node2 Created container myapp
Normal Started 18m kubelet, node2 Started container myapp
Normal Pulling 18m kubelet, node2 Pulling image "busybox:latest"
Normal Pulled 18m kubelet, node2 Successfully pulled image "busybox:latest"
Normal Created 18m kubelet, node2 Created container busybox-demo
Normal Started 18m kubelet, node2 Started container busybox-demo

其中红色部分就是这次我们特别定义的一些规则。

【2】存活性检测资源清单:

apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
namespace: default
labels:
app: erp
tier: frontend
release: stable
annotations:
ezops.cn/create-by: "Dylan"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 10
periodSeconds: 3
restartPolicy: Always

我们这里有两个知识点:

1. ports 里面定义的 name 我们在后面是可以引用的,如 httpGet 的 port 我们就直接些上面定义的 http。

2. livenessProbe 的应用,再配合 restartPolicy 完成程序自检和维护。

如果用 exec 命令样式,可以用来检测文件是否存在,如:

livenessProbe:
exec:
command: ["/bin/test" "-e /tmp/1.txt"]

另外,就绪性检测和存活性检测类似。

【3】生命周期 poststart:

apiVersion: v1
kind: Pod
metadata:
name: poststart-demo
namespace: default
labels:
app: erp
annotations:
ezops.cn/create-by: "Dylan"
spec:
containers:
- name: httpd-server
image: busybox:latest
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["mkdir", "-p"," /data/web/html"]
command: ["/bin/sh","-c","sleep 3600"]

小结

本章节初步使用了资源清单,这些关键不要求死记硬背,但是一定得知道个大概,基础得框架我们得记住。至于其他详细得则可以通过 explain 查询。

另外我们之前提了自主式 Pod,我们这里建立的都是自主式 Pod,没有上级管理,因为着删除了这个 Pod 不会自动重建。

【04】Kubernets:资源清单(pod)的更多相关文章

  1. 04 . kubernetes资源清单YAML入门

    YAML 通过k8s操作yaml配置文件在node上创建资源,yaml配置文件就像船垛,用来操控docker这艘大船 yam是专门用来写配置文件的语言,非常简洁和强大.而实际上使用yaml配置文件创建 ...

  2. k8s学习笔记之五:Pod资源清单spec字段常用字段及含义

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

  3. 【07】Kubernets:资源清单(控制器 - DaemonSet)

    写在前面的话 前面讲解了 Pod / ReplicaSet / Deployment 的资源清单,我们这里谈一下 DaemonSet 的资源清单. 之前说过,DaemonSet 控制器能够保证资源在每 ...

  4. 【06】Kubernets:资源清单(控制器 - Deployment)

    写在前面的话 上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器. 但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学 ...

  5. 【05】Kubernets:资源清单(控制器 - ReplicaSet)

    写在前面的话 从上一章节开始,我们一直在学习关于自主式 Pod 的资源清单编写, 但是自主式 Pod 存在着一个问题,就是和我们直接 docker run 运行 docker 容器一样.如果我们想以集 ...

  6. kubernetes资源清单之pod

    什么是pod? Pod是一组一个或多个容器(例如Docker容器),具有共享的存储/网络,以及有关如何运行这些容器的规范. Pod的内容始终位于同一地点,并在同一时间安排,并在共享上下文中运行. Po ...

  7. Kubernetes中资源清单与Pod的生命周期(二)

    一.资源清单 1,定义: 在k8s中一般使用yaml格式的文件来创建符合我们预期的资源,这样的yaml被称为资源清单. 使用资源清单创建Pod: kubectl apply -f nginx.yaml ...

  8. kubernetes系列06—kubernetes资源清单定义入门

    本文收录在容器技术学习系列文章总目录 1.认识kubernetes资源 1.1 常用资源/对象 workload工作负载型资源:pod,ReplicaSet,Deployment,StatefulSe ...

  9. Kubenetes 资源清单定义入门

    Kubernetes 常用资源 资源  对象 工作负载型资源对象(workload): Pod  Replicaset  ReplicationController  Deployments Stat ...

随机推荐

  1. 在 React 项目中引入 GG-Editor 编辑可视化流程

    蚂蚁金服数据可视化团队曾经开源了一款G6-Editor,但后来停止了对外支持,学习成本太高 好在后来他们团队的大牛高力结合 React + G6 开源了一个 GG-Editor(其实就是G6-Edit ...

  2. RVZicsr指令集

    Riscv中每个硬件线程(hart)有4096个独立地址空间的状态寄存器.我们可以通过Zicsr指令读写csr寄存器.总共有6条csr读写指令,这些指令之前都在RV32I/RV64I基础指令集里面,在 ...

  3. UILabel的各种属性和方法

    转自:http://liulu200888an.blog.163.com/blog/static/3498972320121214208542/ UILabel  *label1 = [[UILabe ...

  4. Arduino leonardo+esp8266-01作服务端与APP进行数据通信

    esp8266-01调试 一.硬件设备 1.USB转TTL 2.esp8266-01 3.杜邦线 4.电脑 二.接线 ESP8266 TTL-USB VCC VCC(最好选择3.3V) CH_PD V ...

  5. PHP开发之--安装composer

    composer是一个很好用的工具,类似于iOS开发项目中所用的cocopods,所以就想着安装下,过程也很简单: 1.切换到如下目录(在很多博客中都是这样写的,先安装,然后mv到/usr/local ...

  6. jQuery中$符号的作用

    jQuery中$符号的作用 1.查找作为jQuery包装器,利用选择器来选择DOM元素(这个也是最强大的功能) 例如:$("table tr:nth-child(even)") 基 ...

  7. Mysql时区无法识别

    Unable to connect to database. Tried 1 times {:error_message=>“Java::JavaSql::SQLException: The s ...

  8. JDBC学习笔记二

    JDBC学习笔记二 4.execute()方法执行SQL语句 execute几乎可以执行任何SQL语句,当execute执行过SQL语句之后会返回一个布尔类型的值,代表是否返回了ResultSet对象 ...

  9. (十)OpenStack---M版---双节点搭建---Heat安装和配置

    ↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 本章节仅在Controller节点执行 1.Controller节点执行安装和配置 2.验证操作 ...

  10. C++随机马赛克图程序

    效果: 或者灰度,cell大小可调 代码: #include <opencv2\opencv.hpp> #include <Windows.h> struct paramete ...