【玩转云原生】第四章:学习kubernetes需要掌握的基础知识

简介: Kubernetes是一个非常流行的开源容器编排平台,可以用来自动化部署、扩展和管理容器化的工作负载。在本章中,我们将发现Kubernetes集群的基本架构及其组件。要学习更多的Kubernetes基础知识,

1. Kubernetes简介

Kubernetes最初是由谷歌设计和开发的,在2014年得到了开源,随着1.0版Kubernetes被捐赠给新成立的云本地计算。

2. 学习目标

在本章结束时,你应该能够:

  1. 讨论Kubernetes的基本架构。
  2. 解释控制平面和工作节点的不同组成部分。
  3. 了解如何开始使用Kubernetes设置。
  4. 讨论Kubernetes是如何运行容器的。
  5. 讨论Kubernetes的调度概念。

3. Kubernetes 架构

Kubernetes经常被用作集群,这意味着它跨越多个工作在不同任务上的服务器,并分配系统的负载。这是一个基于谷歌的需求的初始设计决策,每周都有数十亿个容器启动。考虑到Kubernetes的高垂直可伸缩性,可以跨多个数据中心和区域拥有数千个服务器节点的集群。
从高层次的角度来看,Kubernetes集群由两种不同的服务器节点类型组成:

  • 控制平面节点(年代)

这些是行动的大脑。控制平面节点包含各种组件,这些组件管理集群并控制各种任务,如部署、调度和容器化工作负载的自修复。

  • 工作者节点
    工作节点是应用程序在集群中运行的地方。这是工作节点的唯一工作,它们没有任何进一步的逻辑实现。它们的行为,比如它们是否应该启动一个容器,完全由控制平面节点控制。

在这里插入图片描述

Kubernetes架构
与您为自己的应用程序选择的微服务体系结构类似,Kubernetes合并了多个需要安装在节点上的较小的服务。

master节点组件:

  • kube-apiserver: 这是Kubernetes的核心观点。所有其他组件都与api服务器交互,这是用户访问集群的地方。
  • etcd:保存集群状态的数据库。etcd是一个独立的项目,而不是Kubernetes的官方部分。
  • kube-scheduler:当一个新的工作负载应该被调度时,kube-scheduler会根据CPU和内存等不同属性选择一个合适的工作节点。
  • kube-controller-manager:包含不同的非终止控制循环,用于管理集群的状态。例如,其中一个控制循环可以确保您的应用程序的所需数量一直可用。

node节点组件:

  • 容器运行时:容器运行时负责在工作节点上运行容器。在很长一段时间里,Docker是最流行的选择,但现在被其他运行时所取代,如containerd
  • kubelet:在集群中的每个工作节点上运行的小型代理。kubelet与api服务器和容器运行时对话,以处理启动容器的最后阶段。
  • kube-proxy:处理集群内部和外部通信的网络代理。如果可能的话,kube代理尝试依赖底层操作系统的网络功能,而不是自己管理流量。

值得注意的是,这种设计使得已经在工作节点上启动的应用程序可以在控制平面不可用的情况下继续运行。虽然许多重要的功能,如缩放、调度新的应用程序等,将不可能在控制平面离线时实现。
Kubernetes还有一个名称空间的概念,不要将其与用于隔离容器的内核名称空间混淆。Kubernetes名称空间可用于将一个集群划分为多个虚拟集群,在使用mul时可用于多租户。

4. Kubernetes搭建

建立Kubernetes集群可以通过许多不同的方法来实现。使用正确的工具,创建一个测试“集群”非常容易:

如果你想在自己的硬件或虚拟机上建立一个生产级的集群,你可以选择各种安装程序之一:

一些供应商开始将Kubernetes打包成一个发行版,甚至提供商业支持:

这些发行版在使用Kubernetes作为其框架的中心部分时,经常选择一种固执的方法并提供额外的工具。
如果你不想自己安装和管理它,你可以从云提供商那里使用它:

交互式教程-创建一个集群
在这个交互式教程中,你可以学习如何使用Minikube建立你自己的Kubernetes集群

5. Kubernetes API

Kubernetes API是Kubernetes集群中最重要的组件。没有它,就不可能与集群通信,集群本身的每个用户和每个组件都需要api-server。
访问控制概述,从Kubernetes文档中检索
在一个请求被Kubernetes处理之前,它必须经历三个阶段:

  • 身份验证

请求者需要提供一种针对API进行身份验证的方法。通常使用数字签名证书(X.509)或外部身份管理系统。Kubernetes用户总是由外部管理的。服务帐户可以用来认证技术用户。

  • 授权

它决定了请求者被允许做什么。在Kubernetes中,这可以通过基于角色的访问控制(RBAC)来实现。

在最后一步中,可以使用入场控制器来修改或验证请求。例如,如果用户试图使用来自不可信注册中心的容器图

准入控制器可能会阻止此请求。像Open Policy Agent这样的工具可以用于外部管理准入控制
与许多其他API一样,Kubernetes API是作为通过HTTPS公开的RESTful接口实现的。通过这个API,用户或服务可以创建、修改、删除或检索驻留在Kubernetes中的资源。

6. Kubernetes上运行容器

在本地机器上运行容器与在Kubernetes中运行容器有什么不同?在Kubernetes中,不是直接启动容器,而是将Pods定义为最小的计算单元,Kubernetes将其转换为一个运行的容器。我们将在后面学习更多关于Pods的内容,现在把它想象成一个容器的包装器。
在Kubernetes中创建Pod对象时,在获得运行节点的容器之前,会涉及到多个组件。
下面是一个使用Docker的例子:

