0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Docker不香吗为什么还要用K8s

Linux爱好者 来源:51CTO技术栈 作者:51CTO技术栈 2021-06-02 11:56 次阅读

Docker 虽好用,但面对强大的集群,成千上万的容器,突然感觉不香了。

这时候就需要我们的主角 Kubernetes 上场了,先来了解一下 K8s 的基本概念,后面再介绍实践,由浅入深步步为营。

关于 K8s 的基本概念我们将会围绕如下七点展开:

Docker 的管理痛点

什么是 K8s?

云架构 & 云原生

K8s 架构原理

K8s 核心组件

K8s 的服务注册与发现

关键问题

Docker 的管理痛点

如果想要将 Docker 应用于庞大的业务实现,是存在困难的编排、管理和调度问题。

于是,我们迫切需要一套管理系统,对 Docker 及容器进行更高级更灵活的管理。

Kubernetes 应运而生!Kubernetes,名词源于希腊语,意为「舵手」或「飞行员」。

Google 在 2014 年开源了 Kubernetes 项目,建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验的基础上,结合了社区中最好的想法和实践。

K8s 是 Kubernetes 的缩写,用 8 替代了 「ubernete」,下文我们将使用简称。

什么是 K8s ?

K8s 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。

K8s 拥有一个庞大且快速增长的生态系统。K8s 的服务、支持和工具广泛可用。

通过 K8s 我们可以:

快速部署应用

快速扩展应用

无缝对接新的应用功能

节省资源,优化硬件资源的使用

K8s 有如下特点:

可移植:支持公有云,私有云,混合云,多重云 multi-cloud。

可扩展:模块化,插件化,可挂载,可组合。

自动化:自动部署,自动重启,自动复制,自动伸缩/扩展。

云架构 & 云原生

①云和 K8s 是什么关系

云就是使用容器构建的一套服务集群网络,云由很多的大量容器构成。K8s 就是用来管理云中的容器。

②常见几类云架构

常见几类云架构如上图所示:

On-Premises(本地部署)。

IaaS(基础设施即服务):用户:租用(购买|分配权限)云主机,用户不需要考虑网络,DNS,硬件环境方面的问题;运营商:提供网络,存储,DNS,这样服务就叫做基础设施服务。

PaaS(平台即服务):MySQL/ES/MQ/。。.

SaaS(软件即服务):钉钉,财务管理。

Serverless:无服务,不需要服务器。站在用户的角度考虑问题,用户只需要使用云服务器即可,在云服务器所在的基础环境,软件环境都不需要用户关心。

如果觉得不好理解,推荐阅读这篇文章:如何通俗解释 IaaS、PaaS、SaaS 的区别:

https://www.zhihu.com/question/21641778/answer/62523535

可以预见:未来服务开发都是 Serverless,企业都构建了自己的私有云环境,或者是使用公有云环境。

③云原生

为了让应用程序(项目,服务软件)都运行在云上的解决方案,这样的方案叫做云原生。

云原生有如下特点:

容器化,所有服务都必须部署在容器中

微服务,Web 服务架构式服务架构

CI/CD

DevOps

K8s 架构原理

①K8s 架构

概括来说 K8s 架构就是一个 Master 对应一群 Node 节点。下面我们来逐一介绍 K8s 架构图中的 Master 和 Node。

Master 节点结构如下:

apiserver 即 K8s 网关,所有的指令请求都必须要经过 apiserver。

Scheduler 调度器,使用调度算法,把请求资源调度到某一个 Node 节点。

Controller 控制器,维护 K8s 资源对象。

etcd 存储资源对象。

Node 节点结构如下:

Kubelet 在每一个 Node 节点都存在一份,在 Node 节点上的资源操作指令由 Kubelet 来执行。

Kube-proxy 代理服务,处理服务间负载均衡。

Pod 是 K8s 管理的基本单元(最小单元),Pod 内部是容器,K8s 不直接管理容器,而是管理 Pod。

Docker 运行容器的基础环境,容器引擎。

Fluentd 日志收集服务。

在介绍完 K8s 架构后,我们又引入了很多技术名词。不要着急,先有整体概念,再各个击破。请耐心阅读下文,相信你一定会有不一样的收获。

K8s 核心组件

①K8s 组件

K8s 是用来管理容器,但是不直接操作容器,最小操作单元是 Pod (间接管理容器):

一个 Master 有一群 Node 节点与之对应。

