k8s教程(基础篇)-基本概念和术语(上)

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: k8s教程(基础篇)-基本概念和术语(上)

01 资源对象概述

Kubernetes 中的基本概念和术语大多是围绕 资源对象Resource Object)来说 的,而资源对象在总体上可分为以下两类:

  1. 某种资源的对象。例如节点NodePod、服务Service、存储卷 Volume
  2. 与资源对象相关的事物与动作。例如标签Label、注解Annotation、命名空间Namespace、部署DeploymentHPAPVC

资源对象一般包括几个通用属性:版本、类别(Kind)、名称、标签、注解,如下所述。

  • 版本信息:包括了此对象所属的资源组,一些资源对象的属性会随着版本的升级而变化,在定义资源对象时要特别注意这一点。
  • 类别属性:用于定义资源对象的类型。
  • 资源对象的名称(Name)、标签、注解这三个属性属于资源对象的元数据(metadata),资源对象的名称要唯一。资源对象的标签是很重要的数据,也是 Kubernetes 的一大设计特性,比如通过标签来表明资源对象的特征、类别,以及通过标签筛选不同的资源对象并实现对象之间的关联、控制或协作功能。
  • 注解:可被理解为一种特殊的标签,不过更多地是与程序挂钩,通常用于实现资源对象属性的自定义扩展。

我们可以采用 YAML JSON 格式声明(定义或创建)一个 Kubernetes 资源对象,每个资源对象都有自己的特定结构定义(可以理解为数据库中一个特定的表),并且统一保存在 etcd 这种非关系型数据库中,以实现最快的读写速度。此外,所有资源对象都可以通过 Kubernetes 提供的kubectl工具(或者 API 编程调用)执行增、删、改、查等操作。

这里按照功能或用途对众多资源对象其进行分类,将其分为集群类、应用类、存储类及安全类这四大类,下面来讲解。

02 集群类

集群(Cluster)表示一个由 MasterNode 组成的 Kubernetes 集群。

2.1 Master

Master指的是集群的控制节点。在每个 Kubernetes 集群中都需要有一个或一组被称为 Master 的节点,来负责整个集群的管理和控制。Master 通常占据一个独立的服务器(在高可用部署中建议至少使用 3 台服务器),是整个集群的“大脑”,如果它发生宕机或者不可用,那么对集群内容器应用的管理都将无法实施。

Master上运行着以下关键进程:

  • Kubernetes API Server (kube-apiserver):提供 HTTP RESTful API 接口的主要服务,是 Kubernetes 里对所有资源进行增、删、改、查等操作的唯一入口,也是集群控制的入口进程。
  • Kubernetes Controller Manager:Kubernetes 里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”。
  • Kubernetes Scheduler:负责资源调度(Pod 调度)的进程,相当于公交公司的调度室。
  • Master上通常还需要部署etcd服务。

2.2 Node

Kubernetes集群中除 Master 外的其他服务器被称为 NodeNode 可以是一台物理主机,也可以是一台虚拟机。NodeKubernetes集群中的工作负载节点,每个 Node 都会被 Master 分配一些工作负载(Docker 容器),当某个Node宕机时,其上的工作负载会被 Master 自动转移到其他 Node 上。

