1 概念

  • 在集群上管理和运行容器的对象

2 Pod和Controller关系

  • Pod是通过Controller实现应用的运维,比如伸缩滚动升级
  • Pod和Controller之间通过label标签建立关系
    • Pod中使用labels打标签
    • Controller中使用selector:matchLabels选择标签

3 Deplotment控制器应用场景

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 部署、滚动升级等功能
  • 应用场景:web服务``微服务

4 yaml文件字段说明


5 Deployment控制器部署应用

  1. // 1 导出一个deployment控制器的web应用的yaml文件
  2. kubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yaml
  3. // 2 使用yaml文件应用部署
  4. kubectl apply -f web.yaml
  5. // 3 对外发布
  6. kubectl expose deployment web --port=80 --type=NodePort --target-port=6565 --name=web1 -o yaml > web1.yaml
  7. // 4 执行yaml文件
  8. kubectl apply -f web1.yaml
  9. // 5 查看svc
  10. kubectl get pods,svc
  11. // 6 通过ip:port访问测试

6 升级回滚

  1. // 1 修改yaml文件,固定images版本
  2. // 2 部署应用
  3. kubectl apply -f web.yaml
  4. // 3 升级images版本
  5. kubectl set image deployment web nginx=nginx:1.17
  6. // 4 查看升级状态
  7. kubectl rollout status deployment web
  8. // 5 回滚
  9. // 5.1 查看历史版本
  10. kubectl rollout history deployment web
  11. // 5.2 回滚到上一个版本
  12. kubectl rollout undo deployment web
  13. // 5.3 回滚到指定版本
  14. kubectl rollout undo deployment web --to-revision=[指定版本]

6.1 升级过程

  1. 先生成一个新的pod,下载升级后的版本
  2. 下载成功后删除原pod
  3. 运行新的pod
  4. 如果有多个副本,按顺序一个个执行1~3
  5. 优点:保证线上服务不中断

7 弹性伸缩

  1. // 将副本数量拓展到指定数量
  2. kubectl scale deployment web --replicas = 10

8 无状态和有状态

8.1 无状态

  • 认为Pod都是一样的
  • 没有顺序要求
  • 不用考虑在那个node上运行
  • 随意进行伸缩和拓展

8.2 有状态

  • 上面的因素都需要考虑到
  • 让每个Pod独立的,要保持Pod启动顺序和唯一性
    • 唯一的网络标识符,持久存储
    • 有序,比如mysql主从

9 部署有状态应用StatefulSet(TDDO-35)

deployment和statefulset区别

statefulset时有身份(唯一标识),规则如下:

  • 根据主机名 + 按照一定规则生成域名
  • 每个Pod有唯一主机名
  • 唯一域名:
    • 格式:主机名称.service名称.名称空间.svc.cluster.local

10 部署守护进程DeamonSet

  • 在每个node上运行一个Pod,新加入的node也同样运行在一个pod里。

10.1 新建yaml文件

  1. apiVersion: app/v1
  2. kind: DeamonSet
  3. metadata:
  4. name: ds-test
  5. labels:
  6. app: filebeat
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: filebeat
  11. template:
  12. matadata:
  13. labels:
  14. app: filebeat
  15. spec:
  16. containers:
  17. - name: logs
  18. image: nginx
  19. ports:
  20. - containerPort: 80
  21. volumnMounts:
  22. - name: varlog
  23. mountPath: /tmp/log
  24. volumes:
  25. - name: varlog
  26. hostPath:
  27. path: /var/log

10.2 部署守护进程

  1. // 1 部署应用
  2. kubectl apply -f ds.yaml
  3. // 2 进入pod查看日志
  4. kubectl exec -it ds bash
  5. // 3 pod内查看日志
  6. ls /tmp/log

11 一次任务和定时任务

11.1 一次性任务(Job)

  1. 新建yaml文件

    1. apiVersion: batch/v1
    2. kind: Job
    3. metadata:
    4. name: pi
    5. spec:
    6. template:
    7. spec:
    8. containers:
    9. - name: pi
    10. image: perl
    11. command:["prel", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
    12. restartPolicy: Never
    13. backkoffLimit: 4
  2. 部署Job

  1. // 1 部署应用
  2. kubectl create -f job.yaml
  3. // 2 查看job
  4. kubectl get jobs
  5. // 3 查看日志
  6. kubeclt logs [pod名]

11.2 定时任务(CornJob)

  1. 新建yaml文件

    1. apiVersion: batch/v1
    2. kind: CornJob
    3. metadata:
    4. name: hello
    5. spec:
    6. schedule: "*/1 * * * *",
    7. jobTemplate:
    8. spec:
    9. containers:
    10. - name: hello
    11. image: busybox
    12. args:
    13. - /bin/sh
    14. - -c
    15. - data; echo Hello from the Kubernetes cluster
    16. restartPolicy: OnFailure
  2. 部署Job

  1. // 1 部署应用
  2. kubectl apply -f cronjob.yaml
  3. // 2 查看job
  4. kubectl get jobs
  5. // 3 查看日志
  6. kubeclt logs [pod名]