当前位置: 首页 > 最新文章 > 正文

kube-controller(kube-controller)

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

admin

Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的, 主要创建管理pod二、Pod和Controller的关系Pod是通过 Controller 实现应用的运维,比如弹性伸缩,滚动升级等Pod 和 Controller之间是通过label标签来建立关系,同时Controller又被称为控制器工作负载三、Deployment控制器应用场景Deployment控制器可以部署无状态应用管理Pod和ReplicaSet部署,滚动升级等功能应用场景:web服务,微服务Deployment表示用户对K8S集群的一次更新操作。这样一个复合操作用一个RS是不好描述的,所以用一个更通用的Deployment来描述。以K8S的发展方向,未来对所有长期伺服型的业务的管理,都会通过Deployment来管理。

一、什么是Controller?

Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是抽象的, 主要创建管理pod

二、Pod和Controller的关系

Pod是通过 Controller 实现应用的运维,比如弹性伸缩,滚动升级等

Pod 和 Controller之间是通过label标签来建立关系,同时Controller又被称为控制器工作负载

kubernetes 核心技术-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.yamlapiVersion: apps/v1  #API版本,可以用kubectl api-versions命令查询kind: Deployment  #yaml文件定义的资源类型和角色,可以是Deployment、Job、Ingress、Service等metadata:  #元数据,固定值写metadata,包含Pod的一些meta信息,比如名称、namespace、标签等信息。  creationTimestamp: null   labels:  # 设定资源的标签    app: web  name: webspec:  # 资源规范字段  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 之间建立关系的桥梁

kubernetes 核心技术-Controller 控制器

4.2 使用YAML创建Pod

通过刚刚的代码,我们已经生成了YAML文件,下面我们就可以使用该配置文件快速创建Pod镜像了

[root@k8s-master ~]$ kubectl apply -f web.yaml[root@k8s-master ~]$ kubectl get podsNAME                   READY   STATUS    RESTARTS   AGEweb-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.yamlapiVersion: 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-28de0a7d372dspec:  clusterIP: 10.99.52.163  externalTrafficPolicy: Cluster  ports:  #对外发布  - nodePort: 32180    port: 80    protocol: TCP    targetPort: 80  selector:    app: web  sessionAffinity: None  type: NodePortstatus:  loadBalancer: {} #对外暴露服务[root@k8s-master ~]$ kubectl apply -f web1.yaml

可以通过下面的命令来查看对外暴露的服务

[root@k8s-master ~]$  kubectl get pods,svcNAME                       READY   STATUS    RESTARTS   AGEpod/web-5dcb957ccc-jph2p   1/1     Running   0          11mNAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGEservice/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        8hservice/web1         NodePort    10.99.52.163   <none>        80:32180/TCP   6m2s

然后我们访问对应的url,即可看到 nginx了 http://192.168.88.11:32180/

kubernetes 核心技术-Controller 控制器

五、升级回滚和弹性伸缩

  • 升级: 假设从版本为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.yamlapiVersion: apps/v1kind: Deploymentmetadata:  creationTimestamp: null  labels:    app: web  name: webspec:  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版本的镜像

kubernetes 核心技术-Controller 控制器

使用下面的命令,可以将nginx从 1.14 升级到 1.15

[root@k8s-master ~]$ kubectl set image deployment web nginx=nginx:1.15
kubernetes 核心技术-Controller 控制器

  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 webdeployment "web" successfully rolled out

5.1.3 应用回滚

查看历史版本

[root@k8s-master ~]$ kubectl rollout history deployment webdeployment.apps/web REVISION  CHANGE-CAUSE1         <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 podsNAME                  READY   STATUS    RESTARTS   AGEweb-65b7447c7-28ppk   1/1     Running   0          3m5sweb-65b7447c7-8rspl   1/1     Running   1          6m42sweb-65b7447c7-9mv5n   1/1     Running   0          3m5sweb-65b7447c7-9sqrv   1/1     Running   0          3m5sweb-65b7447c7-c8g9t   1/1     Running   0          3m5sweb-65b7447c7-mczxb   1/1     Running   0          3m5sweb-65b7447c7-nxz2h   1/1     Running   0          3m5sweb-65b7447c7-r6p75   1/1     Running   0          3m5sweb-65b7447c7-vx6mv   1/1     Running   0          3m5sweb-65b7447c7-vzt7s   1/1     Running   0          3m5s


作者:1763392456

出处:https://www.cnblogs.com/cnoneblog/p/14322502.html


上一篇: 警惕“匿名社交”的潜在风险 下一篇:十分钟助你通气血,每天1次,腰不酸背不痛,肝肾都好了!(动图指导)
返回顶部