Kubernetes (K8S) 最全图文总结

一、Kubernetes 简介

1.1 容器化技术背景

在云计算时代,应用程序的部署和管理面临诸多挑战,传统的虚拟机(VM)技术虽然提供了一定的隔离性,但资源占用大、启动速度慢。容器化技术应运而生,它以轻量级、高效的方式实现应用程序及其依赖项的打包和隔离。

Docker 作为容器化技术的典型代表,允许开发者将应用程序和其运行环境打包成一个可移植的镜像,确保应用在不同环境中 “一次构建,到处运行”。例如,将一个基于 Python Flask 框架的 Web 应用打包成 Docker 镜像,包含 Python 运行时环境、Flask 库以及应用代码,在任何支持 Docker 的环境中都能稳定运行。

然而,当大量容器需要进行管理、调度和扩展时,Docker 自身的管理能力显得捉襟见肘,Kubernetes 便在这样的背景下诞生。

1.2 Kubernetes 的定义与优势

Kubernetes(简称 K8S)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一套完整的解决方案,能够高效地管理和调度集群中的容器,实现应用的高可用性、弹性伸缩和资源优化。

Kubernetes 的优势主要体现在以下几个方面:

  • 自动化部署:通过定义声明式配置文件(如 YAML 格式),Kubernetes 可以自动将应用程序部署到集群中指定的节点上,无需手动逐个部署容器。
  • 弹性伸缩:根据应用程序的负载情况,Kubernetes 能够自动调整运行的容器数量。例如,当网站访问量激增时,Kubernetes 可以自动创建更多的容器实例来处理请求,而在访问量下降时,自动减少容器数量以节省资源。
  • 服务发现与负载均衡:Kubernetes 为容器化应用提供了服务发现机制,使得应用之间可以通过服务名称进行通信,而无需关注具体的 IP 地址。同时,它还内置了负载均衡功能,能够将请求均匀地分发到多个容器实例上,提高应用的性能和可用性。
  • 自愈能力:如果某个容器或节点出现故障,Kubernetes 会自动检测并重新调度应用到其他健康的节点上,确保应用始终处于运行状态。

1.3 Kubernetes 的应用场景

Kubernetes 的应用场景非常广泛,涵盖了互联网、金融、医疗、教育等多个行业:

  • 微服务架构:Kubernetes 是实现微服务架构的理想平台,它能够轻松管理大量的微服务容器,实现服务的自动化部署、扩展和通信。
  • 持续集成与持续交付(CI/CD):结合 Jenkins、GitLab CI/CD 等工具,Kubernetes 可以构建高效的 CI/CD 流水线,实现代码的快速部署和迭代。
  • 大数据与人工智能:在大数据处理和人工智能训练场景中,Kubernetes 可以有效地管理和调度计算资源,提高任务的执行效率。
  • 多租户环境:Kubernetes 支持多租户模式,能够为不同的租户提供隔离的资源和环境,适用于云服务提供商和企业内部的多部门协作。

二、Kubernetes 核心概念

2.1 集群(Cluster)

Kubernetes 集群是由多个节点(Node)组成的集合,用于运行容器化应用程序。一个完整的 Kubernetes 集群通常包含控制平面(Control Plane)和工作节点(Worker Node)。

2.1.1 控制平面

控制平面负责管理和控制整个集群,它由多个组件组成:

  • etcd:一个高可靠的分布式键值存储系统,用于保存集群的配置信息和状态数据。
  • API Server:Kubernetes 集群的入口,负责接收和处理来自客户端的请求,并与其他组件进行通信。所有对集群的操作(如创建、更新、删除资源等)都通过 API Server 进行。
  • Scheduler:负责将新创建的 Pod 调度到合适的工作节点上。它会根据节点的资源情况、Pod 的需求以及各种调度策略进行决策。
  • Controller Manager:负责管理集群中的各种控制器,如 Node Controller、Replication Controller、Deployment Controller 等。这些控制器通过监控集群状态并进行相应的调整,确保集群始终处于期望的状态。
2.1.2 工作节点

