(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通过这种机制,使得先后创建顺序成为可能。

 

posted @ 2020-07-10 11:19  不倒翁Jason  阅读(672)  评论(0编辑  收藏  举报