Master 节点不存储容器,只负责调度、网管、控制器、资源对象存储。

容器的存储在 Node 节点,容器是存储在 Pod 内部的)。

Pod 内部可以有一个容器,或者多个容器。

Kubelet 负责本地 Pod 的维护。

Kube-proxy 负责负载均衡,在多个 Pod 之间来做负载均衡。

②Pod 是什么?

解释如下:

Pod 也是一个容器,这个容器中装的是 Docker 创建的容器,Pod 用来封装容器的一个容器,Pod 是一个虚拟化分组。

Pod 相当于独立主机,可以封装一个或者多个容器。

Pod 有自己的 IP 地址、主机名,相当于一台独立沙箱环境。

③Pod 到底用来干什么?

通常情况下,在服务部署时候,使用 Pod 来管理一组相关的服务。一个 Pod 中要么部署一个服务,要么部署一组有关系的服务。

一组相关的服务是指:在链式调用的调用连路上的服务。

④Web 服务集群如何实现?

实现服务集群:只需要复制多方 Pod 的副本即可,这也是 K8s 管理的先进之处,K8s 如果继续扩容,只需要控制 Pod 的数量即可,缩容道理类似。

⑤Pod 底层网络,数据存储是如何进行的?

具体如下:

Pod 内部容器创建之前,必须先创建 Pause 容器。

服务容器之间访问 localhost ,相当于访问本地服务一样,性能非常高。

⑥ReplicaSet 副本控制器

控制 Pod 副本「服务集群」的数量,永远与预期设定的数量保持一致即可。

当有 Pod 服务宕机时候,副本控制器将会立马重新创建一个新的 Pod,永远保证副本为设置数量。

副本控制器:标签选择器-选择维护一组相关的服务(它自己的服务)

ReplicationController 副本控制器:单选。

ReplicaSet 副本控制器:单选,复合选择。

selector: app = web Release = stable

在新版的 K8s 中,建议使用 ReplicaSet 作为副本控制器,ReplicationController 不再使用了。

⑦Deployment 部署对象

Deployment 部署对象如下:

服务部署结构模型

滚动更新

ReplicaSet 副本控制器控制 Pod 副本的数量。但是,项目的需求在不断迭代、不断的更新,项目版本将会不停的的发版。版本的变化,如何做到服务更新?

部署模型:

ReplicaSet 不支持滚动更新,Deployment 对象支持滚动更新,通常和 ReplicaSet 一起使用。

Deployment 管理 ReplicaSet,RS 重新建立新的 RS,创建新的 Pod。

⑧MySQL 使用容器化部署,存在什么样的问题?

问题如下:

容器是生命周期的,一旦宕机,数据丢失

Pod 部署,Pod 有生命周期,数据丢失

对于 K8s 来说,不能使用 Deployment 部署有状态服务。

通常情况下,Deployment 被用来部署无状态服务,那么对于有状态服务的部署,使用 StatefulSet 进行有状态服务的部署。

什么是有状态服务?

有实时的数据需要存储。

有状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,如果集群网络无法使用。

什么是无状态服务?

没有实时的数据需要存储。

无状态服务集群中,把某一个服务抽离出去,一段时间后再加入机器网络,对集群服务没有任何影响。

⑨StatefulSet

为了解决有状态服务使用容器化部署的一个问题:

部署模型

有状态服务

StatefulSet 保证 Pod 重新建立后,Hostname 不会发生变化,Pod 就可以通过 Hostname 来关联数据。

K8s 的服务注册与发现

①Pod 的结构是怎样的?

结构如下:

Pod 相当于一个容器,Pod 有独立 IP 地址,也有自己的 Hostname,利用 Namespace 进行资源隔离,独立沙箱环境。

Pod 内部封装的是容器,可以封装一个,或者多个容器(通常是一组相关的容器)。

②Pod 网络

具体如下:

Pod 有自己独立的 IP 地址。

Pod 内部容器之间访问采用 Localhost 访问。

Pod 内部容器访问是 Localhost,Pod 之间的通信属于远程访问。

③Pod 是如何对外提供服务访问的?

Pod 是虚拟的资源对象(进程),没有对应实体(物理机,物理网卡)与之对应,无法直接对外提供服务访问。

那么该如何解决这个问题呢?Pod 如果想要对外提供服务,必须绑定物理机端口。

也就是说在物理机上开启端口,让这个端口和 Pod 的端口进行映射,这样就可以通过物理机进行数据包的转发。

