08. Kubernetes - 资源清单

资源清单

在使用 docker 部署容器的时候,使用 docker run 进行容器的运行,但是对于复杂的需求,如果还是使用 docker run,就会变得极其复杂和难以管理。于是便有了 docker compose。

在 kubernetes 中也会存在类似 docker run 一样的命令用于运行我们的应用。

但 Kubernetes 中应用一般配置参数都会更多,使用也会更为复杂,所以为了降低管理成本。引入了资源清单,通过配置资源清单实现类似 docker-compose 一样的管理方式。

资源清单支持两种格式:YAMLJSON

对于 Kubernetes 而言,JSON 格式能够更好的被识别。而对于 Kubernetes 用户而言,YAML 才具备更好的阅读性。

用户可以通过定义好的资源清单直接部署发布应用:

kubectl create -f xxx.yaml
# 或者
kubectl apply -f xxx.yaml

整个操作流程大致如下:

  1. kubectl 将资源清单提交给了 apiserver,apiserver 解析资源清单,将重要的信息存入到 etcd 数据库中。
  2. scheduler 监测到有新的创建需求,通过资源清单的配置,将它调度到一个最合适的节点上,然后把这个节点和 Pod 绑定到一起,写回到 etcd。
  3. 节点上的 kubelet 监测到有一个 Pod 被分配过来了,就去获取它的配置信息来把容器创建出来,再将 Pod 状态再写回到 etcd。

资源清单示例

创建一个 nginx 的 Deployment 资源清单 nginx-deployment.yaml :

# API 版本
apiVersion: apps/v1
# API 对象类型
kind: Deployment
# 元数据
metadata:
  # 名称,必须
  name: nginx-deploy
  # 标签,用户自定义,便于使用过程中通过标签对 pod 进行筛选
  labels:
    chapter: first-app
# 规范
spec:
  selector:
    matchLabels:
      app: nginx
  # 设置副本数
  replicas: 2
  # 模板
  template:
    metadata:
      labels:
        app: nginx
    # 规范
    spec:
      # 容器
      containers:
          # 容器名称
        - name: nginx
          # 镜像名称
          image: nginx:1.7.9
          # 端口
          ports:
            - containerPort: 80

通过 kubectl 创建应用:

kubectl create -f nginx-deployment.yaml
# 或者,推荐使用 apply,它还有更新的功能
kubectl apply -f nginx-deployment.yaml

如图所示:

image

可以发现:

  1. 资源清单中必须要有的配置包含:元数据(metadata),规范(spec),状态(status),但是 status 由创建应用后自动生成。

  2. 在没指定名称空间的情况下创建出来的 Pod 默认属于 Kubernets 的 default 名称空间。

  3. 通过修改资源清单副本数量就可以轻易的实现应用的扩缩容。


查看创建的 API 对象:

# 查看所有的 Deployment 对象
kubectl get deployment -o wide

# 查看所有的标签为 app: nginx 的 Pods
kubectl get pods -l app=nginx

# 查看创建 Pod 的详细信息
kubectl describe pod nginx-deploy-7759cfdc55-d5dw5

通过 describe 可以具体了解到 Pod 的详细信息,比如调度到的节点、状态、IP 等。一般我们比较关系 Events,Pod 的启动日志就在这里。


如果直接删除 Pod 是没法删除 deployment 的,Kuberntes 会根据资源清单继续创建 Pod,可以使用如下命令删除 deployment:

kubectl delete deployment nginx-deploy
# 或者
kubectl delete -f nginx-deployment.yaml

YAML

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。YAML 的设计目标就是方便人类读写。它实质上是一种通用的数据串行化格式。

基本语法规则如下:

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进时不允许使用 Tab 键,只允许使用空格
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略

还需要了解两种结构类型:

  • Lists(列表)
  • Maps(字典)

列表示例

# 基本格式
sports:
  - football
  - basketball

# 对象列表
sports:
  - name: football
    person: 11
  - name: basketball
    person: 5

# 其它写法
sports: ["football", "basketball"]

字典示例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy

这两种类型都是能够互相嵌套的。

编写资源清单

知道了 YAML 的使用方法,但是如何编写符合 Kubernetes API 对象的资源清单是个问题,不可能全靠死记硬背吧。

同时,Kubernetes 更新也很快,说不定某些参数在下个版本就没用了。

这里推荐两种参考方式:

  1. 查看官方的 API 文档:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.25/

通过左边的对应的 API 对象,查看创建该对象的资源清单所支持的参数。


  1. 通过 kubelet explain 查看,比如查看 deployment 的资源清单参数:
kubectl explain deployment

如果参数是 Object,<[]Object>,说明还有下级,可以继续往下查看:

kubectl explain deployment.spec

如果参数有 -required- 标识,说明该参数是必选项。

更多具体的编写使用方法在后面使用中会逐渐熟悉。

posted @ 2022-10-17 20:22  不知名换皮工程师  阅读(56)  评论(0编辑  收藏  举报