k8s(四):核心技术-Controller

1. 什么是controller

  1. 在集群上管理和运行容器的对象,它是实际存在的,不像pod是抽象的
  2. 可以进行有状态应用部署和无状态应用部署

2. Pod和Controller的关系

  1. Pod是通过Controller实现应用的运维,比如伸缩,滚动升级等等
  2. Pod和Controller通过label建立关系
    在这里插入图片描述

3. 五种控制器类型

3.1 deployment

3.1.1 特点

  1. 部署无状态的应用。如nginx,web服务,微服务等
  2. 管理Pod和ReplicaSet
  3. 具有上线部署、副本设定、滚动升级、回滚等功能

3.1.2 示例

  1. 生成yml文件
kubectl create deployment web --image=nginx #不能做复用,只能做测试

kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml  #生成yaml文件样板

web.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector: # 与下面的labels完成匹配
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels: # 完成匹配
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
  1. 使用yaml部署应用
[root@k8sMaster ~]# kubectl apply -f web.yaml
deployment.apps/web created
[root@k8sMaster ~]# kubectl get pods
NAME                   READY   STATUS              RESTARTS   AGE
web-5dcb957ccc-2fvt9   0/1     ContainerCreating   0          6s
  1. 对外发布(暴露对外端口号)
 kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml

kubectl apply -f web1.yaml
  1. 查看暴露端口号并访问
[root@k8sMaster ~]#  kubectl get pods,svc
NAME                       READY   STATUS    RESTARTS   AGE
pod/web-5dcb957ccc-2fvt9   1/1     Running   0          12m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        20d
service/web1         NodePort    10.97.135.244   <none>        80:30800/TCP   5m47s

30800为对外暴露端口
在这里插入图片描述

3.1.3 应用升级回滚和弹性伸缩

  1. 应用升级
    应用升级时,先下载镜像,当pod启动后,会替换掉旧版本
 kubectl set image deployment web nginx=nginx:1.15
  1. 查看升级版本
[root@k8sMaster ~]# kubectl rollout history deployment web
deployment.apps/web
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
  1. 查看升级状态
[root@k8sMaster ~]# kubectl rollout status deployment web
deployment "web" successfully rolled out

这是升级成功的显示

  1. 回滚到上一个版本
[root@k8sMaster ~]# kubectl rollout undo deployment web
deployment.apps/web rolled back
  1. 回滚到指定版本
[root@k8sMaster ~]# kubectl rollout undo deployment web --to-revison=2
deployment.apps/web rolled back
  1. 弹性伸缩
[root@k8sMaster ~]# kubectl scale deployment web --replicas=10
deployment.apps/web scaled

3.2 StatefulSet

3.2.1 特点

部署有状态应用
解决Pod独立生命周期,保持Pod启动顺序和唯一性
稳定,唯一的网络标识符,持久存储(例如: etcd 配置文件,节点地址发生变化,将无法使用)
有序,优雅的部署和扩展、删除和终止(例如: mysql 主从关系,先启动主,再启动从)
有序,滚动更新
应用场景: 数据库

3.2.2 无状态和有状态区别

  1. 无状态:
    (1) deployment认为所有的pod都是一样的
    (2) 不用考虑顺序的要求
    (3) 不用考虑在哪个node节点上运行
    (4) 可以随意扩容和缩容

  2. 有状态:
    (1) 实例之间有差别,每个实例都有自己的独特性,元数据不同,例如etcd, zookeeper
    (2) 实例之间不对等的关系,以及依靠外部存储的应用。

3.2.3 部署有状态应用

常规service和无头服务区别:
(1) service: 一组Pod访问策略,提供cluster-IP群集之间通讯,还提供负载均衡和服务发现。
(2) Headless service无头服务, 不需要cluster-IP,直接绑定具体的Pod的IP(当Pod的IP地址是动态变化时,所以常用于绑定DNS访问)

注意无头service(即:clusterIP:None)

在这里插入图片描述
创建开始
在这里插入图片描述
查看pod,有三个pod,每个都是唯一名称
在这里插入图片描述
查看创建无头的service,这里为None表示无头service
在这里插入图片描述

3.3 DaemonSet

3.3.1 特点

  1. 部署守护进程
  2. 确保所有的node运行同一个pod

应用场景:Agent、监控
在这里插入图片描述

3.3.2 示例

用DaemonSet 控制器类型创建nginx pod资源,没有指定副本replicats,它会根据node节点的个数创建,如果再新加一个node节点,也会给新node节点创建pod

3.4 Job普通任务

3.4.1 特点

应用场景:离线数据处理,视频解码等业务

3.4.2 示例

用job控制器类型创建资源,执行算圆周率的命令,保持后2000位,创建过程等同于在计算
,重试次数默认是6次,修改为4次,当遇到异常时Never状态会重启,所以要设定次数。

# vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

在node节点提前下载perl镜像,因为镜像比较大所以提前下载好
node1 node2节点:
# docker pull perl

创建过程等同于在计算
# kubectl apply -f job.yaml 
job.batch/pi created

查看状态
# kubectl get pods
# kubectl describe pod pi-tkdlc 

查看日志,看计算结果,结果输出到控制台
# kubectl logs pi-tkdlc
3.141592653589793.............................................共2000位

3.5 CronJob定时任务

3.5.1 特点

周期性任务,像Linux的Crontab一样。
周期性任务
应用场景:通知,备份

3.5.2 示例

每隔一分钟输出一条信息,打印hello

# vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

busybox 是linux内核镜像

# kubectl create -f cronjob.yaml
# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE    AGE
hello      */1 * * * *         False         0         <none>          25s
# kubectl get pods
查看日志,内容输出到控制台
# kubectl logs hello-1581917340-dzxbj
Mon Feb 17 05:29:09 UTC 2020
Hello from the Kubernetes cluster

等待一分钟后又会再执行一次
# kubectl get pods
# kubectl logs hello-1581917400-nkb72

最后删除资源,不然第二天服务器宕机
# kubectl delete -f cronjob.yaml

4. StatefulSet与Deployment区别

StatefulSet创建的pod是有身份的,有唯一标识的。

  1. 每个pod都有唯一的主机名
  2. 唯一域名生成规则:格式:主机名.service名称.名称空间.svc.cluster.local【例如:在这里插入图片描述

参考博客:https://blog.csdn.net/weixin_45691464/article/details/106326605

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值