k8s pod部署到不同node_应用部署演进(二)
前言
鸽了一个多月,更文虽迟但到
近两个月的打工人时光,让人变秃了,也变鸽了(试图解释)
以及忙着忙着,就模糊了工作和个人生活的界限,不似996,胜似996,有点心累,希望接下来能好好调整
话不多说,进入正题
容器编排
容器本身没有价值,有价值的是“容器编排”
容器编排简介
容器编排,就是对容器的管理,包括:
应用部署:将应用装进容器,部署到某一物理节点上
水平扩展:可动态调整容器副本数量,业务请求压力大的时候,就可以多开几个应用副本来处理
服务发现:一个应用对应一种服务,当你把应用跑起来后,容器编排工具就能发现这一服务,这样其他服务就可以调用当前服务了
负载均衡:容器编排工具能将请求调度到一个服务的不同容器副本上,从而降低各容器的压力
故障自愈:物理节点宕机后,其上的容器会重新部署到另一个节点
滚动更新:对一个服务对应的全部应用进行批量更新
版本回退:可以回退应用版本
目前比较主流的容器编排工具之一就是k8s
k8s简介
k8s
,全称为Kubernetes
,K8s是谷歌和redhat主导开发的容器编排工具。
Kubernetes
这个单词源于希腊语,译为“舵手”
下图是个形象的比喻,将k8s类比成舵手,统筹调度着船上的一个个集装箱(容器
):
K8s架构
简单来说就是:master节点管理node节点,node节点上跑着容器
用户通过UI界面或者CLI(命令行)与master节点交互
而不同节点上跑着不同的k8s组件
K8s组件
Master节点上的组件:
API server:顾名思义,包括了k8s所有的api,是集群的统一入口。Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;
scheduler:调度器,当你用k8s跑一个应用时,它会根据应用对 CPU、memory 的请求大小,找一台合适的节点,进行放置
etcd:存储系统,保存集群的数据。比如容器部署到了哪些节点上、容器的信息等等
controller:控制器,可以用来控制应用的副本数量,实现了服务编排里说的故障自愈和水平伸缩的功能
Node节点上的组件:
kubelet:用来管理Node节点,可以理解为master节点派到Node节点的代表
kube-proxy:提供网络代理,提供负载均衡等功能
docker:运行容器
部署应用的过程分解
用户可以通过 UI 或者 CLI 提交一个 Pod(简单说就是一组容器,后边会介绍) 给 Kubernetes 进行部署
这个 Pod 请求首先会提交给 Kubernetes API Server
下一步 API Server 会把这个信息写入到它的存储系统 etcd
之后 Scheduler 会通过 API Server 的 watch 或者叫做 notification 机制得到这个信息:有一个 Pod 需要被调度。
这个时候 Scheduler 会根据Pod对硬件的要进行一次调度(选出一个合适的节点),在完成这次调度之后,它会向 API Server 反馈 说:“OK!这个 Pod 需要被调度到xx节点上。”
这个时候 API Server 接收到这次操作之后,会把这次的结果再次写到 etcd 中
然后 API Server 会通知相应的节点进行这次 Pod 真正的执行启动
相应节点的 kubelet 会得到这个通知
kubelet 就会去调 Container runtime 来真正去启动配置这个容器和这个容器的运行环境,去调度 Storage Plugin 来去配置存储,network Plugin 去配置网络
Pod
Pod,是一组容器。
这一组容器装在一个叫infra的容器里(俄罗斯套娃),共享同一个 Network Namespace,可以共享同一个Volume(可简单理解为一个文件夹)。
为什么pod要设计成为一组容器呢?其实这个概念是类比进程和进程组的关系。
上一篇文章已经说过,一个容器里边一般只跑一个进程,即应用进程;那么一个pod对应一组容器,自然也就对应一个进程组
Google 公司的工程师们发现,他们部署的应用,往往都存在着类似于“进程和进程组”的关系。更具体地说,就是这些应用之间有着密切的协作关系,使得它们必须部署在同一台机器上。
因此,Pod是 k8s项目中的最小编排单位。
Deployment和Service
在k8s中,我们对一组pod的部署对应着一个Deployment
,可以用一个yaml文件来描述:
通过kubectl apply -f xxx.yaml
启动deployment,从而来保证pod副本数稳定
一组pod跑起来自然是要对外提供服务的,k8s对此也做了抽象,用一个yaml文件描述Service
,eg:
apiVersion: v1kind: Servicemetadata: name: demo #服务名 namespace: default labels: app: demospec: ports: - port: 80 targetPort: http protocol: TCP name: http selector: app: demo version: v1 ......
这些yaml文件也被称为资源清单文件
,描述的对象被称为资源
,比如Deployment
、Service
,每个资源可以设置对应的label
和selector
通过给selector去选择不同的label,来建立deployment和pod、service与deployment的映射关系
蓝绿部署
场景:
版本更新不允许两个版本代码同时运行。
方法:
启动一个新的Deployment,给这个deployment一个新的标签
配置service的selector(service原先选择老的deployment的标签,后来改成选择新deployment的标签),将流量导向新的Deployment
之前的service.yaml
:
apiVersion: v1kind: Servicemetadata: name: demo #服务名 namespace: default labels: app: demospec: ports: - port: 80 targetPort: http protocol: TCP name: http # 当前匹配的是app=demo,version=v1的deployment,切换服务对应的deployment时,我们改变selector的version值 selector: app: demo version: v1
v1-deployment.yaml
:
apiVersion: apps/v1kind: Deploymentmetadata: name: demo1-deployment namespace: default labels: app: demo version: v1 #deployment的版本:v1........
v2-deployment.yaml
:
apiVersion: apps/v1kind: Deploymentmetadata: name: demo1-deployment namespace: default labels: app: demo version: v2 #deployment的版本:v2........
通过命令启动service和两个deployment:
kubectl apply -f service.yaml -f v1-deployment.yaml -f v2-deployment.yaml
动态修改service的标签选择器,实现流量从v1版本应用切到v2版本应用
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'
k8s pod部署到不同node_应用部署演进(二)相关推荐
- k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus
最近闲了点,写个大活:部署Dotnet应用到K8s. 写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在. 这个主题,会是一个系列.在这个系列中, ...
- 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查
k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...
- k8s(Kubernetes)实战(一)之部署etcd与flannel
k8s合集:(前两章为k8s二进制安装方法,十分复杂,推荐从第三章开始) k8s(Kubernetes)实战(一)之部署etcd与flannel k8s(Kubernetes)实战(二)之部署api- ...
- K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍
Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...
- 我的k8s随笔:Kubernetes 1.17.0 部署
k8s集群部署过程实践笔记共两种版本:一为专注部署操作,一为涉及部署操作讲解.本文为前者. 本文介绍了如何在两台 ubuntu 16.04 64 bit 双核 CPU 虚拟机上使用 kubeadm 部 ...
- 云计算虚拟化:k8s二进制Master主备集群部署
一. 前言 无论从成本还是效率上考虑,k8s都极占优势,基本代表了未来趋势,官网推荐kubeadm配置,虽然方便,但掩盖了许多细节问题:k8s虽然咋看仅仅是个容器编排工具,但涉及的相关知识面非常广泛, ...
- k8s集群监控cadvisor+prometheus+grafana部署
目录 1.新建命名空间monitor 2.部署 2.1部署cadvisor 2.2部署node_exporter 2.3部署prometheus 2.4部署rbac权限 2.5.部署 metrics ...
- 基于K8s的CI/CD自动化持续集成部署框架
文章目录 什么是CI/CD? 1 环境准备 2 组件部署 2.1 jenkins快速部署 2.2 gitlab快速部署 2.3 harbor快速部署 3 CI/CD交付 什么是CI/CD? CI/CD ...
- K8S实战:Centos7上集群部署
K8S实战:Centos7上集群部署 更多技术类博文,请关注微信公众号:运维之美. 集群架构 k8s集群的架构 master节点:etcd,api-server,scheduler,controlle ...
- 使用Kubeadm部署K8S单节点,速度快于二进制部署
使用Kubeadmin部署K8S单节点,速度快于二进制部署 一. 环境准备 二.所有节点安装docker 三.所有节点安装kubeadm,kubelet和kubectl 四.部署K8S集群 五.安装d ...
最新文章
- 火灾检测、人流量统计… 这个开源项目太香了!
- php接收流文件,PHP传输文件流及文件流的保存
- 小白webpack进行nodejs 前端打包配置
- Concurrent集合 Atomic类
- ATC计算机会议,三项成果被计算机系统重要国际会议USENIX ATC和HotStorage收录
- Spark _27_自定义函数UDF和UDAF
- How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)
- 菜鸟进阶必修课-主板插线小百科(图)
- 文档丨Oracle 20c 概念手册
- 云存储服务器销售,云存储服务器销售
- 中国松紧带市场趋势报告、技术动态创新及市场预测
- 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型
- crontab使用环境变量
- dialogArguments的用法
- 什么是激光导航扫地机器人?
- 【金曲榜】————1、《修炼爱情》(林俊杰)
- 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表
- 【Java 8 新特性】Java 8 Collectors:reducing 示例(List分组取最值)
- 谷歌翻译器-在线实时批量谷歌翻译器
- java开发有必要刷leetcode吗_刷 leetcode 需要哪些基础?
热门文章
- 二、npm scripts
- C语言中浮点数在内存中的存储方式
- 二十、oracle pl/sql基础
- @Autowired注解位置、@Autowired与@Resource的区别与注入流程
- 服务器上多个php,php – 在多个服务器上扩展cronjobs
- ue4是什么意思_UE4 C++基础教程 - 资源常见名词解释
- Java 注解(Java Annotation)
- 线程池Executor框架解读
- jquery中ajax的使用例子($.ajax())
- python+selenium环境配置(windows7环境)