还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!...

还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!..._第1张图片


本文只是笔者针对 Kubernetes 在生产环境运行的一些关于架构设计和实现方案的总结。

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


还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!..._第2张图片


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

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

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

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

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

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


基础设施层


1. 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 核数和内存资源给宿主机使用等。


2. 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使用。


架构如下图所示:

还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!..._第3张图片

在该架构中,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 调度在同一个节点上。

来源:xuchao's blog
原文:http://t.cn/ESLD9fa
题图:
来自谷歌图片搜索 
版权:
本文版权归原作者所有
投稿:欢迎投稿,投稿邮箱: [email protected]


今日思想

如果容许我再过一次人生,我愿意重复我的生活。因为,我从来就不后悔过去,不惧怕将来。

—— 蒙田


推荐阅读

  • 大话高并发架构

  • 图解 Kubernetes 架构

  • 图解 Ansible 自动化运维

  • 谈谈 TCP 的 TIME_WAIT

  • 推荐一款支持在浏览器上运行 VS Code 的服务端神器 Code-Server

你可能感兴趣的:(还在为生产环境中用什么样的 Kubernetes 架构困惑吗,或许看完这篇你的问题就迎刃而解了!...)