工作节点是实际运行容器化应用的地方,每个工作节点上都运行着以下组件:

  • Kubelet:工作节点上的代理,负责与控制平面通信,接收并执行 Pod 的创建、删除等操作,同时监控 Pod 和容器的状态,并将状态信息上报给控制平面。
  • Container Runtime:用于运行容器的软件,常见的有 Docker、containerd 等。Kubelet 通过调用 Container Runtime 来创建和管理容器。
  • Kube Proxy:负责为 Pod 提供网络代理和负载均衡功能,确保 Pod 之间以及 Pod 与外部服务之间的通信正常。

2.2 Pod

Pod 是 Kubernetes 中最小的可部署和可管理的计算单元,它是一个或多个紧密相关的容器的集合。这些容器共享网络命名空间、存储卷等资源,可以在同一个工作节点上协同工作。

例如,一个 Web 应用的 Pod 可能包含一个运行 Web 服务器的容器和一个运行数据库连接池的容器,它们通过共享的网络命名空间进行通信。

每个 Pod 都有自己唯一的 IP 地址,在集群内部,Pod 之间可以通过 IP 地址直接通信。同时,Kubernetes 为 Pod 提供了生命周期管理,包括创建、运行、重启、删除等操作。

2.3 控制器(Controller)

控制器是 Kubernetes 中用于管理 Pod 的资源对象,它通过监控 Pod 的实际状态,并与期望状态进行比较,来确保 Pod 始终处于正确的运行状态。常见的控制器类型有:

  • Deployment:最常用的控制器之一,用于管理无状态应用程序的部署和更新。通过 Deployment,可以轻松实现滚动更新、回滚等操作,确保应用程序的升级过程平滑且可回滚。
  • StatefulSet:用于管理有状态应用程序,如数据库等。它能够保证 Pod 的顺序性和唯一性,为每个 Pod 分配固定的存储和网络标识,确保有状态应用的状态能够正确保存和恢复。
  • DaemonSet:确保集群中的每个节点(或符合特定条件的节点)上都运行一个 Pod 副本。常用于部署系统监控、日志收集等需要在每个节点上运行的服务。
  • Job:用于执行一次性的任务,如数据备份、批量处理等。当任务完成后,Job 会自动删除对应的 Pod。
  • CronJob:基于时间调度的 Job,类似于 Linux 系统中的 Cron 任务。可以按照指定的时间周期(如每分钟、每小时、每天等)运行任务。

2.4 服务(Service)

在 Kubernetes 集群中,Pod 的 IP 地址是动态分配的,当 Pod 被重新调度或删除重建时,其 IP 地址会发生变化。这就导致其他 Pod 无法通过固定的 IP 地址与目标 Pod 进行通信。服务(Service)就是为了解决这个问题而引入的概念。

Service 是一个抽象层,它定义了一组 Pod 的逻辑集合,并为这些 Pod 提供了一个固定的访问入口。Service 通过标签选择器(Label Selector)来选择与之关联的 Pod,当 Pod 的 IP 地址发生变化时,Service 会自动更新其内部的端点(Endpoint)列表,确保流量能够正确地转发到目标 Pod。

Service 有多种类型,包括 ClusterIP、NodePort、LoadBalancer 和 ExternalName 等:

  • ClusterIP:默认的服务类型,它为服务分配一个集群内部的虚拟 IP 地址,只能在集群内部通过该 IP 地址进行访问。
  • NodePort:在 ClusterIP 的基础上,将服务映射到集群中每个节点的一个随机端口上,外部可以通过节点的 IP 地址和该端口访问服务。
  • LoadBalancer:适用于云环境,它会自动创建一个外部负载均衡器,并将服务暴露到互联网上。不同的云提供商对 LoadBalancer 的实现方式有所不同。
  • ExternalName:通过将服务映射到一个 DNS 名称,而不是实际的 Pod,用于将集群外部的服务引入到集群内部进行访问。

2.5 存储(Storage)

