kubernetes 核心技术-Controller 控制器
一、什么是Controller?
Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的,主要创建管理pod
二、Pod和Controller的关系
Pod是通过Controller实现应用的运维,比如弹性伸缩,滚动升级等
Pod 和 Controller之间是通过label标签来建立关系,同时Controller又被称为控制器工作负载

三、Deployment控制器应用场景
- Deployment控制器可以部署无状态应用
 - 管理Pod和ReplicaSet
 - 部署,滚动升级等功能
 - 应用场景:web服务,微服务
 
Deployment表示用户对K8S集群的一次更新操作。Deployment是一个比RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧RS中的副本数减少到0的复合操作。
这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。
四、Deployment控制器部署应用
之前我们也使用Deployment部署过应用,如下代码所示
[root@k8s-master ~]$ kubectrl create deployment web --image=nginx
但是上述代码不是很好的进行复用,因为每次我们都需要重新输入代码,所以我们都是通过YAML进行配置
但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】
4.1 导出yaml文件
[root@k8s-master ~]$ kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
[root@k8s-master ~]$ cat web.yaml
apiVersion: apps/v1  #API版本,可以用kubectl api-versions命令查询
kind: Deployment  #yaml文件定义的资源类型和角色,可以是Deployment、Job、Ingress、Service等
metadata:  #元数据,固定值写metadata,包含Pod的一些meta信息,比如名称、namespace、标签等信息。
  creationTimestamp: null
  labels:  # 设定资源的标签
    app: web
  name: web
spec:  # 资源规范字段
  replicas: 1 # 声明副本数目
  selector: # 选择器
    matchLabels: # 匹配标签
      app: web  #匹配template标签的web
  strategy: {} # 策略
  template: # 模版
    metadata: # 资源的元数据/属性
      creationTimestamp: null
      labels:  # 设定资源的标签
        app: web
    spec: # 资源规范字段
      containers:
      - image: nginx # 容器使用的镜像地址
        name: nginx # 容器的名字
        resources: {}
status: {}
我们看到的 selector 和 label 就是我们Pod 和 Controller之间建立关系的桥梁
4.2 使用YAML创建Pod
通过刚刚的代码,我们已经生成了YAML文件,下面我们就可以使用该配置文件快速创建Pod镜像了
[root@k8s-master ~]$ kubectl apply -f web.yaml
[root@k8s-master ~]$ kubectl get pods
NAME                   READY   STATUS    RESTARTS   AGE
web-5dcb957ccc-jph2p   1/1     Running   0          63s
但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口
[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1
关于上述命令,有几次参数
- --port:就是我们内部的端口号
 - --target-get-port:就是暴露外面访问的端口号
 - --name:名称
 - --type:类型
 
导出发布对应的配置文件
[root@k8s-master ~]$ kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml
[root@k8s-master ~]$ cat web1.yaml
apiVersion: v1 # 指定api版本,此值必须在kubectl api-versions中
kind: Service # 指定创建资源的角色/类型
metadata: # 资源的元数据/属性
  creationTimestamp: "2021-01-24T12:53:26Z"
  labels: # 设定资源的标签
    app: web
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:externalTrafficPolicy: {}
        f:ports:
          .: {}
          k:{"port":80,"protocol":"TCP"}:
            .: {}
            f:port: {}
            f:protocol: {}
            f:targetPort: {}
        f:selector:
          .: {}
          f:app: {}
        f:sessionAffinity: {}
        f:type: {}
    manager: kubectl
    operation: Update
    time: "2021-01-24T12:53:26Z"
  name: web1
  namespace: default
  resourceVersion: "52349"
  selfLink: /api/v1/namespaces/default/services/web1
  uid: 296d8c14-d397-42d4-b26d-28de0a7d372d
spec:
  clusterIP: 10.99.52.163
  externalTrafficPolicy: Cluster
  ports:  #对外发布
  - nodePort: 32180
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: web
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}
#对外暴露服务
[root@k8s-master ~]$ kubectl apply -f web1.yaml
可以通过下面的命令来查看对外暴露的服务
[root@k8s-master ~]$  kubectl get pods,svc
NAME                       READY   STATUS    RESTARTS   AGE
pod/web-5dcb957ccc-jph2p   1/1     Running   0          11m
NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        8h
service/web1         NodePort    10.99.52.163   <none>        80:32180/TCP   6m2s
然后我们访问对应的url,即可看到 nginx了http://192.168.88.11:32180/
五、升级回滚和弹性伸缩
- 升级: 假设从版本为1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】
 - 回滚: 从版本1.15 变成 1.14,这就叫应用的回滚
 - 弹性伸缩: 我们根据不同的业务场景,来改变Pod的数量对外提供服务,这就是弹性伸缩
 
之前创建的pod删除掉
[root@k8s-master ~]# kubectl delete deployment web
5.1 应用升级和回滚
5.1.1 应用升级
首先创建一个 1.14版本的Pod
[root@k8s-master ~]$ vim web.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx:1.14 #指定1.14版本
        name: nginx
        resources: {}