概括来说:先通过物理机 IP+Port 进行访问,再进行数据包转发。

④一组相关的 Pod 副本,如何实现访问负载均衡?

我们先明确一个概念,Pod 是一个进程,是有生命周期的。宕机、版本更新,都会创建新的 Pod。

这时候 IP 地址会发生变化,Hostname 会发生变化,使用 Nginx 做负载均衡就不太合适了。

所以我们需要依赖 Service 的能力。

⑤Service 如何实现负载均衡?

简单来说,Service 资源对象包括如下三部分:

Pod IP:Pod 的 IP 地址。

Node IP:物理机 IP 地址。

Cluster IP:虚拟 IP ,是由 K8s 抽象出的 Service 对象,这个 Service 对象就是一个 VIP 的资源对象。

⑥Service VIP 更深入原理探讨

具体如下:

Service 和 Pod 都是一个进程,Service 也不能对外网提供服务。

Service 和 Pod 之间可以直接进行通信,它们的通信属于局域网通信。

把请求交给 Service 后,Service 使用 iptable,ipvs 做数据包的分发。

⑦Service 对象是如何和 Pod 进行关联的?

具体如下:

不同的业务有不同的 Service。

Service 和 Pod 通过标签选择器进行关联。

selector: app=x 选择一组订单的服务 pod ,创建一个 service; 通过 endpoints 存放一组 pod ip;

Service 通过标签选择器选择一组相关的副本,然后创建一个 Service。

⑧Pod 宕机、发布新的版本的时候,Service 如何发现 Pod 已经发生了变化?

每个 Pod 中都有 Kube-Proxy,监听所有 Pod。如果发现 Pod 有变化,就动态更新(etcd 中存储)对应的 IP 映射关系。

关键问题

①企业使用 K8s 主要用来做什么?

有如下三个方面:

自动化运维平台,创业型公司,中小型企业,使用 K8s 构建一套自动化运维平台,自动维护服务数量,保持服务永远和预期的数据保持一致性,让服务可以永远提供服务。这样最直接的好处就是降本增效。

充分利用服务器资源,互联网企业,有很多服务器资源「物理机」,为了充分利用服务器资源,使用 K8s 构建私有云环境,项目运行在云。这在大型互联网公司尤为重要。

服务的无缝迁移,项目开发中,产品需求不停的迭代,更新产品。这就意味着项目不停的发布新的版本,而 K8s 可以实现项目从开发到生产无缝迁移。

②K8s 服务的负载均衡是如何实现的?

Pod 中的容器很可能因为各种原因发生故障而死掉。Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。

换句话说,Pod 是脆弱的,但应用是健壮的。每个 Pod 都有自己的 IP 地址。

当 Controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址。

这样就产生了一个问题:如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?

K8s 给出的解决方案是 Service。Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 Label 来挑选。

Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,K8s 则负责建立和维护 Service 与 Pod 的映射关系。

无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

③无状态服务一般使用什么方式进行部署?

Deployment 为 Pod 和 ReplicaSet 提供了一个 声明式定义方法,通常被用来部署无状态服务。

Deployment 的主要作用:定义 Deployment 来创建 Pod 和 ReplicaSet 滚动升级和回滚应用扩容和索容暂停和继续。

Deployment不仅仅可以滚动更新,而且可以进行回滚,如果发现升级到 V2 版本后,服务不可用,可以迅

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    16332

    浏览量

    177803
  • 云架构
    +关注

    关注

    0

    文章

    17

    浏览量

    3704
  • devops
    +关注

    关注

    0

    文章

    113

    浏览量

    12014

