来源:b站open in new window

  • Q:Pod有哪些分类?
    • 自主式Pod:Pod退出了,此类型的Pod不会被创建
    • 控制器管理的Pod:在控制器的生命周期里,始终要维持Pod的副本数目
  • Q:什么是控制器?
    • k8s中内建了很多controller(控制器),这些相当于一个状态机,用来控制Pod的具体状态和行为
  • Q:控制器有哪些类型?
    • ReplicationController和ReplicaSet
    • Deployment
    • DaemonSet
    • StateFulSet
    • Job/CronJob
    • Horizontal Pod Autoscaling
  • Q:命令式编程和声明式编程的区别是什么?
    • 命令式编程:侧重于如何实现,需要把程序的实现过程按照逻辑结果一步步写下来,k8s使用create命令
    • 声明式编程:侧重于定义想要什么,然后告诉计算机/引擎,让它帮忙实现,k8s使用apply命令
  • Q:ReplicationController和ReplicaSet是什么?
    • ReplicationController(RC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代,而如果异常多出来的容器也会自动回收
    • 在新版本的k8s中建议使用ReplicaSet来取代ReplicationController。ReplicaSet跟ReplicationController没有本质的不同,只是名字不一样,并且ReplicaSet支持集合式的selector
    • 创建命令kubectl create -f rs.yaml
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
  name: frontend
spec:
  replicas: 3
selector:
  matchLabels:
    tier: frontend
template:
  metadata:
    labels:
      tier: frontend
  spec:
    containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80
  • Q:Deployment是什么?
    • 为Pod和ReplicaSet提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController来方便的管理应用
    • 典型场景有:
      • 定义Deployment来创建Pod和ReplicaSet
      • 滚动升级和回滚应用
      • 扩容和缩容
      • 暂停和继续Deployment
  • Q:如何使用Deployment部署一个简单的Nginx应用

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
- 创建命令:`kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record`
- 其中--record参数可以记录命令,可以很方便的查看每次revision的变化
  • Q:如何查看deployment状态?
    • kubectl get deployment
  • Q:如何对Deployment进行扩容?
    • kubectl scale deployment nginx-deployment --replicas 10
  • Q:如何更新deployment镜像?
    • kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
    • =前是容器名,后是镜像
  • Q:如何回滚deployment
    • kubectl rollout undo deployment/nginx-deployment
  • Q:如何查看可回滚的deployment历史版本?
    • kubectl rollout history deployment/nginx-deployment
  • Q:如何回滚deployment到指定的历史版本?
    • kubectl rollout undo deployment/nginx-deployment --to-version=2
  • Q:如何查看rollout状态?
    • kubectl rollout status deployment/nginx-deployment
  • Q:如何编辑Deployment?
    • kubectl edit deployment/nginx-deployment
  • Q:Deployment的清理策略是什么?
    • 可以通过设置.spec.revisonHistoryLimit项来指定deployment最多保留多少revision历史记录。默认的会保留所有的revision;如果将该项设置为0,Deployment就不允许回退了
  • Q:Deployment的更新策略是什么?
    • 保证在升级时只有一定数量的Pod是down的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)
    • Deployment 同时也可以确保只创建出超过期望数量的一定数量的Pod。默认的,它会确保最多比期望的Pod数 量多一个的Pod是up的(最多1个surge)
    • 未来的 Kuberentes 版本中,将从1-1变成25%-25%
  • Q:DaemonSet是什么?
    • 确保全部(或者一些)Node上运行一个Pod的副本。当有Node加入集群时,也会为它们新增一个Pod。当有Node从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod
    • 使用DaemonSet的一些典型用法:
      • 运行集群存储daemon,例如在每个Node上运行glusterd、ceph
      • 在每个Node上运行日志手机daemon,例如fluentd、logstash
      • 在每个Node上运行监控daemon,例如Prometheus Node Exporter、collectd、Datadog代理、New Relic代理,或Ganglia gmond
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: deamonset-example
  labels:
    app: daemonset
spec:
  selector:
    matchLabels:
      # 注意这个name和上面的metadata中的name必须要一致
      name: deamonset-example
  template:
    metadata:
      labels:
        name: deamonset-example
    spec:
      containers:
      - name: daemonset-example
        image: wangyanglinux/myapp:v1
  • Q:Job的作用是什么?
    • 负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束
    • 特殊说明
      • spec.template格式同Pod
      • RestartPolicy仅支持Never或OnFailure
      • 单个Pod时,默认Pod成功运行后Job即结束
      • .spec.completions标志Job结束需要成功运行的Pod个数,默认为1
      • .spec.parallelism标志并行运行的Pod的个数,默认为1
      • spec.activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] 
      restartPolicy: Never
- 创建:`kubectl create -f job.yaml`
  • Q:CronJob的作用是什么?
    • 管理基于时间的Job,即:
      • 在给定时间点只运行一次
      • 周期性地在给定时间点运行
    • 典型用法是:
      • 在给定的时间点调度Job运行
      • 创建周期性运行的Job,如数据库备份、发送邮件
  • Q:如何查看cronjob状态?
    • kubectl get cronjob
  • Q:StatefulSet是什么?
    • 作为Controller为Pod提供唯一的标识。可以保证部署和scale的顺序
    • 是为了解决有状态服务的问题(对应Delpoyments和ReplicaSets是为无状态服务而设计),其应用场景包括:
      • 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化数据,基于PVC来实现
      • 稳定的网络标志,即Pod重新调度后其PodName和HostName不变,基于Headless Service(即没有Cluster IP的Service)来实现
      • 有序部署,有序扩展,即Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次进行,基于init containers来实现
      • 有序收缩,有序删除
  • Q:Horizontal Pod Autoscaling是什么?
    • 应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让service中的pod个数自动调整呢?就是Horizontal Pod Autoscaling,即使Pod水平自动缩放
  • Q:如何查看命令详细信息如rs?
    • kubectl explain rs
  • Q:如何删除所有pod?
    • kubectl delete pod --all
  • Q:查看pod状态的时候如何查看标签?
    • kubectl get pod --show-labels
  • Q:如何给pod添加标签?
    • kubectl label pod frontend-m8szd tier=frontend1
    • 即给frontend-m8szd这个容器加了一个标签,若已存在,需要使用--overwrite=True来覆盖
  • Q:如何删除所有rs?
    • kubectl delete rs --all
  • Q:如何查看pod的详细信息?
    • kubectl get pod -o wide
Last Updated:
Contributors: Shiqi Lu