zoukankan      html  css  js  c++  java
  • (K8s学习笔记一)资源类型的使用

    YAML格式的POD定义文件内容详解

    apiVersion: v1            # 版本号
    kind: Pod                 # 资源类型
    metadata:                 # 元数据
      name: string            # Pod的名称
      namespace: string       # Pod所属的命名空间,默认值为default
      labels:                 # 自定义标签列表
        - name: string
      annotations:            # 自定注解列表
        - name: string
    spec:                     # Pod中容器的详细定义
      containers:             # Pod中容器列表
      - name: string          # 容器的名称
        image: string         # 容器的镜像名称
        imagePullPolicy: [Always | Never |IfNotPresent] # 镜像拉取的策略,默认值为Always
        command: [string]     # 容器的启动命令列表,如果不指定,则使用镜像打包时使用的启动命令
        args: [string]        # 容器的启动命令参数列表
        workingDir: string    # 容器的工作目录
        volumeMounts:         # 挂载到容器内部的存储卷配置
        - name: string        # 引用Pod定义的共享存储卷的名称,需使用volumes[]部分定义的共享存储卷名称
          mountPath: string   # 存储卷在容器内mount的绝对路径
          readOnly: boolean   # 是否为只读模式,模式为读写模式
        ports:
        - name: string        # 端口的名称
          containerPort: int  # 容器需要监听的端口号
          hostPort: int       # 容器所在主机需要监听的端口号,默认于containerPort相同,设置hostPort时,同一宿主机将无法启动该容器的第2个副本
          protocol: string    # 端口协议,支持TCP和UDP,默认为TCP
        env:                  # 容器运行前需要设置的环境变量列表
        - name: string        # 环境变量的名称
          value: string       # 环境变量的值
        resources:            # 资源限制和资源请求的设置
          limits:             # 最小使用资源限制的设置
            cpu: string       # 逻辑CPU数,将用于docker run --cpu-shares参数
            memory: string    # 内存限制,单位MiB、GiB等,将用于docker run --memory参数
          requests:           # 最大使用资源限制的设置
            cpu: string       # 逻辑CPU数,容器启动的初始可用数量
            memory: string    # 内存请求,单位MiB、GiB等,容器启动的初始可用数量
        livenessProbe:        # 对pod内各容器健康检查的设置,当探测无响应几次后,系统将自动重启该容器,对一个容器仅需设置一种检查方法
          exec:               # 健康检查为exec方式
            command: [string] # exec方式需指定的命令或脚本
          httpGet:            # 健康检查为httpGet方式,需指定path、port
            path: string
            port: number
            host: string
            scheme: string
            httpHeaders:
            - name: string
              value: string
          tcpSocket:          # 健康检查为tcpSocket方式
            port: number
          initialDelaySeconds: 0   # 容器启动完成后首次探测的时机,单位为s
          timeoutSeconds: 0        # 对容器健康检查的探测等待响应的超时时间,单位为s,默认值1s。若超过该定义值,则认为该容器不健康会重启容器
          periodSeconds: 0         # 对容器健康检查的定期探测时间,单位为s,默认值10s探测一次
          successThreshold: 0
          failureThreshold: 0
        securityContext:
          privileged: false
      restartPolicy: [Always | Never | OnFailure]    # Pod的重启策略
      nodeSelector: object         # 设置node的label,以key:value格式指定,pod将被调度到具有这些label的node上
      imagePullSecrets:            # pull镜像时使用的Secret名称,以name:secretkey格式指定
      - name: string
      hostNetwork: false           # 是否使用主机网络模式,默认值false,设为true表示容器使用宿主机网络,不再使用docker网桥,该pod将无法在同一宿主机上启动第2个副本
      volumes:                     # 在该Pod上定义的共享存储卷列表
      - name: string               # 共享存储卷名称,在一个pod中每个存储卷定义一个名称,容器定义部分的containers.volumeMounts.name将引用该共享存储卷的名称
        emptyDir: {}               # 类型为emptDir的存储卷,其值为一个空对象
        hostPath:                  # 类型为hostPath的存储卷,通过volume.hostPath.path指定挂载路径
          path: string             # Pod所在主机的目录,将被用于容器中的mount的目录
        secret:                    # 类型为secret的存储卷,表示挂载集群预定义的secret对象到容器内部
          secretName: string
          items:
          - key: string
            path: string
        configMap:                 # 类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部
          name: string
          items:
          - key: string
            path: string

    说明:

    spec.containers.imagePullPolicy定义值含义:

    • Always:表示每次都尝试重新拉取镜像
    • IfNotPresent:表示如果本地有该镜像,则使用本地镜像,本地不存在则拉取镜像
    • Never:表示仅使用本地镜像

    spec.restartPolicy定义值含义:

    • Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet都将重启它
    • OnFailure:只有Pod以非零退出码终止时,kubectl才会重启该容器,如果容器正常结束(退出码为0),则kubelet将不会重启它
    • Never:Pod终止后,kubelet将退出码报告给Master,不会再重启该Pod

    1.POD类型和资源配额

    # vi mariadb-pod.yaml
    apiVersion: v1
    kind: pod
    metadata:
      name: mariadb10.5
      labels:
        name: mysql
    spec:
      containers:
      - name: mariadb10.5
        image: mariadb:10.5.4
        resources:
          memory: "64Mi"               # 最少使用64MB内存
          cpu: "250m"                  # 最小使用0.25个CPU
        limits:
          memory: "1Gi"                # 最多使用1GB内存
          cpu: "1000m"                 # 最多使用1个逻辑CPU(CPU逻辑数=物理CPU个数x每颗CPU核数x超线程数,cat /proc/cpuinfo | grep “processor” | wc -l)
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
    
    查看POD信息
    # kubectl get pods

    2.ReplicaSet类型

    # vi mysql-rs.yaml
    apiVersion: extensions/v1beta1
      kind: ReplicaSet             # 副本控制器RS
      metadata:
        name: mysql5.7             # RS名称全局唯一
      spec:
        replicas: 2                # pod副本期待数量
        selector:
          app: mysql               # 符合目标的pod拥有此标签
        template:                  # 根据此模版创建pod的副本   
          metadata:
            labels:
              app: mysql           # pod副本拥有的标签,对应spec.selector名称要相同
          spec:
            containers:            # pod内容器的定义部分
            - name: mysql5.7       # 容器的名称
              image: mysql:5.7.29  # 容器对应的docker image
              ports:
              - containerPort: 3306  # 容器应用监听的端口号
              env:                   # 注入容器内的环境变量
              - name: MYSQL_ROOT_PASSWORD
                value: "123456"
    
    # vi tomcat-rs.yaml
    apiVersion: extensions/v1beta1
    kind: ReplicaSet
    metadata:
      name: tomcat7-java8
    spec:
      replicas: 3
      selector:
        app: tomcat
      template:
        metadata:
          labels:
            app: tomcat                         # spec.template.metadata.labels标签名与spec.selector名称要相同
        spec:
          containers:
            - name: tomcat7-java8
              image: maluuba/tomcat7-java8:latest
              ports:
              - containerPort: 8080
              env:
              - name: MYSQL_SERVICE_HOST
                value: 'mysql5.7'               # mysql-svc metadata.name
              - name: MYSQL_SERVICE_PORT
                value: '3306'                   # mysql-svc spec.port
    
    # vi nginx-rs.yaml
    apiVersion: extensions/v1beta1
    kind: ReplicaSet
    metadata:
      name: frontend
    spec:
      replicas: 3
      selector:
        tier: frontend
      template:
        metadata:
          labels:
            app: nginx
            tier: frontend
        spec:
          containers:
          - name: nginx1.18
            image: nginx:1.18.0
            imagePullPolicy: IfNotPresent
            env:
            - name: GET_HOSTS_FROM
              value: env
            ports:
            - containerPort: 80
    
    查看ReplicaSet信息
    # kubectl get rs
    
    手动操作动态扩容
    # kubectl scale rc nginx1.18 --replicas=3 扩容3台容器

    3.Deployment类型

    # vi tomcat-deployment.yaml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: tomcat7-java8
    spec:
      replicas: 3
      selector:
        app: tomcat
      template:
        metadata:
          labels:
            app: tomcat                         # spec.template.metadata.labels标签名与spec.selector名称要相同
        spec:
          containers:
            - name: tomcat7-java8
              image: maluuba/tomcat7-java8:latest
              ports:
              - containerPort: 8080
              env:
              - name: MYSQL_SERVICE_HOST
                value: 'mysql5.7'               # mysql-svc metadata.name
              - name: MYSQL_SERVICE_PORT
                value: '3306'                   # mysql-svc spec.port
    
    创建Deployment
    # kubectl create -f tomcat-deployment.yaml
    
    查看Deployment信息
    # kubectl get deployment
    内容说明:
    desired:pod副本数量的期望值,即deployment里定义的replicas数量
    current:当前replicas,这个值不断增加,直到达到desired值为止
    up-to-date:最新版本的pod副本数量,用于指示在滚动升级过程中,有多少个pod副本已经升级成功
    available:当前集群中可用的pod副本数量

    4.Horizontal POD Autoscaler类型(按负载动态扩容)

    # vi tomcat-HPA.yaml
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: tomcat7-java8
      namespace: default
    spec:
      maxReplicas: 10                       # 最大副本数10
      minReplicas: 3                        # 最小副本数3
      scaleTargetRef:
        kind: Deployment
        name: tomcat7-java8
      targetCPUUtilizationPercentage: 90    # CPU利用率超过90%触发自动扩容
    
    支持创建一个HPA对象
    # kubectl autoscale deployment tomcat7-java8 --cpu-percent=90 --min=3 --max=10

    5.Service类型

    # vi mysql-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql5.7
    spec:
      ports:
        - port: 3306
      selector:
        app: mysql
    
    # vi tomcat-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat7-java8
    spec:
      type: NodePort
      ports:
        - port: 8080
          nodePort: 30001       # 远程直接访问nodeIP+30001端口
      selector:
        app: tomcat
    
    # vi nginx-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      ports:
      - port: 80
       name: http-port
        protocol: TCP
        targetPort: 80       # 容器所暴露(EXPOSE)的端口号,不定义默认与port端口号相同
      - port: 443
       name: https-port
        protocol: TCP
        targetPort: 443
      selector:
        tier: frontend       # label名称是tier=frontend
    
    创建service
    # kubectl create -f nginx-svc.yaml
    
    查看endpoint列表
    # kubectl get endpoints
    
    查看service分配的cluster ip
    # kubectl get svc nginx-service -o yaml
    
    创建nodeport类型,服务通过node ip+node port可直接访问
    # vi tomcat-svc_nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: tomcat-service
    spec:
      type: NodePort
      ports:
       - port: 8080
         nodePort: 31002
      selector:
         app: tomcat
    
    # netstat -tlp | grep 31002

    6.DaemonSet类型

    # vi zabbix-agent_daemonset.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: zabbix-agent
      namespace: default
      labels:
        app: zabbix
    spec:
      selector:
        matchLabels:
          name: zabbix-agent
      template:
        metadata:
          labels:
            app: zabbix
        spec:
          containers:
          - name: zabbix-agent
            image: zabbix/zabbix-agent:latest
          volumes:
          - name: zabbixagentdir
            hostPath:
              path: /etc/zabbix-agent

    一个DaemonSet对象能确保其创建的Pod在集群中的每一台(或指定)Node上都运行一个副本。如果集群中动态加入了新的Node,DaemonSet中的Pod也会被添加在新加入Node上运行。删除一个DaemonSet也会级联删除所有其创建的Pod。

    7.StatefulSet类型

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      serviceName: "mysql"
      replicas: 2
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: nmysql
            image: mysql:5.27
            ports:
            - containerPort: 3306
            - protocol: tcp

    serviceName=mysql字段的作用,就是告诉StatefulSet控制器,在执行控制循环时,要使用nginx这个Headless Service来保证Pod的可解析身份,StatefulSet给它所管理的所有Pod名字进行编号,使得每个Pod实例不重复.而更重要的是,这些Pod的创建,也是严格按照编号顺序来进行的。当使用StatefulSet创建mysql这种有主从关系的有状态pod时,有明确先后关系时,StatefulSet通过这种机制,使得先后创建顺序成为可能。

    一入运维深似海,从此不见彼岸花
  • 相关阅读:
    信号
    序列化数据的两种方式
    ModelForm的使用
    分页模板
    Django中间件进行用户登陆验证
    Flask 笔记一
    pipenv 使用基本命令
    git本地文件 上传 远程仓库
    service "$service" status 返回的状态
    &>/dev/null 的作用
  • 原文地址:https://www.cnblogs.com/cn-jasonho/p/13285568.html
Copyright © 2011-2022 走看看