K8s笔记整理

一、Kubernetes是什么?

在理解Kubernetes(简称K8s)之前,我们先回顾一下应用部署方式的演变过程。

1. 传统物理部署

早期,我们将软件直接部署在物理服务器上。这种方式简单直接,但问题也很明显:资源分配难以控制,多个程序共享同一台机器的资源,容易产生资源竞争,互相影响。

2. 虚拟化部署

为了解决资源隔离问题,虚拟化技术应运而生。通过虚拟机,我们可以在一台物理机上运行多个相互隔离的虚拟机,每个虚拟机拥有独立的操作系统和资源。但虚拟化带来了新的开销------每个虚拟机都需要完整的操作系统,占用了大量内存和磁盘空间,资源利用率不够高。

3. 容器化部署

容器化是轻量级的虚拟化技术。容器共享宿主机的操作系统内核,但拥有独立的文件系统、进程空间和资源限制。因此容器启动更快、资源消耗更少,成为现代应用部署的主流方式。

容器编排的挑战

当容器化成为主流,新的问题出现了:

  • 如果一个容器意外崩溃,如何快速启动一个新容器接替它?

  • 当访问量激增时,如何横向扩展容器数量?

  • 如何保证容器之间的服务发现和负载均衡?

这些问题统称为 "容器编排" 。而 Kubernetes 正是当前最流行的容器编排平台,它帮助我们自动化地管理容器化应用的生命周期。

Kubernetes能为我们做什么?

Kubernetes提供了以下核心功能:

  • 自我修复:一旦某个容器崩溃,K8s能在秒级内启动新的容器替换它,保证服务不中断。

  • 弹性伸缩:根据实时负载自动调整容器数量。例如,当并发量从4000飙升到8000时,K8s会自动增加容器;流量回落后再自动缩减。

  • 服务发现与负载均衡:服务可以通过自动发现机制找到依赖的其他服务,并且K8s内置负载均衡策略,将流量均匀分发到多个容器。

  • 版本回退与灰度发布:如果新发布的程序版本出现问题,可以快速回滚到旧版本,支持平滑升级。

  • 存储编排:根据容器需求自动创建存储卷,支持多种存储后端。


二、Kubernetes设计原理

1. 集群架构:Master与Node

Kubernetes集群采用主从架构,分为控制节点(Master)工作节点(Node)

  • Master:负责集群的控制平面,做出全局决策(如调度、检测、响应事件)。

  • Node:负责运行容器应用,是实际干活的工作节点。

2. Master组件

  • API Server:所有资源操作的唯一入口,提供认证、授权、API注册和发现机制。

  • Scheduler:负责将新创建的Pod调度到合适的Node上,根据调度策略选择最优节点。

  • Controller Manager:维护集群的状态,处理节点故障、自动扩缩容、滚动更新等。

  • Etcd:分布式键值存储,保存集群所有配置和状态信息,是K8s的数据库。

3. Node组件

  • Kubelet:与容器运行时(如Docker)交互,负责管理Pod和容器的生命周期。

  • Kube-Proxy:实现Service的负载均衡和服务发现,维护网络规则。

  • 容器运行时(Container Runtime):真正运行容器的软件,如Docker、containerd。

4. 工作机制示例

以部署一个Nginx服务为例,看看组件如何协作:

  1. 用户通过kubectl向API Server发送部署Nginx的请求。

  2. API Server将请求写入Etcd,并通知Scheduler。

  3. Scheduler从Etcd读取集群节点信息,选择一个最合适的Node,并将结果返回API Server。

  4. API Server通知Controller Manager,Controller Manager下发指令给目标Node的Kubelet。

  5. Kubelet收到指令后,通知容器运行时启动Nginx容器,容器运行在Pod中(Pod是K8s的最小调度单元)。

  6. 如需对外访问,可创建Service资源,Kube-Proxy负责配置负载均衡规则,将外部流量导入Nginx Pod。

5. 常见名词解释

  • Pod:K8s中最小的部署单元,一个Pod可以包含一个或多个紧密相关的容器。

  • Controller:控制器,负责管理Pod的副本数、滚动更新等,例如Deployment、StatefulSet。

  • Service:定义一组Pod的访问策略,提供稳定的网络入口和负载均衡。

  • Label:键值对标签,用于标识和组织资源,Service通过Label选择对应的Pod。

  • Namespace:命名空间,实现多租户隔离,将资源逻辑分组。


三、Kubernetes环境搭建简介

Kubernetes集群搭建有两种常见模式:

  • 一主多从:一台Master节点,多台Node节点,适合测试和学习。

  • 多主多从:多台Master实现高可用,适合生产环境。

对于初学者,推荐在一台或多台虚拟机(如CentOS 7.6)上搭建一主两从的测试环境。主要步骤包括:

  • 准备三台服务器,配置主机名解析、时间同步、关闭防火墙和SELinux、禁用swap。

  • 安装Docker和Kubernetes组件(kubeadm、kubelet、kubectl)。

  • 使用kubeadm初始化Master节点,生成加入集群的token。

  • Node节点执行join命令加入集群。

  • 安装网络插件(如Flannel),使跨节点Pod通信正常。

完成以上步骤后,一个基本的K8s集群就搭建成功了。


四、快速体验:部署Nginx服务

搭建好集群后,我们可以通过简单的命令体验K8s的部署能力:

bash

复制代码
# 创建一个nginx deployment,运行一个nginx容器
kubectl create deployment nginx --image=nginx:1.14-alpine

# 将deployment暴露为Service,类型为NodePort,以便外部访问
kubectl expose deployment nginx --port=80 --type=NodePort

# 查看Pod和Service的状态
kubectl get pods,service

执行后,K8s会调度Pod到某个Node上启动Nginx,并分配一个随机端口(如31347)。通过任意节点的IP加此端口即可访问Nginx欢迎页。


五、总结

Kubernetes作为容器编排的事实标准,极大地简化了容器化应用的部署、运维和扩展工作。理解其核心概念(Pod、Service、Controller等)和组件(API Server、Scheduler、Kubelet等)是入门的关键。通过亲手搭建集群并部署一个简单应用,能够更快地掌握K8s的基本用法。

相关推荐
Rhystt1 小时前
斑马问题|离散数学|爱因斯坦的谜题你能解开吗?
经验分享·笔记
ouliten2 小时前
C++笔记:std::numeric_limits
c++·笔记
承渊政道2 小时前
C++学习之旅【C++伸展树介绍以及红黑树的实现】
开发语言·c++·笔记·b树·学习·visual studio
IT界的老黄牛2 小时前
【IT老齐230 笔记 + 思考】金融业容灾方案“两地三中心“是什么意思?
数据库·笔记·架构
testresultstomorrow2 小时前
GitHub 代码上传与故障排除实战指南
经验分享·笔记·开源·github
prog_61032 小时前
【笔记】用cursor手搓cursor(一)
人工智能·笔记·agent
困死,根本不会2 小时前
Git 远程连接仓库学习笔记(本地→GitHub)
笔记·git·学习
马猴烧酒.3 小时前
【JAVA算法|hot100】贪心算法类型题目详解笔记
java·开发语言·ide·笔记·算法·spring·贪心算法
未来可期叶3 小时前
【软考网工】第一章 计算机网络概论:高频考点(OSI/TCP/IP+数据封装)
网络·笔记·网络协议·tcp/ip·计算机网络·软考·备考