一、K8S控制器的作用

使用配置清单创建Pod的时候通常会加入控制器的配置,否则没有控制器的Pod不支持故障漂移、横向扩容、滚动升级等高级特性。控制器(Controller)可以确保资源符合我们的需求,常用的控制器有DeemonSet、Deployment、ReplicaSet、Jobs等,有关控制器的详细介绍可以参考官网https://kubernetes.io/docs/concepts/workloads/controllers/。最常用的2种控制器的主要用途和特点:

DaemonSet:用于确保所有节点运行同一个Pod的场景,比如日志采集、监控系统

Deployment:使用最多的无状态应用控制器,相比ReplicaSet来说,Deployment能直接对Pod进行滚动更新和回滚等操作(如果使用的是ReplicaSet控制器,yaml文件发生变化后直接apply是不会生效的,需要先手动删除Pod让控制器重新创建才可以,如果Pod很多的话就需要重复很多次)。

二、Deployment控制器配置示例

1、创建一个包含控制器的配置清单以创建Pod,这里的配置清单选项比较精简,主要关注控制器内容,更详尽的可以参考本站文章《K8S教程(6)使用YAML资源配置清单创建Pods》

vi nginx-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3  #Pod的副本数量,多节点实现负载均衡与高可用
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

2、应用配置清单 

kubectl apply -f nginx-text.yaml

3、使用kubectl get命令查看控制器(由于这里是用的deployment,所以get的也就是deployment,使用其他控制器的话需要替换成对应的名字),可以看到会自动生成一个strategy字段,这个是用于滚动更新的策略 

kubectl get deployment #显示所有deployment和其状态
kubectl get deployment nginx-test -o yaml

 

4、使用Deployment实现滚动更新发布 

spec:
  ...
  strategy:
    rollingupdate:
      maxSurge: 1
      maxUnavailabe: 1
  template:
    metadata:
      labels:
        contraoller: deployment
        app: nginx
        version: 1.7.9
    spec:
      containers:
      - name: nginx
        image: nginx:1.8.1
  ...

应用配置文件创建好Pod,然后可以查看下历史版本 

kubectl apply -f nginx-test.yaml 
kubectl rollout history deployment nginx-test

回滚方法 

kubectl rollout undo deloyment nginx-test --to-version=1 #回滚到版本号1

5、为控制器创建Service,暴露服务

二、ReplicaSet的创建实例

apiVersion: apps/v1
kind: ReplicaSet  #定义控制器
metadata:
  name: frontend  
  labels:
    tier: frontend  #定义标签
spec:
  replicas: 3  #Pod的副本数量
  selector:  #标签选择器,符合条件的Pod才被控制
    matchLabels:
      tier: frontend
  template:  #由控制器所创建的Pod的信息在这里定义
    metadata:
      labels:  #容器的标签和控制器需要一致
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

三、DaemonSet创建示例 

vi daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:  #相比deployment少了replicase的定义,因为它是每个pod上都会运行
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:  #容忍度相关设置
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/container

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