1.Kubernetes的controller pattern

需要认识到Kubernetes操作Pod的逻辑,都是由控制器来完成的。

查看之前写过的nginx-deployment的YAML文件
[root@kubernetes01 ~]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8.1
ports:
- containerPort: 80 Kubernetes中的kube-controller-manager组件执行了上面的Deployment定义的编排动作。
Deployment定义的template字段,这种字段在Kubernetes中叫做PodTemplate(Pod模版)。
而这个YAML文件描述的就是Deployment这样一个控制器,template以上的部分是对控制器的定义,template以下的部分属于对被控制的对象的定义。

2.Kubernetes Pod 的自动伸缩

Pod水平扩展和水平收缩的能力依赖于Kubernetes中一个非常重要的API对象,ReplicaSet也就是副本集。

2.1.Pod的水平扩展和伸缩

查看例子的YAML文件
[root@kubernetes01 ~]# cat nginx-replicaset.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8.0
上面这个例子中,ReplicaSet对象是由一个Pod模版和副本数目的多少定义组成的。 再看这个YAML文件
[root@kubernetes01 ~]# cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8.1
ports:
- containerPort: 80
Deployment控制器实际操作的是ReplicaSet对象,而不是Pod对象。
这个定义replicas=3的Deployment与他的ReplicaSet以及Pod的关系可以理解成是一种分层控制层层控制的关系,replicas的值决定是扩展还是收缩,当你去扩展或是收缩的时候还伴随着滚动更新。

2.2.Pod的滚动更新

