Kubernetes 在生产环境中常用架构

首先,我们来梳理下Kubernetes生产架构,其设计适用于绝大多数环境。如下图所示

在该架构中,我们可以将其分为四层,如下:

  • Client层:即Kubernetes集群外部用户、客户端等;

  • 服务访问层:即由Traefik ingress实现服务发现、负载均衡和路由规则定义等;

  • 业务应用层:即基于Kubernetes平台构建和运行企业业务应用,如CI/CD持续集成、微服务项目、监控告警和日志管理、私有镜像仓库等服务;

  • 基础设施层:即由Kubernetes容器管理平台和Ceph数据持久化存储等系统组成的基础设施服务。

下面,我们分别来谈谈各层的具体实现方案。

基础设施层

Kubernetes平台

  • 部署管理:Kubernetes平台除了直接使用公有云如阿里云、AWS等云服务提供商的K8s服务外,我们还可以自己部署和管理等,如使用Kubespray工具。

  • 网络通信:在容器和容器之间、容器和主机网络方面,可以使用Calico或Flannel等方案。

  • HA高可用:Kubernetes节点分为Master和Node两种类型节点,前者负责运行集群相关的控制管理服务,而后者负责运行Pod容器。在多Node节点模式下,由于Kubernetes Pod具有天然的容灾冗余HA高可用实现,因此,我们并不需要关心Node节点的HA高可用,而只需关心Master节点的HA即可,Master节点的HA高可用,通过多Master节点+HAProxy方案实现即可。从Kubernetes 1.12版本起,kube-proxy服务默认使用ipvs实现,取消了之前的iptables。这有助于提升K8s大规模集群环境下的性能和稳定性。

  • Docker和操作系统优化:在生产环境中,Docker和操作系统版本应当使用较新的release版本。并且,主机操作系统应当做一定程度的优化配置,如关闭swap内存交换分区,预留一定的CPU核数和内存资源给宿主机使用等。

Ceph/NFS数据存储

Kubernetes平台的数据持久化存储,可以使用Ceph、NFS等存储方案。其中,Ceph适用于有其技术背景或大容量存储需求的公司;而NFS适用于存储容量需求相对较小,无专业存储技术背景的公司。

业务应用层

  • 镜像管理:使用Harbor私有镜像仓库服务;

  • 日志管理:使用Elasticsearch、Filebeat 和 Kibana技术栈;

  • 监控告警管理:使用Cadvisor、Prometheus和Grafana技术栈;

  • 微服务架构:使用Service Mesh服务网格中的Istio方案;

  • Devops:使用Gitlab、Jenkins等持续集成工具;

  • 单体应用:无状态类服务使用deployment,有状态类服务则使用Statefulset,如果关联的服务较多且复杂则使用Helm。

  • 规划好Namespace:应当做到每个namespace专属用于某类型的应用,如monitor namespace统一管理诸如监控告警和日志管理方面的pod、service、pvc、ingress等资源。这样,可以较为方便的管理和区分K8s上的各种应用。

服务访问层

外部客户端访问K8s集群内的服务、负载均衡和路由规则定义使用Traefik Ingress实现。此外,应当实现Ingress服务HA高可用,可以想象在K8s集群中,大量的出入口流量都进过Ingress,其负载是非常大的,其重要程度不言而喻,因此实现HA就非常重要。ingress controller节点(无论是基于nginx还是traefik实现)应当至少为2个节点,并在这些节点上,部署Keepalived和HAproxy共同维护一个VIP地址,将其提供给ingress使用。

架构如下图所示

在该架构中,Ingress节点一般使用独立的服务器,即只做将集群外部流量接入到集群内部。除了使用external Ip来暴露ingress的Service到集群外部,还可以使用hostNetwork,如果是公有云,还可以使用LoadBalance。这样Ingress Controller将监听节点的80和443端口,通过热备的形式部署多个ingress节点,并在每个节点上部署Keepalived,多个节点共同维护一个VIP,实现Ingress服务的高可用。

如上图所示,部署两个ingress节点172.16.10.11和172.16.10.12。公网ip映射或转发到内网的VIP地址172.16.10.10上(如果VIP本身是公网IP则可以不用转发)。ingress controller的副本数replicaCount为2,将被调度到node1和node2这两个节点上。同时,使用pod反亲和性禁止ingress pod调度在同一个节点上。

k8s部署应用前准备工作及注意事项

一、部署的项目情况
1、业务架构及服务(dubbo,spring cloud)
2、第三方服务,例如mysql,redis,zookeeper,eruka,mq
3、服务之前怎么通信?
4、资源消耗:硬件资源,带宽。

二、部署项目时用到的k8s资源
1、使用namespace进行不同项目隔离,或者隔离不同环境(test,prod,dev)
2、无状态应用(deployment)
3、有状态应用(statefulset,pv,pvc)
4、暴露外部访问(service,ingress)
5、secret,configmap

三、项目基础镜像

四、编排部署
镜像为交付物。

1、项目构建(java).CI/CD环境这个阶段自动完成(代码拉取-》代码编译构建-》镜像打包-》推送到镜像仓库)。
2、编写yaml文件,使用这个镜像。