在 Kubernetes 中,容器的存储管理至关重要。Pod 中的容器可能需要持久化存储数据,例如数据库容器需要保存数据文件,日志收集容器需要存储日志文件等。Kubernetes 提供了多种存储解决方案:

  • Volume:Volume 是 Pod 中可以被多个容器访问的共享目录,它的生命周期与 Pod 相同。常见的 Volume 类型有 emptyDir(临时存储,Pod 删除时数据丢失)、hostPath(挂载宿主机目录)、NFS(挂载 NFS 服务器上的目录)等。
  • PersistentVolume(PV):PersistentVolume 是集群中已存在的一块存储资源,它可以是 NFS、Ceph 等存储系统中的一部分。PV 是独立于 Pod 的资源,管理员可以提前创建好 PV,供 Pod 使用。
  • PersistentVolumeClaim(PVC):PersistentVolumeClaim 是用户对存储资源的请求,它向集群申请一定大小和访问模式(如 ReadWriteOnce、ReadOnlyMany、ReadWriteMany)的存储。Kubernetes 会根据 PVC 的要求,将合适的 PV 绑定给 PVC,然后 Pod 可以通过 PVC 来使用 PV 提供的存储。

2.6 网络(Network)

Kubernetes 网络模型旨在解决集群中 Pod 之间、Pod 与服务之间以及集群与外部网络之间的通信问题。Kubernetes 对网络有以下要求:

  • 所有 Pod 都可以在不使用 NAT 的情况下与其他 Pod 通信:这意味着每个 Pod 都应该有一个可路由的 IP 地址,并且能够直接与其他 Pod 进行网络通信。
  • 所有节点都可以在不使用 NAT 的情况下与所有 Pod 通信:节点需要能够直接访问 Pod 的 IP 地址,以便进行容器的管理和通信。
  • Pod 的 IP 地址与节点看到的 IP 地址是相同的:保证 Pod 内部和外部看到的 IP 地址一致,避免网络地址转换带来的问题。

为了满足这些要求,Kubernetes 支持多种网络方案,如 Flannel、Calico、Weave Net 等。这些网络方案通过不同的技术实现 Pod 网络的互联互通,例如 Flannel 通过 VxLAN 技术实现跨节点 Pod 通信,Calico 通过 BGP 路由协议实现网络可达性。

三、Kubernetes 安装与配置

3.1 安装前准备

在安装 Kubernetes 之前,需要进行一些准备工作:

  • 硬件要求:确保控制平面节点和工作节点满足一定的硬件配置要求,如 CPU、内存、磁盘空间等。一般来说,控制平面节点建议至少 2 核 CPU、4GB 内存,工作节点根据实际应用负载进行配置。
  • 操作系统:Kubernetes 支持多种 Linux 操作系统,如 Ubuntu、CentOS 等。建议使用官方推荐的稳定版本的操作系统,并确保系统已更新到最新的安全补丁。
  • 关闭 Swap:为了确保 Kubernetes 的性能和稳定性,需要关闭系统的 Swap 分区。可以通过修改/etc/fstab文件或使用命令swapoff -a临时关闭 Swap。
  • 配置主机名和 hosts 文件:为每个节点设置唯一的主机名,并在所有节点的/etc/hosts文件中添加节点的 IP 地址和主机名映射,确保节点之间能够通过主机名进行通信。

3.2 使用 kubeadm 安装 Kubernetes

kubeadm 是 Kubernetes 官方提供的一种快速、简单的安装工具,它可以帮助用户快速搭建一个 Kubernetes 集群。以下是使用 kubeadm 安装 Kubernetes 的基本步骤:

3.2.1 安装 Docker 或 containerd

Kubernetes 需要容器运行时来运行容器,这里以 Docker 为例:

  1. 在 CentOS 系统上安装 Docker
 

sudo yum update

sudo yum install -y yum-utils

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install -y docker-ce docker-ce-cli containerd.io

sudo systemctl start docker

sudo systemctl enable docker

  1. 在 Ubuntu 系统上安装 Docker
 

sudo apt update

sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io

sudo systemctl start docker

sudo systemctl enable docker

3.2.2 安装 kubeadm、kubelet 和 kubectl
  1. 添加 Kubernetes 软件源
 

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo

[kubernetes]

name=Kubernetes

baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch

enabled=1

gpgcheck=1

repo_gpgcheck=1

gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg

exclude=kubelet kubeadm kubectl

EOF

  1. 安装 kubeadm、kubelet 和 kubectl
 

sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

sudo systemctl enable --now kubelet

3.2.3 初始化控制平面

在控制平面节点上执行以下命令初始化集群:

 

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

这里--pod-network-cidr参数指定了 Pod 网络的 IP 地址段,不同的网络方案可能需要不同的 IP 段。初始化完成后,会输出一些配置信息和加入工作节点的命令,需要保存好这些信息。

