前言

鸽了一个多月,更文虽迟但到

近两个月的打工人时光,让人变秃了,也变鸽了(试图解释)

以及忙着忙着,就模糊了工作和个人生活的界限,不似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文件也被称为资源清单文件,描述的对象被称为资源,比如DeploymentService,每个资源可以设置对应的labelselector

通过给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_应用部署演进(二)相关推荐

  1. k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus

    最近闲了点,写个大活:部署Dotnet应用到K8s. 写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在. 这个主题,会是一个系列.在这个系列中, ...

  2. 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查

    k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...

  3. k8s(Kubernetes)实战(一)之部署etcd与flannel

    k8s合集:(前两章为k8s二进制安装方法,十分复杂,推荐从第三章开始) k8s(Kubernetes)实战(一)之部署etcd与flannel k8s(Kubernetes)实战(二)之部署api- ...

  4. K8S实战集训第一课 Ansible自动化部署k8s、弹性伸缩、Helm包管理、k8s网络模型介绍

    Ansible自动化部署K8S集群 一.Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部 ...

  5. 我的k8s随笔:Kubernetes 1.17.0 部署

    k8s集群部署过程实践笔记共两种版本:一为专注部署操作,一为涉及部署操作讲解.本文为前者. 本文介绍了如何在两台 ubuntu 16.04 64 bit 双核 CPU 虚拟机上使用 kubeadm 部 ...

  6. 云计算虚拟化:k8s二进制Master主备集群部署

    一. 前言 无论从成本还是效率上考虑,k8s都极占优势,基本代表了未来趋势,官网推荐kubeadm配置,虽然方便,但掩盖了许多细节问题:k8s虽然咋看仅仅是个容器编排工具,但涉及的相关知识面非常广泛, ...

  7. k8s集群监控cadvisor+prometheus+grafana部署

    目录 1.新建命名空间monitor 2.部署 2.1部署cadvisor 2.2部署node_exporter 2.3部署prometheus 2.4部署rbac权限 2.5.部署 metrics ...

  8. 基于K8s的CI/CD自动化持续集成部署框架

    文章目录 什么是CI/CD? 1 环境准备 2 组件部署 2.1 jenkins快速部署 2.2 gitlab快速部署 2.3 harbor快速部署 3 CI/CD交付 什么是CI/CD? CI/CD ...

  9. K8S实战:Centos7上集群部署

    K8S实战:Centos7上集群部署 更多技术类博文,请关注微信公众号:运维之美. 集群架构 k8s集群的架构 master节点:etcd,api-server,scheduler,controlle ...

  10. 使用Kubeadm部署K8S单节点,速度快于二进制部署

    使用Kubeadmin部署K8S单节点,速度快于二进制部署 一. 环境准备 二.所有节点安装docker 三.所有节点安装kubeadm,kubelet和kubectl 四.部署K8S集群 五.安装d ...

最新文章

  1. 火灾检测、人流量统计… 这个开源项目太香了!
  2. php接收流文件,PHP传输文件流及文件流的保存
  3. 小白webpack进行nodejs 前端打包配置
  4. Concurrent集合 Atomic类
  5. ATC计算机会议,三项成果被计算机系统重要国际会议USENIX ATC和HotStorage收录
  6. Spark _27_自定义函数UDF和UDAF
  7. How many ways HDU - 1978(记忆化搜索关于求多少种方式模板)
  8. 菜鸟进阶必修课-主板插线小百科(图)
  9. 文档丨Oracle 20c 概念手册
  10. 云存储服务器销售,云存储服务器销售
  11. 中国松紧带市场趋势报告、技术动态创新及市场预测
  12. 直接在安装了redis的Linux机器上操作redis数据存储类型--List类型
  13. crontab使用环境变量
  14. dialogArguments的用法
  15. 什么是激光导航扫地机器人?
  16. 【金曲榜】————1、《修炼爱情》(林俊杰)
  17. 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表
  18. 【Java 8 新特性】Java 8 Collectors:reducing 示例(List分组取最值)
  19. 谷歌翻译器-在线实时批量谷歌翻译器
  20. java开发有必要刷leetcode吗_刷 leetcode 需要哪些基础?

热门文章

  1. 二、npm scripts
  2. C语言中浮点数在内存中的存储方式
  3. 二十、oracle pl/sql基础
  4. @Autowired注解位置、@Autowired与@Resource的区别与注入流程
  5. 服务器上多个php,php – 在多个服务器上扩展cronjobs
  6. ue4是什么意思_UE4 C++基础教程 - 资源常见名词解释
  7. Java 注解(Java Annotation)
  8. 线程池Executor框架解读
  9. jquery中ajax的使用例子($.ajax())
  10. python+selenium环境配置(windows7环境)