在每个 Node 上都运行着以下关键进程:

  • kubelet:负责 Pod 对应容器的创建、启停等任务,同时与 Master 密切协作,实现集群管理的基本功能。
  • kube-proxy:实现 Kubernetes Service 的通信与负载均衡机制的服务。
  • 容器运行时(如 Docker : 负责本机的容器创建和管理。

我们可以运行以下命令查看在集群中有多少个 Node:

查询node详情:

2.3 命名空间

在集群类里还有一个重要的基础概念一一命名空间,它在很多情况下用于实现多租户的资源隔离,典型的一种思路就是给每个租户都分配一个命名空间。每个命名空间都是相互独立的存在,属于不同命名空间的资源对象从逻辑上相互隔离。

在每个 Kubernetes 集群安装完成且正常运行之后,Master 会自动创建两个命名空间。

  • 默认级(default:用户创建的资源对象如果没有指定命名空间,则被默认存放在default命名空间中;
  • 系统级(kube-system:系统相关的资源对象如网络组件、DNS 组件、监控类组件等,都被安装在 kube-system 命名空间中。

我们可以通过命名空间将集群内部的资源对象“分配”到不同的命名空间中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时能被分别管理。当给每个租户都创建一个命名空间来实现多租户的资源隔离时,还能结合 Kubernetes 的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。

命名空间的定义很简单,如下所示的 YAML 文件定义了名为development的命名空间:

查看(注意加上-namespace-n):

03 应用类

3.1 service和pod

Node、Pod与容器间的关系图如下:

Pod及周边对象:

应用类相关的资源对象主要是围绕 Service(服务)和 Pod 这两个核心对象展开的。

  • Service :一般指的是无状态服务,通常由多个程序副本提供服务,在特殊情况下也可以是有状态的单实例服务,比如 MySQL 这种数据存储类的服务。
  • Pod:有一个特殊的被称为“根容器”的 Pause 容器,Pause 容器对应的镜像属于 Kubernetes 平台的一部分,还包含一个或多个紧密相关的用户业务容器。

3.2 label与标签选择器

给某个资源对象定义一个 label,就相当于给它打了一个标签,随后可以通过 Label Selector(标签选择器)查询和筛选拥有某些 Label 的资源对象,Kubernetes 通过这种方式实现了类似 SQL 的简单又通用的对象查询机制。

写法举例:

举例图:

3.3 Pod和Deployment

Pod、Deployment和Service的关系:

前面提到,大部分 Service 都是无状态的服务,可以由多个Pod副本实例提供服务。通常情况下,每个 Service 对应的Pod服务实例数量都是固定的,如果一个一个地手工创建 Pod 实例,就太麻烦了,最好是用模板的思路,即提供一个 Pod 模板(Template),然后由程序根据我们指定的模板自动创建指定数量的 Pod 实例。这就是Deployment这个资源对象所要完成的事情了,举例:

3.4 Service和ClusterIp

Kubernetes 内部在每个 Node 上都运行了一套全局的虚拟负载均衡器,自动注入并自动实时更新集群中所有 Service 的路由表,通过 iptables或者 IPVS 机制,把对 Service 的请求转发到其后端对应的某个 Pod 实例上,并在内部实现服务的负载均衡与会话保持机制。

不仅如此,Kubernetes 还采用了一种很巧妙又影响深远的设计一 ClusterIP 地址

Service 一旦被创建,Kubernetes 就会自动为它分配一个全局唯一的虚拟 IP 地址,即ClusterIP 地址,而且在Service的整个生命周期内,其 ClusterIP 地址不会发生改变,这样一来,每个服务就变成了具备唯一 IP 地址的通信节点,远程服务之间的通信问题就变成了基础的 TCP 网络通信问题。

3.5 Service外网访问

我们需要先弄明白 Kubernetes 的三种 IP,分别如下:

  • Node IP: 是 Kubernetes集群中每个节点的物理网卡的 IP 地址,是一个真实存在的物理网络,所有属于这个网络的服务器都能通过这个网络直接通信。
  • Pod IP: 每个 Pod 的 IP 地址,在使用 Docker 作为容器支持引擎的情况下,它是 Docker Engine 根据 dockero 网桥的 IP 地址段进行分配的,通常是一个虚拟二层网络,通过Pod IP所在的虚拟二层网络进行通信的,真实的TCP/IP 流量是通过Node IP 所在的物理网卡流出。
  • Service IP: Service 的 ClusterIP 地址属于集群内的地址,无法在集群外直接使用这个地址。为了解决这个问题,Kubernetes 首先引入了 NodePort。

对于每个 Service,我们通常需要配置一个对应的负载均衡器实例来转发流量到后端的 Node 上,这的确增加了工作量及出错的概率,如下图:

NodePort 的确功能强大且通用性强,但也存在一个问题,即每个 Service 都需要在 Node 上独占一个端口,而端口又是有限的物理资源,那能不能让多个 Service 共用一个对外端口呢,这就是后来增加的 Ingress资源对象所要解决的问题。

Ingress其实只能将多个 HTTP (HTTPS)的 Service“聚合”,通过虚拟域名或者 URL Path 的特征进行路由转发功能,考虑到常见的微服务都采用了 HTTP REST 协议,所以 Ingress 这种聚合多个 Service 并将其暴露到外网的做法还是很有效的

在一定程度上,我们可以把 Ingress 的实现机制理解为基于 Nginx 的支持虚拟主机的 HTTP 代理。下面是一个 Ingress 的实例:

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
14天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
75 24
|
16天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
94 6
|
4月前
|
Kubernetes 调度 Perl
在K8S中,Pod亲和性概念是什么?
在K8S中,Pod亲和性概念是什么?
|
2月前
|
Kubernetes 持续交付 微服务
深入浅出:理解 Kubernetes 核心概念
Kubernetes 是一个由 Google 开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它已成为微服务架构下的行业标准。本文深入浅出地介绍了 Kubernetes 的核心概念和组件,包括 Master 和 Node 组件、Pod、Service、Deployment 等,并提供了基本操作示例和实战应用,帮助你更好地管理和利用容器环境。
|
1月前
|
存储 Kubernetes 调度
K8S中的核心概念
【10月更文挑战第26天】云原生环境下的安全问题易被忽视,导致潜在风险。应用层渗透测试和漏洞扫描是检测安全的关键,尤其是对于CVE漏洞的修复。然而,常见误解认为安全由外部防护处理且不易引入问题。
|
4月前
|
Kubernetes 负载均衡 安全
在k8S中,网络模型概念是什么?
在k8S中,网络模型概念是什么?
|
4月前
|
存储 Kubernetes Cloud Native
在k8S中,rook概念是什么?
在k8S中,rook概念是什么?
|
4月前
|
JSON Kubernetes Cloud Native
在k8S中,CNI模型概念是什么?
在k8S中,CNI模型概念是什么?
|
4月前
|
消息中间件 Kubernetes 数据库
在k8S中,初始化容器(init container)概念原理是什么?
在k8S中,初始化容器(init container)概念原理是什么?
|
4月前
|
存储 Kubernetes Docker
在K8S中,与K8S相关基础概念有哪些?
在K8S中,与K8S相关基础概念有哪些?