• K8S 资源编排文件简介


    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
    
    ---
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26



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



    2.0 字段大纲
    Parameter NameDescription
    apiVersionapi 版本
    kind资源类型
    metadata资源元数据
    spec资源规格
    replicas副本数量
    selector标签选择器
    templatePod模板
    containers容器配置



    2.1 必须存在的属性
    Parameter NameTypeDescription
    versionStringK8S API的版本, 目前基本上是v1, 可以用kubectl api-version来查看
    kindString种类, 这里是值 yaml文件定义的资源类型和角色, 比如: pod
    可用kubectl api-resources 查看所欲kind类型
    metadataObject元数据对象
    metadata.nameString元数据对象的名字, 这里由我们编写, 例如命名pod的名字
    metadata.namespaceString元数据对象所属的命名空间
    specObject详细定义对象
    spec.container[]list定义对象的容器列表, 是个列表
    spec.container[].nameString定义某个容器的名字



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



    2.3 额外的参数
    Parameter NameTypeDescription
    spec.restartPolicyString定义Pod的重启策略
    1. Always: Pod 一旦终止运行,Kubelet就会重启它
    2. OnFailure: 只有POD 以非0代码退出时,Kubelet 才会尝试重启
    3. Never 无论POD是如何终止运行, 都不会被尝试重启
    spec.nodeSelectorObject定义Node的Label过滤标签, 以key:value 格式指定
    spec.imagePullSecretsObject定义pull 镜像是用secret的名称, 以name: secretkey格式指定
    spec.hostNetworkboolean是否使用主机网络模式, 默认是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
    
    • 1
    • 2

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

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

    在这里插入图片描述
    然后我们可以基于这个生成的模板再修改



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

    先用

    kubectl get deploy
    
    • 1

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

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

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

    然后我们用

    kubectl get deploy podname -o yaml > podname.yaml
    
    • 1

    命令来得到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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
  • 相关阅读:
    什么是邮件签名证书?
    实时即未来,大数据项目车联网之创建Flink实时计算子工程【二】
    Web学习笔记-CSS
    ID保持的人像生成
    spark SQL 任务参数调优1
    STM32MP157_TF-A源码编译报错
    SM59/SE01/TR 请求号检查工具,不用传到正式区,开发环境即可
    开源许可证GPL、BSD、MIT、Mozilla、Apache和LGPL的区别
    功能测试:核心原理、挑战以及解决之道
    java 枚举
  • 原文地址:https://blog.csdn.net/nvd11/article/details/127524844