技术进阶:Kubernetes高级架构与应用状态部署

时间:2023-02-25 17:40:40

在了解Kubernetes应用状态部署前,我们先看看Kubernetes的高级架构,方便更好的理解Kubernetes的状态。

Kubernetes 的高级架构

包括应用程序部署模型,服务发现和负载均衡,内部/外部路由分离、persistentvolume 的使用,部署节点守护程序,部署有状态分布式系统,作业后台运行,部署数据库,配置管理,凭证管理,滚动更新,自动缩放和包管理。
A、Kubernetes的基本设计策略之一就是,无需更改应用程序代码,就能部署在虚拟机上运行的现有应用程序。另外,任何运行在虚拟机上的应用程序都可以通过容器化组件在 Kubernetes 上实现部署。这是通过容器分组、容器编排、覆盖网络、基于第 4 层虚拟IP、服务发现、支持守护程序运行、部署有状态应用程序组件、以及扩展容器编排系统这些核心功能实现的。
B、Kubernetes 可以提供一组可动态扩展的主机,可以应用容器运行 workload,并使用一组称为 master 的管理主机来提供管理整个容器基础架构的 API。这些 workload 包括长期运行服务,批处理作业和容器主机的守护程序。为了提供容器到容器的路由,所有容器主机都用覆盖网络连接在一起。部署在 Kubernetes 上的应用程序在集群网络中是动态可见的,并可通过传统负载均衡器向外部网络暴露。集群管理器的状态存储在一个高度分布的 key/value 存储(etcd)中,该存储在 master上运行。

Kubernetes应用状态部署
在K8s运行的服务,分为无状态服务和有状态服务,下面分别看看K8s是如何运行这两类不同的服务的

01“无状态”服务

无状态服务,即 Web 服务器、代理和应用程序代码这样的应用程序,它们可以处理数据但不进行存储。编排过程中,开发者比较喜欢使用它们,因为它们易于部署且易于扩展。如果流量上升,则只需添加更多的负载平衡。更重要的是,它们是“不变动的”;上游容器镜像和基础架构中正在运行的容器其实几乎没有区别。这意味着它们可以随时被替代,而且容器实例切换过程中几乎不需要耗费“切换成本”。
无状态服务,K8s使用Replicaset来保证一个服务的实例数量,如果说某个Pod实例由于某个原因被crash了,RC会立即用一个Pod的模板新启一个Pod来替代它,由于是无状态的服务,新启的Pod与原来健康状态下的Pod是一模一样。当Pod被重建后它的IP地址可能发生变化,为了对外提供一个稳定的访问接口,K8s引入了Service的概念,一个Service后面可以挂多个Pod,实现服务的高可用。
在Kubernetes中,Deployment和Replicasets都是运用无状态服务的有效手段。

02"有状态"服务

有状态的服务,即路由器、CDN(内容传送网络)、streaming 服务器和认证服务器。从部署开始,这些容器就开始与上游镜像不同了,时间越长它们的差异越大。这种差异就被称为“state(状态)”。事实上,每个运行的应用程序都至少有一个小状态(差异),但对于“无状态”应用程序来说,状态(差异)很小,而且可以进行快速替换。
普通有状态服务,和无状态服务相比,它多了状态保存的需求,K8s提供了以Volmume和Peristent Volmume为基础的存储系统,可以实现服务的状态保存。
而在容器化应用程序最困难的任务之一,就是设计有状态分布式组件的部署体系结构。由于无状态组件可能没有预定义的启动顺序、集群要求、点对点 TCP 连接、唯一的网络标识符、正常的启动和终止要求等,因此可以很容易地进行容器化。诸如数据库,大数据分析系统,分布式 key/value 存储和 message brokers 可能有复杂的分布式体系结构,都可能用到上述功能。
Kubernetes 引入了 StatefulSets 资源来支持这种复杂的需求,用来管理POD部署和扩容,并为这些pod提供顺序和唯一性的保证。

03 StatefulSet部署—有状态应用

用于解决各个pod实例独立生命周期管理,提供各个实例的启动顺序和唯一性。
使用StatefulSet的前提是:
1、Kubernetes集群的版本≥1.5;
2、安装好DNS集群插件,版本≥15。

StatefulSet为什么适合有状态的程序,看看它的特性:

A、稳定,唯一的网络标识符。可以发现集群内部的其他成员。
B、稳定的持久化存储。通过Kubernetes的PV/PVC或者外部存储(预先提供)来实现。
C、启动或关闭时有序。有序的,优雅的部署和扩展。有序,优雅的删除和终止。有序的自动滚动更新。实现部署和扩容保证。