五、工作流程
kubectl -> yaml -> 镜像仓库拉取镜像 -> Service(集群内部访问)/Ingress 暴露给外部用户。

Kubernetes 在生产环境中常用架构的更多相关文章

  1. Kubernetes在生产环境中的一些讨论

    pod是所有一切资源的中心,毫无疑问是Kubernetes中最重要的资源.毕竟, 每个应用都运行在pod中.为了确保知道如何开发能充分利用应用所在环境资源的应用,最后再从应用的角度来仔细看一下pod. ...

  2. Kubernetes用户指南(三)--在生产环境中使用Pod来工作、管理部署

    一.在生产环境中使用Pod来工作 本节将介绍一些在生产环境中运行应用非常有用的功能. 1.持久化存储 容器的文件系统只有当容器正常运行时有效,一旦容器奔溃或者重启,所有对文件系统的修改将会丢失,从一个 ...

  3. Dubbo Mesh 在闲鱼生产环境中的落地实践

    本文作者至简曾在 2018 QCon 上海站以<Service Mesh 的本质.价值和应用探索>为题做了一次分享,其中谈到了 Dubbo Mesh 的整体发展思路是“借力开源.反哺开源” ...

  4. 理解Docker(6):若干企业生产环境中的容器网络方案

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  5. 【原】Storm Local模式和生产环境中Topology运行配置

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  6. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  7. [virtualenv]生产环境中使用virtualenv

    virtualenv 对于python开发和部署都是好工具,可以隔离多个python版本和第三方库的版本,这里作者总结了几个常用python服务怎么样结合virtual部署 原文链接 Python 中 ...

  8. 明白生产环境中的jvm参数

    明白生产环境中的jvm参数 写代码的时候,程序写完了,发到线上去运行,跑一段时间后,程序变慢了,cpu负载高了--一堆问题出来了,所以了解一下生产环境的机器上的jvm配置是有必要的.比如说: JDK版 ...

  9. 生产环境中 Ngx_lua 使用技巧和应用的范例

    生产环境中 Ngx_lua 使用技巧和应用的范例 时间 -- :: 51CTO技术博客 原文 http://rfyiamcool.blog.51cto.com/1030776/1252501 主题 L ...

随机推荐

  1. windows下安装mysql驱动mysql-python

    Windows下直接pip安装会出错 解决方案 到Python Extension Packages for Windows - Christoph Gohlke 下载MySQL_python‑1.2 ...

  2. django-团队简介的网页

    团队简介的网页,是使用Django完成的 关于Django的教程网址:http://www.runoob.com/django/django-tutorial.html 小组作业成果如下:

  3. SpringCloud实战-Hystrix线程隔离&请求缓存&请求合并

    接着上一篇的Hystrix进行进一步了解. 当系统用户不断增长时,每个微服务需要承受的并发压力也越来越大,在分布式环境中,通常压力来自对依赖服务的调用,因为亲戚依赖服务的资源需要通过通信来实现,这样的 ...

  4. 高通调试 SPI 屏的 bug

    1. spi调试问题: 问题描述: spi屏幕lk启动的时候正常出现小企鹅,到kernel启动的过程黑屏并且花屏才到开机动画: 2. 黑屏的三个阶段: 参照:黑屏分析 分析开机过程黑屏,首先需要定位黑 ...

  5. spring-cloud-sleuth+zipkin追踪服务实现(三)

    1.前言 在上一篇spring-cloud-sleuth+zipkin追踪服务实现(二)中我们讲述了利用mq的方式发送数据,存储在mysql,实际生产过程中调用数据量非常的大,mysql存储并不是很好 ...

  6. capwap学习笔记——capwap的前世今生(转)

    1 capwap的前世今生 1.1 胖AP.瘦AP.AC 传统的WLAN网络都是为企业或家庭内少量移动用户的接入而组建的.因此,只需要一个无线路由器就可以搞定了,就好像现在家用的无线路由器就是胖AP. ...

  7. PHP使用文件排它锁,应对小型并发

    总所知周,并发容易造成数据的重复处理,我的一个项目给游戏客户端提供了接口,游戏用户相对较多,如果使用数据库排它锁消耗的资源较高,因而使用了文件的排它锁来应对并发. 思路是打开一个文件并取得文件的独占锁 ...

  8. python中用locust做简单的压力测试

    验证导入包成功 首先导入locust模块,百度一下导入方法很多,就不多说了 验证导入成功或失败,在终端中(windows中是cmd)输入:locust --help 导入成功后会出现如下界面: 编辑运 ...

  9. jQuery.on() 函数详解 【转载】

    注意事项 1:on()为指定元素的一个或多个事件绑定事件处理函数.(可传递参数) 2:从jQuery 1.7开始,on()函数提供了绑定事件处理程序所需的所有功能,用于统一取代以前的bind(). d ...

  10. 快速EDAS字体嵌入问题

    在用edas向国际会议投稿的时候,往往要检查pdf稿件的格式,例如页边距.行距.字体等.经常碰到的一个问题就是字体未嵌入到文件中.因为大家一般用CTex里面的ps2pdf生成pdf文件,图片中的字往往 ...