原文标题:Docker 不香吗,为啥还要 K8s ?

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    k8sdocker区别对比,哪个更强?

    Docker和Kubernetes(K8s)是容器化技术的两大流行工具。Docker关注构建和打包容器,适用于本地开发和单主机管理;而K8s则提供容器编排和管理平台,适用于多主机或云环
    的头像 发表于 12-11 13:55 70次阅读

    k8s微服务架构就是云原生吗?两者是什么关系

    k8s微服务架构就是云原生吗?K8s微服务架构并不等同于云原生,但两者之间存在密切的联系。Kubernetes在云原生架构中扮演着核心组件的角色,它简化了容器化应用程序的管理,提供了弹性、自动化
    的头像 发表于 11-25 09:39 136次阅读

    混合云部署k8s集群方法有哪些?

    混合云部署k8s集群方法是首先需在本地与公有云分别建立K8s集群,并确保网络连接。接着,配置kubeconfig文件连接两集群,并安装云服务插件以实现资源互通。然后,编写Deployment文件部署应用,并使用kubectl命令应用至集群。最后,验证应用状态并监控集群性能
    的头像 发表于 11-07 09:37 140次阅读

    dockerk8s部署在云平台性能要求盘点

    Docker和Kubernetes在云平台部署时有各自的性能要求。Docker需要足够的CPU、内存和存储资源,以及快速的网络带宽和优化的镜像大小。而Kubernetes则强调集群管理的效率、自动扩展能力、服务发现、持久化存储和安全性配置。两者都需考虑硬件资源、网络通信和
    的头像 发表于 11-05 10:47 174次阅读

    Dockerk8s的核心概念

    这是在HWL负责网校云业务线测试时,给同事分享的基础概念文档。
    的头像 发表于 11-04 15:47 185次阅读
    <b class='flag-5'>Docker</b>和<b class='flag-5'>k8s</b>的核心概念

    k8s可以部署私有云吗?私有云部署全攻略

    Kubernetes(简称K8S)可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器化的应用,实现高度的灵活性和可扩展性。
    的头像 发表于 10-25 09:32 158次阅读

    k8s云原生开发要求

    IO性能。网络要求稳定,建议使用私有网络VPC,并配置与Kubernetes兼容的网络插件。操作系统需与K8s版本匹配,虚拟化平台支持Docker等。此外,还需关注安全配置,如禁用Swap、调整Sysctl等,以及etcd数据存储后端的配置。合理配置硬件可确保
    的头像 发表于 10-24 10:03 210次阅读
    <b class='flag-5'>k8s</b>云原生开发要求

    k8s容器启动失败的常见原因及解决办法

    k8s容器启动失败的问题通常出现在开发者使用Kubernetes进行容器编排时,可能的原因有多种,例如:配置错误、镜像问题、资源限制、依赖问题、网络问题、节点状态异常、其他因素等,以下是对这些常见原因的详细分析:
    的头像 发表于 10-11 10:12 235次阅读

    云服务器部署k8s需要什么配置?

    云服务器部署K8s需要至少2核CPU、4GB内存、50GBSSD存储的主节点用于管理集群,工作节点建议至少2核CPU、2GB内存、20GBSSD。还需安装Docker,选择兼容的Kubernetes版本,配置网络插件,以及确保系统安全、监控和备份措施到位。
    的头像 发表于 10-09 15:31 203次阅读

    纳尼?自建K8s集群日志收集还能通过JMQ保存到JES

    作者:京东科技 刘恩浩 一、背景 基于K8s集群的私有化交付方案中,日志收集采用了ilogtail+logstash+kafka+es方案,其中ilogtail负责日志收集,logstash负责对数
    的头像 发表于 09-30 14:45 209次阅读

    常用的k8s容器网络模式有哪些?

    常用的k8s容器网络模式包括Bridge模式、Host模式、Overlay模式、Flannel模式、CNI(ContainerNetworkInterface)模式。K8s的容器网络模式多种多样
    的头像 发表于 09-19 11:29 234次阅读

    K8S集群中使用JDOS KMS服务对敏感数据安全加密

    基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据, 驱动和插件需要
    的头像 发表于 08-09 16:00 226次阅读
    <b class='flag-5'>K8S</b>集群中使用JDOS KMS服务对敏感数据安全加密

    K8S学习教程三:在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

    K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索  。
    的头像 发表于 07-08 17:03 635次阅读
    <b class='flag-5'>K8S</b>学习教程三:在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

    K8S学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    并且需要手动重启节点,相较之下,使用 PetaExpress 提供的 Kubernetes(k8s) 服务 进行 Redis 集群的部署,则展现出了显著的优势: 1、安装便捷:使用镜像或者 yaml 配置文件即可一件安装,极大地简化了安装流程 2、缩扩容方便:在 扩容 、 缩容 方面的优点一键伸缩,
    的头像 发表于 07-03 15:30 736次阅读
    <b class='flag-5'>K8S</b>学习教程(二):在 PetaExpress KubeSphere容器平台部署高可用 Redis 集群

    K8S落地实践经验分享

    k8s 即 Kubernetes,是一个开源的容器编排引擎,用来对容器化应用进行自动化部署、 扩缩和管理。
    的头像 发表于 01-02 11:45 1116次阅读
    <b class='flag-5'>K8S</b>落地实践经验分享