04运用StatefulSet会带来什么好处呢?
部署和扩容的保证
对于带有N个副本集的StatefulSet,当pod被部署,它们将按0到N-1的顺序被创建。
当一Pod被删除时,它们将按照N-1到0的顺序被终止。
在进行Pod扩容前,所有依赖的Pod应该都已在运行和准备好。
在Pod被终止前,所有的依赖它的Pod都必须完全停止。

如果你的系统是微服务构成的生态系统,就会比较繁琐的交付新服务,如果更近一步,服务是有状态的,那么kubernetes的自动化和健壮性特性会对你有很大的帮助,StatefulSet的目的就是给众多的有状态负载提供正确的控制器支持。

技术进阶:Kubernetes高级架构与应用状态部署的更多相关文章

  1. 技术抄录_Java高级架构师教程

    1.B2C商城项目实战     2.高性能架构专题     3.架构筑基与开源框架解析专题     4.团队协作开发专题     5.微服务架构专题     6.设计模式     附上[架构资料]   ...

  2. Android高级架构进阶之数据传输与序列化

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680本篇文章将从以下几个内容来阐述数据传输与序列化: [Serializable原理] ...

  3. PHP高级架构技术年度大盘点

    2015年1月的最后一个周末,上海的冬季虽不如北方的雪窖冰天,但腊月的寒风也足以让人猫 在家中不愿出门.可是,在华美达酒店的一个会议室中,却人声鼎沸.春意融融,第三期商派技术沙龙正在火热进行,本期沙龙 ...

  4. Kubernetes系列02—Kubernetes设计架构和设计理念

    本文收录在容器技术学习系列文章总目录 1.Kubernetes设计架构 Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分 ...

  5. 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  6. 浅谈Kubernetes生产架构

    注意本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计和实现方案的总结,内容很粗糙,同时也会不断完善. 首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境.如下 ...

  7. 转://Oracle 高可用技术与云基础架构

    众所周知Oracle云基础架构已经在越来越多的行业里应用.大家了解云基础架构是如何演进的嘛?可能有人会说Oracle高可用技术是组成云架构的基础,那它们的关系是怎么样的?大家又了解Oracle高可用技 ...

  8. 了解Kubernetes主体架构(二十八)

    前言 Kubernetes的教程一直在编写,目前已经初步完成了以下内容: 1)基础理论 2)使用Minikube部署本地Kubernetes集群 3)使用Kubeadm创建集群 接下来还会逐步完善本教 ...

  9. Kubernetes生产架构浅谈

    注意 本文,只是笔者针对Kubernetes生产环境运行的一些关于架构设计介绍. 介绍 基于 Kubernetes 系统构建的统一开发运维管控平台.在 Kubernetes 基础上,围绕 微服务系统的 ...

随机推荐

  1. Python监控网站接口值

    Python监控网站接口值: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__ = 'liudong' import urllib,sy ...

  2. C# Web中Session的使用

    1. 关于使用之前要注意的: 在使用session之前,一定要注意继承自System.Web.UI.Page,或在使用session时加上System.Web.HttpContext.Current: ...

  3. autoresizing代码实现

    主要解决父子控件之间的布局关系: /*     Flexible 灵活的,*的          typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) ...

  4. 5.4const对象

    常成员函数 一个const对象可以调用const函数,但不能调用非const成员函数.必须将关键字const放在函数参数表之后,才能说明该函数是一个const成员函数. 声明常成员函数的格式如下: 类 ...

  5. java--多线程之前台幕后

    前台程序是相对于后台程序来说的,那么什么是后台程序呢? [后台程序]就是在启动了start()之前,调用了setDaemon(true)方法,这个线程就变成了后台.如果一个进程中只用后台线程在运行,那 ...

  6. python web -- django

    一. 安装 django $ pip install django (env)$ python >> import django >> django.VERSION >& ...

  7. bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  8. 结对编程1----基于java的四则运算生成器

    小组成员:王震(201421123054).王杰(201421123055) Coding地址:https://git.coding.net/a506504661/sssss.git 一.题目描述 我 ...

  9. href的理解

    您搜索的项目暂未上线,可直接<a style="color: #ff0000;" onclick="onlineTalk();" href="j ...

  10. idea中创建多module的maven工程

    以前自学Java web的时候,我们都是创建一个web工程,该工程下面再创建dao.service.controller等包.自从工作以后,我们会发现现在的web项目包含多个module,contro ...