Controller(控制器/工作负载)

2022/4/11 k8sDevops

# 1. 什么是controller

  • 在集群上管理和运行容器的对象
  • controller的几种类型
    • Deployment : 部署无状态应用
    • SatefulSet : 部署有状态应用
    • DaemonSet : 部署守护进程
    • Job : 一次性任务
    • cronJob : 定时任务

# 2.pod和controller之间的关系

  • pod是通过Controller实现应用的运维(弹性伸缩、滚动升级)
  • pod通过打标签来和controller建立关系

图示

# 3.Deployment控制器应用场景

  • 部署无状态应用
  • 管理Pod和ReplicasSet(副本)
  • 部署、滚动升级... 应用场景:web服务、微服务

用命令行创建的只用于学习和测试,一般还是用yaml文件来声明式创建

kubectl create deployment web --image=nginx
1

# 4.yaml文件字段说明

图示

# 5.Deployment控制器部署应用

  1. 生成一个pod的yaml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
1
  1. 部署一个pod
kubectl apply -f web.yaml

1
2
  1. 对外发布(暴露端口号)
kubctl expse deployment web --port=80  --type=nodePort --target-port=80 --name=web-demo -o
-o yaml > web1.yaml
1
2

# 6.升级回滚

  • eg: 升级一个Nginx应用的Nginx镜像版本
kuebctl set image deployment web nginx=nginx:1.1.7
1

除了用命令,也可以直接改yaml文件中的镜像版本和副本数量

并且升级过程中pod的应用服务不会中断,因为下载新的之后并且启动了容器才会替换之前的旧副本应用

  • 查看deployment的升级状态
kubectl rollout status deployment web
1
  • 回滚(rollout) 查看历史版本
kubectl rollout  history deployment web
1

# 7.弹性伸缩

  • replicas(副本)

图示

  • 也可以 kubectl scale 命令 来进行deployment中pod的容器副本

图示

# 8.无状态和有状态应用的区别

  • 无状态 可用deployment来部署
    • 可以认为pod都是一样的
    • 没有顺序要求
    • 不用考虑在哪个node运行
    • 随意进行伸缩和扩展
  • 有状态
    • 上面无状态的因素都需要考虑

    • 让每个pod独立,保持pod启动顺序和唯一性

      • 唯一的网络标识符,数据持久存储
      • 有序,比如mysql的主从
    • 如何部署有状态应用

      • 需要有一个无头 service (即一个service的 ClusterIp : none)
      • 通过 SatefulSet 来部署

      图例

      图例

# 9.DaemonSet

图示

图示

# 10. Job

kubectl get jobs
1

图示

backoffLimit: 重启策略 4次

# 11.CronJob

图示

Last Updated: 2022/8/12 下午10:21:19