• 3.Kubernetes YAML资源编排


    Kubernetes YAML资源编排

    使用YAML用于K8s的定义带来的好处包括:

    • 便捷性:不必添加大量的参数到命令行中执行命令
    • 可维护性:YAML文件可以通过源头控制,跟踪每次操作
    • 灵活性:YAML可以创建比命令行更加复杂的结构

    语法格式

    空格、缩进表示层级关系;不支持tab缩进,开头缩进2个空格

    字符串后缩进1个空格,如冒号、逗号

    字符后缩进1个空格,如冒号、逗号

    “---”表示YAML格式,一个文件的开始

    “#”注释

    在Kubernetes中,两种结构类型:

    • Lists
    • Maps

    YAML Maps

    Map顾名思义指的是字典,即一个Key:Value 的键值对信息。例如

    ---
    apiVersion: v1
    kind: Pod
    

    ---可选的分隔符 ,当需要在一个文件中定义多个结构的时候需要使用。上述内容表示有两个键apiVersion和kind,分别对应的值为v1和Pod。

    YAML Lists

    List即列表,说白了就是数组,例如

    args
     -beijing
     -shanghai
     -shenzhen
     -guangzhou
    

    YAML内容

    在K8S部署一个应用的YAML内容大致分为两部分:

    控制器定义:定义控制器属性

    被控制对象:Pod模板,定义容器属性

    字段意义

    #可以通过explain查看更详细的帮助文档获得
    kubectl explain pods.spec.containers
    
    一级字段 字段含义
    apiVersion API版本
    kind 资源类型
    metadata 资源元数据
    spec 定义目标状态
    status 当前状态

    apiVersion

    这个版本号需要根据安装的Kubernetes版本和资源类型进行变化。

    # 查看kubernetes(1.16)支持api类型
    # kubectl api-versions
    admissionregistration.k8s.io/v1
    admissionregistration.k8s.io/v1beta1
    apiextensions.k8s.io/v1
    apiextensions.k8s.io/v1beta1
    apiregistration.k8s.io/v1
    apiregistration.k8s.io/v1beta1
    apps/v1
    authentication.k8s.io/v1
    authentication.k8s.io/v1beta1
    authorization.k8s.io/v1
    authorization.k8s.io/v1beta1
    autoscaling/v1
    autoscaling/v2beta1
    autoscaling/v2beta2
    batch/v1
    batch/v1beta1
    certificates.k8s.io/v1beta1
    coordination.k8s.io/v1
    coordination.k8s.io/v1beta1
    events.k8s.io/v1beta1
    extensions/v1beta1
    networking.k8s.io/v1
    networking.k8s.io/v1beta1
    node.k8s.io/v1beta1
    policy/v1beta1
    rbac.authorization.k8s.io/v1
    rbac.authorization.k8s.io/v1beta1
    scheduling.k8s.io/v1
    scheduling.k8s.io/v1beta1
    storage.k8s.io/v1
    storage.k8s.io/v1beta1
    v1
    

    kind

    kind:根据实际情况,此处资源类型可以是Pod、Deployment、Job、Ingress、Service等

    #查询可使用kind类型
    kubectl api-resources
    NAME                              SHORTNAMES   APIGROUP                       NAMESPACED KIND
    bindings                                                                      true       Binding
    componentstatuses                 cs                                          false        ComponentStatus
    configmaps                        cm                                          true       ConfigMap
    endpoints                         ep                                          true       Endpoints
    events                            ev                                          true       
    ......
    

    metadata

    包含Pod的一些meta信息,例如

    二级字段 字段含义
    name 资源名称
    namespace 名称空间
    labels 标签
    annotations 注释
    selfLink 资源引用路径(/api/$GROUP/$VERSION/$namespaces/$NAMESPACE/$TYPE/$NAME)

    spec

    由用户定义目标状态、即期望状态,包括一些container,storage,volume以及其他Kubernetes需要的参数,以及诸如是否在容器失败时重新启动容器的属性。可在特定Kubernetes API找到完整的Kubernetes Pod的属性。

    status

    status字段来记录对象在系统上的当前状态,因此status字段仅对活动对象才有意义,用户不能手动定义,由Kubernetes集群维护。与spec不符时,无限向spec定义字段靠近

    编写YAML技巧

    #用run命令生成部署模板
    kubectl create deployment nginx --image=nginx:1.14 -o yaml --dry-run> my-deploy.yaml 
    #用get命令将已有部署的应用yaml导出
    kubectl get my-deploy/nginx -o=yaml --export  > my-deploy.yaml
    

    YAML创建过程

    1、编写

    # vim pod-test.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-number 			#而且这个位置的名字好像不支持大写字母
      namespace: default
      labels:					#这个位置可以使用{key:value,key:value.....}kv之间逗号隔开
        app: myweb				#注意这个位置的名字和下面创建image的时候的名字一致
        tier: Not outside
    spec:
      containers:
      - name: myweb
      image: ikubernetes/myapp:v1
      - name: busybox			#如果有多个容器,还可以多定义几个
      image: busybox:latest 	#因为busybox默认是启动的sh命令,我们可以给shell命令传递些参数。
      command: (["/bin/sh","-c","sleep 20"]) 传递的参数可以使用[]来写,也可以用下面的形式来定义)
      - "/bin/sh"
      - "-c"
      - "sleep 3600"
      
    

    2、创建

    kubectl create -f pod-test.yaml
    kubectl get pods
    NAME         READY   STATUS             RESTARTS   AGE
    pod-web       1/1     Running            0         88s
    pod-number    2/2     Running            0         5m59s
    

    3、查看

    kubectl describe pods pod-number
    

    4、查询日志

    kubectl logs pod-number busybox
    

    5、进入pod操作

    kubectl exec --help  可以使用exec命令来操作命令行格式
    Usage:
      kubectl exec POD [-c CONTAINER] -- COMMAND [args...] [options]
    #注意command前面的--是固定格式
    kubectl exec -it pod-number -c myweb -- /bin/sh 
    / #
    

    6、删除pod

    kubectl delete -f pod-test.yaml
    

    详细示例(Pod):

    apiVersion: v1       			#必选API版本号,例如v1
    kind: Pod       				#必选类型,(Pod、deployment、service)
    metadata:       				#必选元数据类型
      name: string       			#必选,Pod名称
      namespace: string    			#必选,Pod所属的命名空间
      labels:      					#自定义标签
        - name: string     			#自定义标签名字
      annotations:       			#自定义注释列表
        - name: string
    spec:         					#必选,Pod中容器的详细定义
      containers:      				#必选,Pod中容器列表
      - name: string     			#必选,容器名称
        image: string    			#必选,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] 		#获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        command: [string]    		#容器的启动命令列表,如不指定,使用打包时使用的启动命令
        args: [string]     			#容器的启动命令参数列表
        workingDir: string     		#容器的工作目录
        volumeMounts:    			#挂载到容器内部的存储卷配置
        - name: string     			#引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
          mountPath: string    		#存储卷在容器内mount的绝对路径,应少于512字符
          readOnly: boolean    		#是否为只读模式
        ports:       				#需要暴露的端口库号列表
        - name: string     			#端口号名称
          containerPort: int   		#容器需要监听的端口号
          hostPort: int    			#容器所在主机需要监听的端口号,默认与Container相同
          protocol: string     		#端口协议,支持TCP和UDP,默认TCP
        env:       					#容器运行前需设置的环境变量列表
        - name: string     			#环境变量名称
          value: string    			#环境变量的值
        resources:       			#资源限制和请求的设置
          limits:      				#资源限制的设置
            cpu: string    			#Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
            memory: string     		#内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests:      			#资源请求的设置
            cpu: string    			#Cpu请求,容器启动的初始可用数量
            memory: string     		#内存清楚,容器启动的初始可用数量
        livenessProbe:     			#对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          exec:      				#对Pod容器内检查方式设置为exec方式
            command: [string]  		#exec方式需要制定的命令或脚本
          httpGet:       			#对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
            path: string
            port: number
            host: string
            scheme: string
            HttpHeaders:
            - name: string
              value: string
          tcpSocket:     			#对Pod内个容器健康检查方式设置为tcpSocket方式
             port: number
           initialDelaySeconds: 0  	#容器启动完成后首次探测的时间,单位为秒
           timeoutSeconds: 0   		#对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
           periodSeconds: 0    		#对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
           successThreshold: 0
           failureThreshold: 0
           securityContext:
             privileged:false
        restartPolicy: [Always | Never | OnFailure]			#Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        imagePullSecrets:    		#Pull镜像时使用的secret名称,以key:secretkey格式指定
        - name: string
        hostNetwork:false      		#是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
        volumes:       				#在该pod上定义共享存储卷列表
        - name: string     			#共享存储卷名称 (volumes类型有很多种)
          emptyDir: {}     			#类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
          hostPath: string     		#类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
            path: string     		#Pod所在宿主机的目录,将被用于同期中mount的目录
          secret:      				#类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string  
            items:     
            - key: string
              path: string
          configMap:     			#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string
    
  • 相关阅读:
    什么是首字节时间(TTFB)
    什么是函数节流?
    生成不重复的随机数
    js中sort()方法的用法,参数以及排序原理
    return false;和e.preventDefault;和e.stopPropagation的区别
    实现跨域的方法
    jQuery的parent和parents和closest区别
    JS中关于clientWidth offsetWidth scrollWidth 等的区别
    grunt配置sass项目自动编译
    移动H5前端性能优化指南
  • 原文地址:https://www.cnblogs.com/Gmiaomiao/p/12943788.html
Copyright © 2020-2023  润新知