3.2.4 配置 kubectl

在控制平面节点上,执行以下命令配置 kubectl,以便可以使用 kubectl 命令行工具管理集群:

 

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.2.5 加入工作节点

在每个工作节点上,执行控制平面初始化时输出的加入命令,将工作节点加入到集群中:

 

sudo kubeadm join <control-plane-ip>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

3.2.6 安装网络插件

Kubernetes 集群初始化完成后,还需要安装网络插件,如 Flannel:

 

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

3.3 其他安装方式

除了使用 kubeadm 安装 Kubernetes 外,还有其他安装方式:

  • 二进制包安装:从 Kubernetes 官方下载二进制包,手动配置和启动各个组件。这种方式灵活性高,但安装和配置过程相对复杂,适合对 Kubernetes 原理有深入了解的用户。
  • 使用云服务提供商的 Kubernetes 服务:如 Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)、Azure Kubernetes Service(AKS)等。这些云服务提供了托管的 Kubernetes 集群,用户无需关注集群的安装和运维细节,可以快速创建和使用 Kubernetes 集群。

四、Kubernetes 资源管理

4.1 创建和管理 Pod

4.1.1 使用命令行创建 Pod

可以使用kubectl run命令快速创建一个 Pod。例如,创建一个运行 Nginx 镜像的 Pod:

 

kubectl run nginx-pod --image=nginx

该命令会创建一个名为nginx-pod的 Pod,并使用 Nginx 镜像启动容器。可以使用kubectl get pods命令查看 Pod 的运行状态:

 

kubectl get pods

4.1.2 使用 YAML 文件创建 Pod

更推荐使用 YAML 文件来定义和创建 Pod,这样可以更清晰地描述 Pod 的配置信息。以下是一个使用 YAML 文件创建 Nginx Pod 的示例:

 

apiVersion: v1

kind: Pod

metadata:

name: nginx-pod

labels:

app: nginx

spec:

containers:

- name: nginx-container

image: nginx

ports:

- containerPort: 80

将上述内容保存为nginx-pod.yaml文件,然后使用以下命令创建 Pod:

 

kubectl apply -f nginx-pod.yaml

4.1.3 查看和管理 Pod
  • 查看 Pod 详细信息:使用kubectl describe pod <pod-name>命令可以查看 Pod 的详细信息,包括 Pod 的创建时间、状态、容器配置、事件等。
  • 进入 Pod 的容器:使用kubectl exec -it <pod-name> -- <container-name> bash命令可以进入 Pod 中的容器,进行调试和操作。例如,进入nginx-pod中的nginx-container容器:
 

kubectl exec -it nginx-pod -- nginx-container bash

  • 删除 Pod:使用kubectl delete pod <pod-name>命令可以删除指定的 Pod。如果 Pod 是由控制器创建的,删除后控制器会根据配置重新创建 Pod。
  • 摩尔狮云计算每日课堂Top1-课程大纲:
    Linux系统管理-数据库与监控平台课程大纲
  • 本课程围绕 Linux 系统环境,系统讲解数据库管理与监控平台搭建运维知识。课程从 Linux 系统基础操作入手,深入学习 MySQL、PostgreSQL 等主流数据库的安装配置、性能优化及备份恢复策略;同时,介绍 Zabbix、Prometheus 等监控平台的部署与使用,掌握系统资源、数据库状态的实时监控与告警配置。通过理论与实践结合,帮助学员提升在 Linux 系统下管理数据库与搭建监控平台的综合能力,为企业服务器稳定运行提供技术保障。

  • 【摩尔狮教育】的独特优势助力解决问题 摩尔狮教育的课程不仅有理论知识和实践方法,还有强大的师资团队和教学服务。在我学习解决Kubernetes课程过程中,老师会结合实际的企业案例进行讲解,让我了解到在真实的工作场景中可能遇到的各种复杂情况。而且,当我在实践中遇到问题时,无论是在学习群里提问,还是预约老师一对一辅导,都能得到及时、专业的解答。

当遇到Kubernetes学习过程中出现疑问时,不要慌张。借助在摩尔狮教育学到的知识和技能,从理论分析到实践排查,多维度入手,就能精准定位并解决问题。如果你也想掌握这些实用的网络技术,不妨来摩尔狮教育学习,开启你的技术提升之旅!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值