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 为例:
在 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
在 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
添加 Kubernetes 软件源:
cat < [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 安装 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 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 的容器:使用kubectl exec -it kubectl exec -it nginx-pod -- nginx-container bash 删除 Pod:使用kubectl delete pod 【摩尔狮教育】的独特优势助力解决问题 摩尔狮教育的课程不仅有理论知识和实践方法,还有强大的师资团队和教学服务。在我学习解决Kubernetes课程过程中,老师会结合实际的企业案例进行讲解,让我了解到在真实的工作场景中可能遇到的各种复杂情况。而且,当我在实践中遇到问题时,无论是在学习群里提问,还是预约老师一对一辅导,都能得到及时、专业的解答。 当遇到Kubernetes学习过程中出现疑问时,不要慌张。借助在摩尔狮教育学到的知识和技能,从理论分析到实践排查,多维度入手,就能精准定位并解决问题。如果你也想掌握这些实用的网络技术,不妨来摩尔狮教育学习,开启你的技术提升之旅!