K8S 资源编排文件简介

时间:2022-11-05 16:52:33

k8s安装完后, kubectl这个工具可以很方便地让我们操作k8s。。

但其实一旦用于大规模部署, kubectl 就不那么方便了. 这时我们需要用资源编排文件(Resource Orchestration)来实现组合和批量操作。

在k8s 中, 一般使用yaml格式的资源编排文件来创建我们预期期望的pod



1. 资源编排文件 部分

一般情况下, 我们可以把资源编排文件划分为

  1. 控制器定义
  2. 被控制对象

例子:


---
### 控制器定义
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matcheLables:
      app: nginx

### 被控制对象
template:
  metadata:
    lables:
      app: ngnix
  spec:
    contianers:
      - name: nginx:
        images: nginx: latest
        ports: 8010

---



2. 资源编排文件 常用字段



2.0 字段大纲

Parameter Name Description
apiVersion api 版本
kind 资源类型
metadata 资源元数据
spec 资源规格
replicas 副本数量
selector 标签选择器
template Pod模板
containers 容器配置



2.1 必须存在的属性

Parameter Name Type Description
version String K8S API的版本, 目前基本上是v1, 可以用kubectl api-version来查看
kind String 种类, 这里是值 yaml文件定义的资源类型和角色, 比如: pod
可用kubectl api-resources 查看所欲kind类型
metadata Object 元数据对象
metadata.name String 元数据对象的名字, 这里由我们编写, 例如命名pod的名字
metadata.namespace String 元数据对象所属的命名空间
spec Object 详细定义对象
spec.container[] list 定义对象的容器列表, 是个列表
spec.container[].name String 定义某个容器的名字



2.2 spec 主要对象

Parameter Name Type Description
spec.container[].image String 定义某个容器的所用镜像名称
spec.container[].imagePullPolicy String 定义拉取镜像的策略.
1.Always: 每次都尝试从远程仓库拉取。
2. Never: 表示只从本地拉取镜像。
3. ifNotPresent: 如果本地有该镜像就本地拉取镜像, 否则从远程拉取镜像.
默认是Always
spec.container[].command[] List 指定容器的启动命令,可以有多个,不指定则使用镜像打包时指定的命令
spec.container[].args[] List 指定容器的启动命令参数, 可以有多个
spec.container[].workingDir String 指定容器的工作目录
spec.container[].VolumnMounts[] List 指定容器的存储卷配置
spec.container[].VolumnMounts[].name String 指定容器的某个存储卷名称
spec.container[].VolumnMounts[].mountPath String 指定容器的某个存储卷挂载路径
spec.container[].VolumnMounts[].readOnly String 指定容器的某个存储卷是否是只读, true of false, 默认是true(只读)
spec.container[].ports[] List 指定容器要用到的端口列表
spec.container[].ports[].name string 指定容器要端口名字,端口还有名字?
spec.container[].ports[].containerPort string 指定容器用到的端口要监听的容器内部端口(mapping)
spec.container[].ports[].hostPort string 指定容器用到的端口要鉴听的所在主机部端口(mapping),默认与前者相同
spec.container[].ports[].protocol string 指定端口协议, 支持TCP和UDP, 默认TCP
spec.container[].env[] List 制定环境变量列表
spec.container[].env[].name string 指定环境变量名称
spec.container[].env[].value string 指定环境变量的值
spec.container[].resource Object 指定资源限制和资源请求的值
spec.container[].resource.limits Object 指定容器运行时资源运行上限
spec.container[].resource.cpu Integer 指定容器运行时能用到的cpu核心个数
spec.container[].resource.memory String 指定容器运行时能用到的内存大小, 单位为MB GB
spec.container[].resource.cpu Integer 指定容器运行时能用到的cpu核心个数
spec.container[].resource.requests Object 指定容器启动和调度室的限制设置
spec.container[].resource.requests.cpu Integer 容器启动初始化时能用到的cpu core个数
spec.container[].resource.requests.memory Integer 容器启动初始化时能用到的大小



2.3 额外的参数

Parameter Name Type Description
spec.restartPolicy String 定义Pod的重启策略
1. Always: Pod 一旦终止运行,Kubelet就会重启它
2. OnFailure: 只有POD 以非0代码退出时,Kubelet 才会尝试重启
3. Never 无论POD是如何终止运行, 都不会被尝试重启
spec.nodeSelector Object 定义Node的Label过滤标签, 以key:value 格式指定
spec.imagePullSecrets Object 定义pull 镜像是用secret的名称, 以name: secretkey格式指定
spec.hostNetwork boolean 是否使用主机网络模式, 默认是false, 设置true表示使用宿主机网络, 不适用docker 网桥, 同时设置了true则无法在同一台宿主机上启动第二个副本



3. 快速编写1个yaml文件

如果从零开始手撕1个yaml文件, 相当困难。



3.1 使用 kubectl create 命令生成yaml文件

例子:

# pod1 是资源名字
kubectl create deployment pod1 --image=nginx -o yaml --dry-run > pod1.yaml

一旦加入 -o yaml 参数, 则kubectl create deployment 命令并不会真正执行, 而是生成1个yaml 文件。让我们可以后续基于这个yaml来创建pod

–dry-run 表示kubectl去尝试去执行这个yaml文件, 但执行完 会清空资源
某个版本后, kubectl建议用–dry-run=client 来代替 --dry-run

K8S 资源编排文件简介
然后我们可以基于这个生成的模板再修改



3.2 使用kubectl get 命令从已部署的资源中导出yaml文件

先用

kubectl get deploy

命令查看当前的集群部署了什么东西

gateman@k8smaster:~/yamls$ kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           13d
gateman@k8smaster:~/yamls$ 

可以见到里面已经有了1个nginx的部署

然后我们用

kubectl get deploy podname -o yaml > podname.yaml

命令来得到yaml文件

gateman@k8smaster:~/yamls$ kubectl get deploy nginx -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-10-22T14:03:45Z"
  generation: 1
  labels:
    app: nginx
  name: nginx
  namespace: default
  resourceVersion: "372980"
  uid: b7a0d2f1-a49f-4681-a85c-10dfa9fed809
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2022-10-22T14:03:45Z"
    lastUpdateTime: "2022-10-22T14:04:03Z"
    message: ReplicaSet "nginx-6799fc88d8" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  - lastTransitionTime: "2022-10-25T12:40:15Z"
    lastUpdateTime: "2022-10-25T12:40:15Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1