1.首先修改镜像版本
kubectl edit deployment/nginx-deployment
spec:
containers:
- image: nginx:1.9.1
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
这块儿直接把image中nginx的版本改成了1.9.1然后保存退出,文件有了新的变动会触发更新。 2.查看滚动更新的效果
[root@kubernetes01 ~]# kubectl describe deployment nginx-deployment | tail -n 10
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set nginx-deployment-7f987f7889 to 3
Normal ScalingReplicaSet 8m55s deployment-controller Scaled up replica set nginx-deployment-6987cdb55b to 1
Normal ScalingReplicaSet 8m54s deployment-controller Scaled down replica set nginx-deployment-7f987f7889 to 2
Normal ScalingReplicaSet 8m54s deployment-controller Scaled up replica set nginx-deployment-6987cdb55b to 2
Normal ScalingReplicaSet 8m33s deployment-controller Scaled down replica set nginx-deployment-7f987f7889 to 1
Normal ScalingReplicaSet 8m33s deployment-controller Scaled up replica set nginx-deployment-6987cdb55b to 3
Normal ScalingReplicaSet 8m12s deployment-controller Scaled down replica set nginx-deployment-7f987f7889 to 0
首先通过Events输出的内容我们可以看到这个deployment滚动更新的Message。 [root@kubernetes01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5c689d88bb 0 0 0 14d
nginx-deployment-5cd6d46846 0 0 0 14d
nginx-deployment-67d57d6df9 0 0 0 9d
nginx-deployment-6987cdb55b 3 3 3 10m
nginx-deployment-7f987f7889 0 0 0 9d
nginx-replicaset 0 0 0 37m
然后查看这个Deployment控制的ReplicaSet的最终状态,这里等待了一会儿所以已经是最终的状态了,配合前边Events的信息,nginx-deployment-6987cdb55b up to 1,旧的nginx-deployment-7f987f7889 down to 2,通过交替的逐一的升级和降级“滚动更新”,最终
nginx-deployment-6987cdb55b 的DESIRED,CURRENT,READY都变成了期望值3! 状态字段的含义:
DESIRED:用户期望的Pod副本个数
CURRENT:当前处于Running状态的Pod的个数
UP-TO-DATE:当前处于最新版本的Pod的个数
READY:处于健康检查正确状态的Pod的个数,Running状态的新版本 我们还可以通过 kubectl rollout status deployment/nginx-deployment这条命令实时的查看Deployment对象的状态变化。应用的版本和ReplicaSet是一一对应的,这也是Kubernetes实现对多个应用版本描述的设计思想。

3.Kubernetes Deployment对应用的版本控制

1.首先通过命令直接这个Deployment的镜像修改成错误的
[root@kubernetes01 ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.99
deployment.extensions/nginx-deployment image updated 2.查看Deployment的状态
[root@kubernetes01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5476c5bdd 1 1 0 12s
nginx-deployment-5c689d88bb 0 0 0 15d
nginx-deployment-5cd6d46846 0 0 0 14d
nginx-deployment-67d57d6df9 0 0 0 10d
nginx-deployment-6987cdb55b 3 3 3 46m
nginx-deployment-7f987f7889 0 0 0 10d
nginx-replicaset 0 0 0 73m
nginx-staticwebsite-648bc64544 2 2 2 9d
nginx-staticwebsite-8479f8997f 0 0 0 9d
tomcat-deployment-001-84d957dc97 2 2 2 6d1h
tomcat-test-6cc4d85cf6 2 2 2 6d18h
可以看到nginx-deployment-5476c5bdd这个有问题的Deployment的状态。 3.回退到上个版本
[root@kubernetes01 ~]# kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment 4.回退之后查看Deployment的状态
[root@kubernetes01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5476c5bdd 0 0 0 90s
nginx-deployment-5c689d88bb 0 0 0 15d
nginx-deployment-5cd6d46846 0 0 0 14d
nginx-deployment-67d57d6df9 0 0 0 10d
nginx-deployment-6987cdb55b 3 3 3 47m
nginx-deployment-7f987f7889 0 0 0 10d
nginx-replicaset 0 0 0 74m
nginx-staticwebsite-648bc64544 2 2 2 9d
nginx-staticwebsite-8479f8997f 0 0 0 9d
tomcat-deployment-001-84d957dc97 2 2 2 6d1h
tomcat-test-6cc4d85cf6 2 2 2 6d18h 5.查看这个Deployment的历史版本记录
[root@kubernetes01 ~]# kubectl rollout history deployment/nginx-deployment
deployment.extensions/nginx-deployment
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 <none>
4 <none>
6 <none>
7 <none> 6.查看第一个版本的信息
[root@kubernetes01 ~]# kubectl rollout history deployment/nginx-deployment --revision=1
deployment.extensions/nginx-deployment with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=5c689d88bb
Containers:
nginx:
Image: nginx:1.7.9
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none> 7.切换到第一个版本
[root@kubernetes01 ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=1
deployment.extensions/nginx-deployment 8.查看Deployment的状态
[root@kubernetes01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-5476c5bdd 0 0 0 19m
nginx-deployment-5c689d88bb 3 3 3 15d
nginx-deployment-5cd6d46846 0 0 0 14d
nginx-deployment-67d57d6df9 0 0 0 10d
nginx-deployment-6987cdb55b 0 0 0 65m
nginx-deployment-7f987f7889 0 0 0 10d
nginx-replicaset 0 0 0 92m
nginx-staticwebsite-648bc64544 2 2 2 9d
nginx-staticwebsite-8479f8997f 0 0 0 9d
tomcat-deployment-001-84d957dc97 2 2 2 6d1h
tomcat-test-6cc4d85cf6 2 2 2 6d18h
这块儿可以看到副本集nginx-deployment-5c689d88bb已经变成了我们期望的状态。

4.总结



PS:文中服务器使用的是国内某☁️的机器

欢迎大家留言讨论哦,欢迎大家和我一起学习Kubernetes~~~

Kubernetes探索学习005--Kubernetes的Controller模型和ReplicaSet伸缩的更多相关文章

  1. Kubernetes探索学习004--深入Kubernetes的Pod

    深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...

  2. Kubernetes探索学习001--Centos7.6使用kubeadm快速部署Kubernetes集群

    Centos7.6使用kubeadm快速部署kubernetes集群 为什么要使用kubeadm来部署kubernetes?因为kubeadm是kubernetes原生的部署工具,简单快捷方便,便于新 ...

  3. Kubernetes探索学习003--关于Kubernetes的Pod

    关于Pod 关于Pod我们要慢慢去体会去接受它去使用它,尤其是运维人员这块需要从逻辑上形成认识,首先理解Pod是Kubernetes项目的原子调度单位.为什么是Pod而不是单个DockerContai ...

  4. Kubernetes探索学习002--Kubernetes的基本使用

    Kubernetes 的基本使用方法 原则:使用YAML文件描述你要部署的API对象! 以部署nginx静态站点为例,具体操作及内容如下 1.编写YAML文件 [root@kubernetes01 ~ ...

  5. C++学习(10)—— 对象模型和this指针

    1. 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 空对象占用内存空间为1 C++编译器会给每个空对象也分配一个字节空间,是为了区分空对 ...

  6. Linux学习-LVS跨网段DR模型和FWM多服务绑定

    一.实验环境 系统:CentOS7.6 主机:5台 (虚拟机) 客户端1台:172.16.236.134/24 (NAT网卡),网关指向 172.16.236.185/24(路由服务器) 路由服务器1 ...

  7. kubernetes学习01—kubernetes介绍

    本文收录在容器技术学习系列文章总目录 一.简介 1.Kubernetes代码托管在GitHub上:https://github.com/kubernetes/kubernetes/. 2.Kubern ...

  8. kubernetes 入门学习

    kubernetes 学习 kubernetes 简介 Kubernetes这个名字源自希腊语,意思是"舵手",也是"管理者","治理者"等 ...

  9. Kubernetes 学习15 kubernetes 认证及serviceaccount

    一.概述 1.通过此前描述可以知道k8s是以后运行我们生产环境中重要应用程序的尤其是无状态程序的一个非常重要的平台.这里面能托管一些核心应用以及核心数据,很显然对于k8s对应接口的访问不是任何人都可以 ...

随机推荐

  1. 记一次ajax交互问题

    问题描述:仍然在表单中,像往常一样,异步获取表单内所有输入框的信息,点击提交,确实也走了后台,但是结果却走了ajax的error.这一点使我当时非常疑惑,为什么会走error呢? 一般走error的原 ...

  2. 多线程之Timer和TimerTask

    Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask.TimerTask是一个抽象类,实现了Runnabl ...

  3. Service通信

    1.简介 Service通信是双向的, 它不仅可以发送消息, 同时还会有反馈. 所以service包括两部分, 一部分是请求方( Clinet) , 另一部分是应答方/服务提供方( Server) . ...

  4. Spring源码分析(二十二)功能扩展

    摘要: 本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.增加SPEL语言的支持 二.增加属性注册编辑器 1. 使用自 ...

  5. Spring源码分析(十八)创建bean

    本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 目录 一.创建bean的实例 1. autowireConstructor 2 ...

  6. 443 D. Teams Formation

    http://codeforces.com/contest/879/problem/D This time the Berland Team Olympiad in Informatics is he ...

  7. sudo 其他用户执行命令

    sudo -E -u clouder /home/clouder/vs/program/chatserver/bin/startup.sh -E 加载用户环境变量

  8. 你都用python来做什么?

    首页发现话题   提问     你都用 Python 来做什么? 关注问题写回答     编程语言 Python 编程 Python 入门 Python 开发 你都用 Python 来做什么? 发现很 ...

  9. fio是如何运行的?

    本文主要介绍fio是如何运行的,并且以单线程.单job为例 fio的入口在fio.c中的main函数,下面列出了main函数,此处只出示了一些调用的关键函数 int main(int argc, ch ...

  10. DQL-联合查询

    一.含义union:合并.联合,将多次查询结果合并成一个结果二.语法查询语句1union [all]查询语句2union [all]... 三.意义1.将一条比较复杂的查询语句拆分成多条语句2.适用于 ...