【k8s概念】一文搞懂k8s核心概念!!!(上)

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 【k8s概念】一文搞懂k8s核心概念!!!(上)

1. k8s简介


1.1 k8s概念

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验 的基础上,结合了社区中最好的想法和实践。


1.2 作用/功能

1. 服务发现和负载均衡

Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

2. 存储编排

Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

3. 自动部署和回滚

你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

4. 自动完成装箱计算

你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

5. 自我修复

Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

6. 密钥与配置管理

Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。


2. k8s集群搭建方式


部署k8s集群有很多种方式,例如二进制部署、kubeadm方式部署,亦或者使用Rancher部署,均可达到目的。

二进制部署方式比较久远,笔者没有使用过这种方式搭建集群,所以这里不做记录,如果需要,请自行搜索。

使用kubeadm方式搭建高可用k8s集群参考这篇文章:https://blog.csdn.net/weixin_64124795/article/details/129194945

使用Rancher部署k8s集群参考这篇文章(单节点master):https://blog.csdn.net/weixin_64124795/article/details/129289289

使用Rancher的搭建高可用k8s集群参考这篇文章:https://dongweizhen.blog.csdn.net/article/details/119352792


3. k8s核心组件


6f792079c9c24e34a5786172abe560d2.png

f611e9953091433ea6285493143775d2.png


3.1 Master Node(控制平面组件)

官网链接:https://kubernetes.io/zh-cn/docs/concepts/overview/components/


1. kube-apiserver

Kubernetes API 集群的统一入口,各组件的协调者,以 RESTful API 提供接口方式,所有的对象资源的增删改查和监听操作都交给 APIServer 处理后再提交。它是发往集群的所有rest操作命令的接入点,并负责接收、校验并响应所有的rest请求,结果状态被持久存储于etcd中,因此,apiserver是整个集群的网关。

简言之,kube-apiserver是资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和服务发现等机制。


2. kube-controller-manager

处理集群中常规后台任务,一个资源对应一个控制器,而 controllerManager 就是负责处理这些控制器的。集群级别的大多数功能都是由几个被称为控制器的进程执行实现的,这几个进程被集成于kube-controller-manager守护进程中。由控制器完成的功能主要包括生命周期功能和api业务逻辑,具体如下:

生命周期功能:包括namespace创建和生命周期、event垃圾回收、pod终止相关的垃圾回收、级联垃圾回收及node垃圾回收等。

api业务逻辑:例如,由replicaset执行的pod扩展等。

简言之,kube-controller-manager 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等。

3. kube-scheduler

根据调度算法为新创建的 pod 选择一个 Node 节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。由scheduler根据集群内各节点的可用资源状态,以及要运行的容器的资源需求做出调度决策。

简言之,负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上。

4. cluster state store(etcd)

kubernetes集群的所有状态信息都需要持久存储于存储系统etcd中,不过,etcd是由coreos基于raft协议开发的分布式键值存储,可用于服务发现、共享配置以及一致性保障(如数据库主节点选择、分布式锁等)。因此,etcd是独立的服务组件,并不隶属于kubernetes集群自身。生产环境中应该以etcd集群的方式运行以确保其服务可用性。

etcd不仅能够提供键值数据存储,而且还为其提供了监听(watch)机制,用于监听和推送变更。k8s集群系统中,etcd中的键值发生变化时会通知到apiserver,并由其通过watch api向客户端输出。基于watch机制,k8s集群的个组件实现了高效协同。

简言之,负责存储集群中各种资源对象的信息,Key-Value方式存储,所有的 k8s 集群数据存放在此。


3.2 Worker Node


1. kubelet

kubelet 是 Master 在 Worker 节点上的代理,管理本机运行容器的生命周期。比如创建容器,Pod 挂载数据卷,下载 Secret,获取容器和节点状态等工作,kubelet 将每个 Pod 转换成一组容器。它从apiserver接收关于pod对象的配置信息并确保它们处于期望的状态(desired state,也是目标状态)。kubelet会在apiserver上注册当前工作节点,定期向master汇报节点资源使用情况,并通过cadvisor监控容器和节点的资源占用状况。

简言之,负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器,会按固定频率检查节点健康状态并上报给 APIServer,该状态会记录在 Node 对象的 status 中。


2. kube-proxy

在 Node 节点上实现 Pod 网络代理,维护网络规则和四层负载均衡工作。

它能够按需为service资源对象生成iptables或ipvs规则,从而捕获访问当前service的clusterip的流量并将其转发至正确的后端pod对象,实现让 Pod 节点(一个或者多个容器)对外提供服务 docker 或 rocket。

简言之,负责提供集群内部的服务发现和负载均衡。

3. container runtime

每个node都要提供一个容器运行时环境,它负责下载镜像并运行容器。kubelet并未固定链接至某容器运行时环境,而是以插件的方式载入配置的容器环境,这种方式清晰地定义了各组件的边界。目前k8s支持的容器运行环境包括docker、rkt、cri-o、fraki等。


k8s集群还依赖于一组成为“组件”(add-ons)的组件以提供完整的功能,它们通常是由第三方提供的特定应用程序,并且托管运行于k8s集群之上。

kubedns:负责为整个集群提供 DNS 服务。在k8s集群中调度运行提供dns服务的pod,同一集群中的其他pod可使用此dns服务器解决主机名。k8s自1.11版本开始默认使用coredns项目为集群提供服务注册和服务发现的动态名称解析服务,之前的版本中用到的是kube-dns和skydns项目。

