一、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服务为例,看看组件如何协作:
-
用户通过
kubectl向API Server发送部署Nginx的请求。 -
API Server将请求写入Etcd,并通知Scheduler。
-
Scheduler从Etcd读取集群节点信息,选择一个最合适的Node,并将结果返回API Server。
-
API Server通知Controller Manager,Controller Manager下发指令给目标Node的Kubelet。
-
Kubelet收到指令后,通知容器运行时启动Nginx容器,容器运行在Pod中(Pod是K8s的最小调度单元)。
-
如需对外访问,可创建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的基本用法。