status: {}
开始创建Pod
[root@k8s-master ~]$ kubectl apply -f web.yaml
在node节点使用docker images命令,就能看到我们成功拉取到了一个 1.14版本的镜像
使用下面的命令,可以将nginx从 1.14 升级到 1.15
[root@k8s-master ~]$ kubectl set image deployment web nginx=nginx:1.15

- 首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建
 - 然后在1.15版本创建完成后,就会暂停1.14版本
 - 最后把1.14版本的Pod移除,完成我们的升级
 
我们在下载 1.15版本,容器就处于ContainerCreating状态,然后下载完成后,就用 1.15版本去替换1.14版本了,这么做的好处就是:升级可以保证服务不中断
5.1.2 查看升级状态
[root@k8s-master ~]$ kubectl rollout status deployment web
deployment "web" successfully rolled out
5.1.3 应用回滚
查看历史版本
[root@k8s-master ~]$ kubectl rollout history deployment web
deployment.apps/web
REVISION  CHANGE-CAUSE
1         <none>
2         <none>
回滚到上一个版本
[root@k8s-master ~]$ kubectl rollout undo deployment web
#undo
同时我们还可以回滚到指定版本
[root@k8s-master ~]$ kubectl rollout undo deployment web --to-revision=2
5.2 弹性伸缩
弹性伸缩,也就是我们通过命令一下创建多个副本
[root@k8s-master ~]$ kubectl scale deployment web --replicas=10
[root@k8s-master ~]$ kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
web-65b7447c7-28ppk   1/1     Running   0          3m5s
web-65b7447c7-8rspl   1/1     Running   1          6m42s
web-65b7447c7-9mv5n   1/1     Running   0          3m5s
web-65b7447c7-9sqrv   1/1     Running   0          3m5s
web-65b7447c7-c8g9t   1/1     Running   0          3m5s
web-65b7447c7-mczxb   1/1     Running   0          3m5s
web-65b7447c7-nxz2h   1/1     Running   0          3m5s
web-65b7447c7-r6p75   1/1     Running   0          3m5s
web-65b7447c7-vx6mv   1/1     Running   0          3m5s
web-65b7447c7-vzt7s   1/1     Running   0          3m5s
												
											kubernetes 核心技术-Controller 控制器的更多相关文章
- 【Kubernetes】Deployment控制器模型
		
在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...
 - Kubernetes Job Controller 原理和源码分析(一)
		
概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...
 - Kubernetes Job Controller 原理和源码分析(二)
		
概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...
 - Kubernetes Job Controller 原理和源码分析(三)
		
概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...
 - .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)
		
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
 - .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
		
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
 - MVC(Model(模型)  View(视图)  Controller(控制器))
		
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
 - 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
		
阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...
 - 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
		
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
 
随机推荐
- Python高级语法-私有化-私有化理解(4.3.1)
			
@ 目录 1.说明 2.代码 关于作者 1.说明 __a(私有):只能在类的内部使用,对象使用,但是子类不允许使用,不能导入到其他包 a(protected):可以在子类使用,可以通过对象访问,不能导 ...
 - 解决Yii ActiveForm监听submit触发2次submit
			
今天用yii框架的ActiveForm需要一个奇怪的问题,点击表单提交时会触发两次submit 产生问题的原因: form挂了2次submit事件,一次是yii activeform自带的,一次是我写 ...
 - 简单的冒泡排序算法(java)
			
package lianxi; public class BubbleSort { public static void main(String[] args) { int[] array = {12 ...
 - VC++安装window8.1系统
			
下载VC++软件 解压安装(这个过程一般不会出现问题) 安装完成后,运行VC++会出现不兼容信息,照着一下方法就可以解决了. 将MSDEV.EXE重命名为MSDEV1.EXE.(路径:Common/M ...
 - 看起来很唬人,然而却简单实用的CAP理论
			
在做分布式系统开发时,经常会或多或少的听到CAP理论.或者是处理节点间数据一致性的问题.CAP理论很简单,但却是很多软件设计的宏观指导,因此也有人将之称为架构师必须掌握的理论之一.鉴于理论的东西相对来 ...
 - 【转】PANDAS 数据合并与重塑(concat篇)
			
转自:http://blog.csdn.net/stevenkwong/article/details/52528616 1 concat concat函数是在pandas底下的方法,可以将数据根据不 ...
 - .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 写入和查询)--学习笔记
			
2.5.3 MongoDB -- 写入和查询 写入 查询 查找操作符 逻辑操作符 其他 嵌套对象 数组 游标方法 写入 https://docs.mongodb.com/manual/tutorial ...
 - [学习笔记]Golang--基础数据类型
			
1,不同类型的变量不能互相赋值或者操作,如var a int8 = 16var b int = 23c := a + b 会报错,且int虽然默认32位,但和int32是不同的类型 iota只在声明枚 ...
 - 浅谈.NET技术公司的实习生培养
			
浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...
 - 数据库MySQL(带你零基础入门MySQL)
			
(一)认识数据库 redis默认端口:6379 mysql默认端口:3306 什么是数据库? 数据库的英文单词:data base,简称DB. 数据库实际上就是一个文件集合,是一个存储数据的仓库,本质 ...