dashboard:提供 GUI图形化界面。kubernetes集群的全部功能都要基于web的UI来管理集群中的应用甚至是集群自身。

heapster:提供资源监控。容器和节点的性能监控与分析系统,它收集并解析多种指标数据,如资源利用率、生命周期事件等。新版本的k8s中,其功能会逐渐由prometheus结合其他组件所取代。

ingress controller:为服务提供外网入口。service是一种工作于传统层的负载均衡器,而ingress是在应用层实现的http(s)负载均衡机制。不过,ingress资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则需要通过ingress控制器(ingress controller)发挥作用。目前,此类的可用项目有nginx、traefik、envoy及haproxy等。

Fluentd-elasticsearch :提供集群日志采集、存储与查询。

参考文章:https://blog.csdn.net/qq_35550345/article/details/103714455


4. k8s核心概念


4.1 容器

现代软件开发的目标之一是保证各类应用程序在相同的主机或集群上可以彼此隔离。虚拟机是解决该问题的一个方案。但虚拟机需要他们自己的操作系统,所以他们的规模通常是千兆字节。


容器则恰恰相反,它可以隔离应用程序的执行环境但共享底层操作系统。所以,容器就像一个盒子,我们可以在其中保存一切运行应用程序所需要的:代码、运行时、系统工具、系统仓库、设置等。它们通常仅需要几兆字节即可运行,远远少于虚拟机所需资源,并且可以立即启动。


4.2 工作负载——Pod

参考csdn文档:https://blog.csdn.net/weixin_64124795/article/details/128943080

网络文章:http://www.uml.org.cn/yunjisuan/2022051844.asp


1. Pod概念

Pod 是 k8s 系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在 k8s 上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展 Pod 对象功能的,比如控制器对象是用来管控 Pod 对象的,Service 或者Ingress 资源对象是用来暴露 Pod 引用对象的,PersistentVolume 资源对象是用来为 Pod提供存储等等,k8s 不会直接处理容器,而是 Pod。Pod 是由一个或多个 container 组成。


每一个 Pod 都有一个特殊的被称为”根容器“的 Pause容器。Pause 容器对应的镜像属于 Kubernetes 平台的一部分,除了 Pause 容器,每个 Pod还包含一个或多个紧密相关的用户业务容器,如下图。

57e54a075da8473db21ce10fe4e5cee1.png

2. POD特性

  • 资源共享

一个 Pod 里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如namespace,cgroups 或者其他的隔离资源。

多个容器共享同一 network namespace,由此在一个 Pod 里的多个容器共享 Pod 的 IP 和端口 namespace,所以一个 Pod 内的多个容器之间可以通过 localhost 来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的 Pod 有不同的 IP,不同 Pod 内的多个容器之前通信,不可以使用 IPC(如果没有特殊指定的话)通信,通常情况下使用 Pod的 IP 进行通信。

一个 Pod 里的多个容器可以共享存储卷,这个存储卷会被定义为 Pod 的一部分,并且可以挂载到该 Pod 里的所有容器的文件系统上。

  • 生命周期短暂

Pod 属于生命周期比较短暂的组件,比如,当 Pod 所在节点发生故障,那么该节点上的 Pod会被调度到其他节点,但需要注意的是,被重新调度的 Pod 是一个全新的 Pod,跟之前的Pod 没有半毛钱关系。

  • 平坦的网络
    K8s 集群中的所有 Pod 都在同一个共享网络地址空间中,也就是说每个 Pod 都可以通过其他 Pod 的 IP 地址来实现访问。

总结:

最小部署单元

包含多个容器(一组容器的集合)

一个pod中容器共享网络命名空间(NameSpace)

pod是短暂的

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
存储 Kubernetes 调度
K8S中的核心概念
【6月更文挑战第25天】k8s资源对象可以用yaml或者json格式声明。每个资源对象都有自己的特定结构定义,并统一保存在etcd这种非关系型数据库中。
|
28天前
|
存储 Kubernetes 负载均衡
k8s 数据流向 与 核心概念详细介绍
k8s 数据流向 与 核心概念详细介绍
|
1月前
|
存储 Kubernetes API
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
Kubernetes学习-核心概念篇(三) 核心概念和专业术语
|
1月前
|
Kubernetes API 调度
Kubernetes学习-核心概念篇(二) 集群架构与组件
Kubernetes学习-核心概念篇(二) 集群架构与组件
|
1月前
|
Kubernetes 调度 虚拟化
Kubernetes学习-核心概念篇(一) 初识Kubernetes
Kubernetes学习-核心概念篇(一) 初识Kubernetes
|
1月前
|
Kubernetes 测试技术 Docker
K8S中Deployment控制器的概念、原理解读以及使用技巧
K8S中Deployment控制器的概念、原理解读以及使用技巧
|
1月前
|
存储 Kubernetes Docker
Kubernetes(K8S)集群管理Docker容器(概念篇)
Kubernetes(K8S)集群管理Docker容器(概念篇)
|
1月前
|
Kubernetes 网络协议 API
玩转Kubernetes—基础概念篇
玩转Kubernetes—基础概念篇
69 1
|
1月前
|
Kubernetes 负载均衡 Perl
kubernetes—五个概念入门(二)
kubernetes—五个概念入门(二)
92 0
|
1月前
|
Kubernetes 应用服务中间件 数据中心
kubernetes—五个概念入门(一)
kubernetes—五个概念入门(一)
94 0