一、什么是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

  1. 首先是开始的nginx 1.14版本的Pod在运行,然后 1.15版本的在创建
  2. 然后在1.15版本创建完成后,就会暂停1.14版本
  3. 最后把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 控制器的更多相关文章

  1. 【Kubernetes】Deployment控制器模型

    在Kubernetes中,Deployment是最基本的控制器对象 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploym ...

  2. Kubernetes Job Controller 原理和源码分析(一)

    概述什么是 JobJob 入门示例Job 的 specPod Template并发问题其他属性 概述 Job 是主要的 Kubernetes 原生 Workload 资源之一,是在 Kubernete ...

  3. Kubernetes Job Controller 原理和源码分析(二)

    概述程序入口Job controller 的创建Controller 对象NewController()podControlEventHandlerJob AddFunc DeleteFuncJob ...

  4. Kubernetes Job Controller 原理和源码分析(三)

    概述Job controller 的启动processNextWorkItem()核心调谐逻辑入口 - syncJob()Pod 数量管理 - manageJob()小结 概述 源码版本:kubern ...

  5. .NET/ASP.NET MVC Controller 控制器(IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  6. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  7. MVC(Model(模型) View(视图) Controller(控制器))

    复习 1.      商品表 增删改查 index.php  add.php   view.php   edit.php   action.php 2.      MVC(Model(模型)  Vie ...

  8. 三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC IControllerFactory 控制器工厂接口 3.ASP.NETMVC DefaultControllerFactory 默认控制器工厂 4 ...

  9. 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

随机推荐

  1. react第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性)

    第十二单元(react路由-使用react-router-dom-认识相关的组件以及组件属性) #课程目标 理解路由的原理及应运 理解react-router-dom以及内置的一些组件 合理应用内置组 ...

  2. Redis5.0 主从模式和高可用 搭建和测试报告

    Redis 单机模式很简单,相关测试水文看这里 Redis5 压力测试结果反馈报告 必须的,今天接着写水文,写一写现在redis 支持的三种集群,主从模式,哨兵模式,Cluster模式,今天先搞主从模 ...

  3. 悉数 Python 函数传参的语法糖

    TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...

  4. 5分钟教你在Linux下安装VMware

    如果我们只有一台笔记本,又想要搭建一个小集群,怎么办?虚拟机帮你实现梦想,市面上较为常用的虚拟机软件有VMware.VirtualBox.Xen.KVM.hyper-v等,本文主要介绍如何在Linux ...

  5. C# Socket使用以及DotNetty和Supersocket 框架

    1.Socket服务端与客户端通话 1服务端 using System; using System.Collections.Generic; using System.Linq; using Syst ...

  6. (十三)、向shell脚本中传参

    一.向脚本中传递位置参数 向脚本中传递参数的数目理论上可以无数多,但是只有前9个能被访问,使用shift可以改变此限制 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 脚本名字 first ...

  7. iOS崩溃治理--开篇

    去年我开始负责iOS崩溃治理的工作,从原来的万分之五崩溃率,一直到现在的万分之一左右的崩溃率,期间踩了很多坑,因此想和大家分享一下,希望能对大家有所帮助,也欢迎大家私信交流. 如果你打算开始治理崩溃的 ...

  8. 冰河又一MySQL力作出版(文末送书)!!

    写在前面 继<海量数据处理与大数据技术实战>之后,冰河的又一力作<MySQL技术大全:开发.优化与运维实战>出版,相信这本书对任何想系统学习MySQL的小伙伴来说,都会带来实质 ...

  9. 手摸手带你用Hexo撸博客(二)之配置主题

    在上一篇博客手摸手带你用Hexo撸博客(一)中主要介绍了博客的初步搭建 今天我们继续讲如何在Hexo搭建的博客中应用主题 官网选择自己喜欢的主题 点击这里Hexo主题进入官网主题页面 然后选择自己喜欢 ...

  10. linux零基础之--常用命令

    linux: 用户命令 linux 目录切换命令 linux文件命令 linux : vi编辑器 linux:打包压缩