为了允许使用其他容器运行时而不是Docker, Kubernetes在2016年引入了容器运行时接口(CRI)

  • containerdContainerd是一个运行容器的轻量级、高性能实现。可以说是目前最流行的容器运行时。Kubernetes即服务产品的所有主要云提供商都使用它。
  • CRI-O:CRI-O由Red Hat创建,具有与podman和buildah密切相关的类似代码库。
  • Docker:这个标准存在了很长一段时间,但从未真正用于容器编排。Docker作为Kubernetes运行时的使用已经被弃用,并将在Kubernetes 1.23中移除。Kubernetes有一篇很棒的博客文章,回答了关于这个问题的所有问题。

使用containerd创建容器要比使用Docker简单得多
containerdCRI-O的想法非常简单:提供一个只包含运行容器绝对必要的运行时。不过,它们还有一些额外的特性,比如与容器运行时沙箱工具集成的能力。这些工具试图解决在多个容器之间共享内核所带来的安全问题。目前最常用的工具有:

  • gvisor:由谷歌创建,提供了一个位于容器化进程和主机内核之间的应用程序内核。
  • Kata Containers:提供轻量级虚拟机的安全运行时,但其行为类似于容器。

7. Networking

Kubernetes的网络可能非常复杂,难以理解。其中很多概念都与kubernetes无关,在容器编排一章中已经介绍过。同样,我们必须处理大量容器需要跨大量节点通信的问题。Kubernetes区分了四种需要解决的网络问题:

  1. Container-to-Container 通信

这可以通过Pod概念来解决,我们将在后面学习到。

  1. Pod-to-Pod 通信

这可以通过覆盖网络来解决。

  1. Pod-to-Service 通信

在节点上通过kube-proxy和包过滤实现
External-to-Service 通信
在节点上通过kube-proxy和包过滤(packet filter )实现。

Kubernetes中有不同的实现网络的方式,但也有三个重要的需求:

  • 所有pod可以跨节点相互通信。
  • 所有节点可以与所有pod进行通信。
  • 没有网络地址转换(NAT)。

要实现联网,你可以从各种网络供应商中选择:

在Kubernetes中,每个Pod都有自己的IP地址,所以不需要手动配置。此外,大多数Kubernetes设置包括一个名为core-dns的DNS服务器附加组件,它可以在集群内提供服务发现和名称解析。

8. 调度(Scheduling)

在其最基本的形式中,调度是容器编排的一个子类,描述了自动选择正确的(工作人员)节点来运行容器工作负载的过程。在过去,调度更多的是手工任务,系统管理员通过跟踪可用的服务器、它们的容量和其他属性(比如它们的位置)来为应用程序选择正确的服务器。

在Kubernetes集群中,kube调度器是做出调度决策的组件,但并不负责实际启动工作负载。Kubernetes中的调度过程总是在创建一个新的Pod对象时启动。记住,Kubernetes使用的是一种声明式的方法,在这种方法中,Pod只是首先被描述,然后调度程序选择一个节点,在这个节点中,Pod实际上将由kubelet和容器运行时启动。

关于Kubernetes的一个常见误解是,它有某种形式的“人工智能”来分析工作负载,并根据资源消耗、工作负载类型和其他因素来移动pod。事实是,用户必须提供有关应用程序需求的信息,包括对CPU和内存的请求以及节点的属性。例如,用户可以请求他们的应用程序需要两个CPU内核、4g内存,最好将其安排在具有快速磁盘的节点上。
调度器将使用这些信息来过滤符合这些要求的所有节点。如果多个节点平均满足需求,Kubernetes将在Pod数量最少的节点上调度Pod。如果用户没有指定任何进一步的需求,这也是默认的行为。

可能无法建立所需的状态,例如,因为工作节点没有足够的资源来运行应用程序。在这种情况下,调度器将重试找到适当的节点,直到状态可以建立。

9. 其他资源

9.1 Kubernetes的历史和Borg的遗产

9.2 Kubernetes 架构

9.3 RBAC

  • [Demystifying RBAC in Kubernetes], by Kaitlyn Barnard

9.4 Container Runtime Interface

  • [Introducing Container Runtime Interface (CRI) in Kubernetes (2016)]

9.5 Kubernetes networking and CNI

  • [What is Kubernetes networking?]

9.6 Internals of Kubernetes Scheduling

  • [A Deep Dive into Kubernetes Scheduling], by Ron Sobol (2020)

9.7 Kubernetes Security Tools

9.8 Kubernetes Playground

在这里插入图片描述

关注公众号:爱死亡机器人

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
17天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
90 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 负载均衡 Cloud Native
探索Kubernetes:云原生应用的基石
探索Kubernetes:云原生应用的基石
|
2月前
|
Kubernetes 监控 负载均衡
深入云原生:Kubernetes 集群部署与管理实践
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术以其弹性、可扩展性成为企业IT架构的首选。本文将引导你了解如何部署和管理一个Kubernetes集群,包括环境准备、安装步骤和日常维护技巧。我们将通过实际代码示例,探索云原生世界的秘密,并分享如何高效运用这一技术以适应快速变化的业务需求。
74 1
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2天前
|
缓存 容灾 网络协议
ACK One多集群网关:实现高效容灾方案
ACK One多集群网关可以帮助您快速构建同城跨AZ多活容灾系统、混合云同城跨AZ多活容灾系统,以及异地容灾系统。
|
15天前
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
12天前
|
Kubernetes Ubuntu 网络安全
ubuntu使用kubeadm搭建k8s集群
通过以上步骤,您可以在 Ubuntu 系统上使用 kubeadm 成功搭建一个 Kubernetes 集群。本文详细介绍了从环境准备、安装 Kubernetes 组件、初始化集群到管理和使用集群的完整过程,希望对您有所帮助。在实际应用中,您可以根据具体需求调整配置,进一步优化集群性能和安全性。
59 12