5分钟让你理解K8S必备架构概念,以及网络模型(中)
写在前面
在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送【导图】拿下载链接, 已经完善更新):
前言
在上一篇文章中介绍了K8S的基础架构流程,以及核心的组件;这篇文章继续K8S的相关的概念。
上篇介绍到了NodePort Service解决了外部请求K8S内部的应用的问题。下面我们看看如何搭建应用服务集群的?
应用集群
在传统应用中,我们一般利用nginx反向代理,通过配置域名指向多个IP地址,从而实现了应用的集群。如果需要增加应用或减少应用,都需要调整nginx的配置;还是相当繁琐的。
那K8S是如何实现应用集群的呢?
副本集ReplicaSet
上一篇文章中介绍了利用NodePort Service 的Selector 选择Label标签,路由到后端的其中一个Pod。
上图中由3个Pod组成的应用集群,那如何保证Pod集群的高可用呢?如果其中一个Pod挂了,被删除了,K8S会怎么处理?
K8S有个Replica Set组件,从字面上面来看就是副本集意思;它的作用就是用来保证Pod的高可用,如果我们在Replica Set中定义了应用数量为3,那么它会保证应用数量;即使一个pod挂了,它会自动会启动1个,始终保证pod应用数量为3。
编写yaml
apiVersion: extensions/v1beta1 #指定api版本
kind: ReplicaSet #指定创建资源的角色/类型
metadata:
name: mc-user
spec:
replicas: 3 #副本集数量
template: #pod模板
metadata: #资源的元数据/属性
labels: #标签定义
app: mc-user #标签值
spec: # 指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像
上面就是定义了 mc-user的pod,副本集数始终为3。Service的yaml和之前一样,注意Selector的Label,可提供给外部访问端口31001
apiVersion: v1
kind: Service
metadata:
name: mc-user
spec:
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 31001
selector:
app: mc-user
type: NodePort
执行kubectl apply -f 命令,启动ReplicaSet和Service
我们可以试着查看启动的3个pod,并选择其中一个pod将它删除。
# kubectl get all
# kubectl delete po mc-user-6adfw
我们再查看pod
kubectl get all
还是有3个pod,可以看出即使删除了一个pod;ReplicaSet会又帮我们启动了一个pod。
这个就是ReplicaSet的自愈能力,自我恢复能力。
滚动发布Rolling Update
我们先来谈谈什么是滚动发布?滚动发布是一种高级发布策略,按批次依次替换老版本,逐步升级到新版本。发布过程中,应用不中断,用户体验平滑。
现在Pod中是V1的版本,现在我们想升级到V2版本,整个流程是什么样子呢?
先删除其中一个V1的pod
然后发布V2的Pod
再删除一个V1的pod
再启动一个V2的Pod
再删除最后一个V1的pod
最终升级完成。
我们可以发现滚动发布的特点,就是老版本和新版本会共存一段时间。所以此种发布方式适用版本兼容的应用。也可以支持滚动回退。我们来看看和蓝绿发布的区别
滚动发布抽象Deployment
之前介绍的ReplicaSet 其实是对Pod的一次包装,Deployment又在基础上面对ReplicaSet的又一次包装。
注意点:ReplicaSet 和 Deployment是一个软件概念,它是没有具体的组件的;是抽象出来的名词,方便大家理解
上图就是描述了deployment滚动发布的架构;Deployment的滚动发布,对用户请求以及Service是透明的,无感知。
Deployment的yaml
apiVersion: apps/v1 #指定api版本,此值必须在kubectl apiversion中
kind: Deployment #指定创建资源的角色/类型
metadata:
name: mc-user
spec:
selector: #此deployment选择哪个标签进行滚动的发布
matchLabels: #滚动发布pod的标签,要跟下面template中的labels一致
app: mc-user
minReadySeconds: 10 #最小10s等待就绪时间,可以方便看到滚动发布流程
replicas: 3 #副本集数量
template: #pod模板
metadata: #资源的元数据/属性
labels: #标签定义
app: mc-user #标签值
spec: #指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像
上面的yaml和ReplicaSet很类似,需要注意的
selector: #此deployment选择哪个标签进行滚动的发布
matchLabels: #滚动发布pod的标签,要跟下面template中的labels一致
app: mc-user
定义deployment管理哪个标签pod
Service的yaml
Service的yaml没有变化,需要定义selector,选择标签就行了
apiVersion: v1
kind: Service
metadata:
name: mc-user
spec:
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 31000
selector:
app: mc-user
type: NodePort
我们用kubectl apply -f命令执行 deployment和service
我们再用kubectl get all获取运行情况,我们就可以发现有两个类型
deployment.apps/mc-user 以及 replicaset.apps/mc-user-4345afaa
要升级的时候,只需要更改deployment中的image名称,再执行apply
image: rainbow/mc-user:1.1.RELEASE #容器镜像
我们用kubectl get all查看,就会发现replicaset 有2个;一个是老版本的,一个是新版本的。 老版本的pod数逐渐减少,新版本的pod数量逐渐增加,一直到新版本为3,老版本为0。
回退版本
如果发现版本有问题,我们可以回退版本,可以使用下面命令
kubectl rollout undo deployment/mc-user
这个我们就回退到V1.0的老版本了。
ConfigMap配置
在我们日常业务过程中,需要会配置一些配置参数,如:一次性的静态配置(数据库连接字符串,用户名,密码),以及可以运行过程中的动态配置(如:限购数量)等;那K8S中的Pod如何获得外部的配置信息呢?
上图中,K8S提供了ConfigMap这个功能,提供用户在外部进行配置,然后K8S把ConfigMap以环境变量的方式提供给Pod中的容器或者也可以通过Volume文件持久化的方式提供给Pod容器。
共享配置
因为我们会有很多服务的配置是相同的,那实现微服务之间共享一份配置信息,如下图
一份ConfigMap可以提供给多个服务使用,ConfigMap会把配置信息以env方式存在于每个服务的环境变量中。
ConfigMap的yaml
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: ConfigMap #指定创建资源的角色/类型
metadata:
name: mc-user-config
data: #定义配置信息
DATASOURCE_URL: jdbc:mysql://mysql/mc-user
DATASOURCE_USERNAME: root
DATASOURCE_PASSWORD: 123456
修改Deployment配置文件
增加envFrom属性
apiVersion: apps/v1 #指定api版本,此值必须在kubectl apiversion中
kind: Deployment #指定创建资源的角色/类型
metadata:
name: mc-user
spec:
selector: #此deployment选择哪个标签进行滚动的发布
matchLabels: #滚动发布pod的标签,要跟下面template中的labels一致
app: mc-user
minReadySeconds: 10 #最小10s等待就绪时间,可以方便看到滚动发布流程
replicas: 3 #副本集数量
template: #pod模板
metadata: #资源的元数据/属性
labels: #标签定义
app: mc-user #标签值
spec: #指定该资源的内容
containers: #容器定义
- name: mc-user #容器的名字
image: rainbow/mc-user:1.0.RELEASE #容器镜像
envFrom: #环境变量来源
- configMapRef: #容器应用的configmap引用
name: mc-user-config #configMap的名称
envFrom中的configMapRef配置引用名称;这样我们就可以在pod容器中获取到configmap的配置信息了。我们可以用
kubectl exec mc-user-34wrwq-3423 printenv | grep DATASOURCE_NAME
获得pod容器中的环境变量。
configMap变更
如果服务已经运行中,我们更新了ConfigMap的配置信息,那么POD中的容器会即时获得新的配置信息吗?
很不幸,更新了configMap;再用kubectl apply -f 重新发布configmap;之前的pod容器是不会获得最新的配置信息的。
那如何让pod容器用最新的ConfigMap配置值呢?我们可以删除pod,因为replicaset会保证pod数量,会自动重启,那新的pod就会应用新的配置信息了。
总结
今天介绍K8S的副本集ReplicaSet、滚动发布Deployment、配置ConfigMap的概念;下一篇会介绍网络相关的模型。谢谢!!!
看完三件事️
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注公众号 『 阿风的架构笔记 』,不定期分享原创知识。
- 同时可以期待后续文章ing
- 关注后回复【666】扫码即可获取架构进阶学习资料包
5分钟让你理解K8S必备架构概念,以及网络模型(中)的更多相关文章
- 5分钟让你理解K8S必备架构概念,以及网络模型(上)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- 5分钟让你理解K8S必备架构概念,以及网络模型(下)
写在前面 在这用XMind画了一张导图记录Redis的学习笔记和一些面试解析(源文件对部分节点有详细备注和参考资料,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图]拿下载链接, 已经完善更新): ...
- 深入理解openstack网络架构(1)
原文地址: https://blogs.oracle.com/ronen/entry/diving_into_openstack_network_architecture 译文转载自:http://b ...
- 理解S12(X)架构中的地址映射方案
目录 1. 介绍 2. CPU 本地地址 3. 分页窗口 4. 内存页 5. 控制各个对象在内存中放置的位置 介绍 在一个S12或S12X架构中,很有必要分清楚两种类型的内存地址:banked和non ...
- [转帖]理解k8s 的 Ingress
理解k8s 的 Ingress https://www.jianshu.com/p/189fab1845c5/ 暴露一个http服务的方式 service 是 k8s 暴露http服务的默认方式, 其 ...
- K8s生产架构
部分图片显示问题,特附上有道云笔记中的链接:http://note.youdao.com/noteshare?id=df78492d2c25383975c67f3eadf0bbd9&sub=4 ...
- 从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations
这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node ...
- 【K8S学习笔记】初识K8S 及架构组件
K8S是什么?发展历史 Kubernetes (简称 k8s)是 Google 在2014年开源的,对容器生命周期管理的开源平台,致力于对容器集群提供易于管理.高可用.弹性负载与故障转移的能力,提高服 ...
- Kubernetes(K8s)基础概念 —— 凿壁偷光
Kubernetes(K8s)基础概念 -- 凿壁偷光 K8s是什么:全称 kubernetes (k12345678s) 作用:用于自动部署,扩展和管理"容器化应用程序"的 ...
随机推荐
- 小白的第一次sql实战
去年发的有一篇sql注入忘记粘贴过来了,今天想起了就fuzz过来一下 有id尝试sql注入 找这种sql注入的站用sql检索就行了,但是最好挂代理用谷歌搜索,百度的话搜sql注入的很多被别人打过了,导 ...
- DNS 缓存中毒--Kaminsky 攻击复现
0x00 搭建实验环境 使用3台Ubuntu 16.04虚拟机,可到下面的参考链接下载 攻击的服务是BIND9,由于条件限制,这里使用本地的一台虚拟机当作远程DNS解析器,关闭了DNSSEC服务,其中 ...
- mybatis-plus的Could not set property 'updateDate' of 'class com.example.pojo.User' with value 'Fri Jul 24 10:29:39 CST 2020' Cause: java.lang.IllegalArgumentException: argument type mismatch解决方案
按照官网在写mybatis-plus的自动填充功能一直报错,发现官网的解说不全,数据库是datetime类型,java程序又是date,类型不匹配 org.mybatis.spring.MyBatis ...
- InfluxDB、Grafana等开源软件的监控后门
在使用手机APP的过程中,用户信息会不知不觉的被APP悄无声息的收集到云端,然后进行各种用户行为分析以及智能推荐,这是众所周知但秘而不宣的事. 在使用开源软件时,也存在悄悄收集用户使用信息,并且上报到 ...
- js--如何实现继承?
前言 学习过 java 的同学应该都知道,常见的继承有接口继承和实现继承,接口继承只需要继承父类的方法签名,实现继承则继承父类的实际的方法,js 中主要依靠原型链来实现继承,无法做接口继承. 学习 j ...
- Redis系列-存储篇list主要操作命令
Redis系列-存储篇list主要操作命令小结 在总结list之前,先要弄明白几个跟list相关的概念: 列表:一个从左到右的队列,个人理解更类似于一个栈,常规模式下,先进列表的元素,后出. 表头元素 ...
- angular+ionic -- 启动命令
初始angular+ionic项目,启动需ionic的启动命令: ionic serve
- BUAA_2021_SE_Case_Analysis
案例分析作业 项目 内容 这个作业属于哪个课程 2021春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 案例分析作业 我在这个课程的目标是 通过课程学习,完成第一个可以称之为"软 ...
- 2. IntelliJ Idea 常用快捷键列表
Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 Ctrl+[ OR ],可以跑到大括号的开头与结尾 Ctrl+F12,可以显示当前文件的结构 ...
- 并发编程之ThreadLocal
并发编程之ThreadLocal 前言 当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这 ...