Kubernetes入门
Kubernetes简介
- 背景与起源
- Borg系统的开源版本:Kubernetes的思想源于Google内部运行了十几年的大规模集群管理系统Borg,Google将Borg的理念和经验付诸实践,并将其开源,这就是Kubernetes(常简称为K8s)。
- CNCF与云原生:Kubernetes是云原生计算基金会(CNCF) 的旗舰项目,并且已经成为云原生时代的操作系统。
- 官方定义
- Kubernetes是一个开源的容器编排引擎,用于自动化部署、扩展和管理容器化应用。
- 它提供了一个以容器为中心的管理环境,旨在实现生产级别的容器编排和运维能力。
为什么要用Kubernetes?
- 演进历程:
- 传统部署时代:应用直接运行在物理服务器上,资源分配难以控制,应用之间容易产生资源争用,扩容成本高、周期长。
- 虚拟化部署时代:通过虚拟机(VM)在单台物理机上运行多个操作系统。提供了更好的资源隔离和安全性,并且更容易扩容。但每个VM都包含一整套操作系统,体积庞大、笨重,资源开销大。
- 容器化部署时代:容器与宿主机共享操作系统内核,因此更轻量、启动更快、资源效率更高。Docker使容器技术普及,但当容器数量增多、分布 across 多台主机时,如何管理它们的生命周期、网络互联、存储挂载、故障恢复和扩容?这就需要容器编排。
- Kubernetes的核心价值(解决了哪些痛点):
- 服务发现与负载均衡:K8s可以为容器组提供唯一的域名和虚拟IP地址(Service),并自动将请求负载均衡到多容器实例上。
- 存储编排:可以自动挂载选择的存储系统,无论是本地存储、云提供商(如AWS EBS)还是网络存储系统(如NFS, Ceph)。
- 自动部署和回滚:可以描述应用的期望状态,K8s会以可控的速率将实际状态改变为期望状态,如果部署出错,可以轻松回滚。
- 自动调度:K8s调度器会依据每个容器对CPU和内存(RAM)的资源需求,自动安排到合适的节点上运行以最大化资源利用率。
- 自我修复:这是最关键的能力之一。K8s能持续监控集群状态。
- 如果某个容器故障崩溃,它会重启该容器。
- 如果某个节点宕机,它会将在该节点上运行的容器重新调度到其他健康节点上。
- 如果服务不响应健康检查,它会终止该容器并在别处重新启动它。
- 密钥与配置管理:可以存储和管理敏感信息(如密码、OAuth令牌)和应用程序的配置信息(如配置文件),并能在不重建容器镜像的情况下部署和更新这些secret和配置。
Kubernetes入门实例
- 启动一个Deployment:
kubectl create deployment nginx --image=nginx
- 意图:告诉K8s运行一个名为
nginx
的应用,它使用nginx
这个Docker镜像。 - K8s的行动:K8s会创建一个
Deployment
对象,它负责保证Nginx容器的运行。随后,Deployment
会创建一个Pod
(容器组)来实际运行Nginx容器。
- 意图:告诉K8s运行一个名为
- 将服务暴露给外部:
kubectl expose deployment nginx --port=80 --type=NodePort
- 意图:前文的Nginx只在集群内部可以访问,现在让外部用户也能访问到它。
- K8s的行动:K8s会创建一个
Service
对象,其类型为NodePort
。这意味着K8s会在集群的每个节点上打开一个端口(如30080),并将访问该端口的所有流量转发到后台的Nginx Pod上。
- 访问应用:用户可以通过
<任意节点的IP地址>:30080
来访问Nginx的欢迎页面。
Kubernetes的基本概念和术语
-
集群类:
-
Master(控制平面):集群的“大脑”。负责管理、调度、决策和暴露API。通常包含以下核心组件:
API Server:所有资源操作的唯一入口,是各个组件之间通信的枢纽。
Scheduler:负责根据资源情况将新创建的Pod调度到合适的Node上。
Controller Manager:运行着各种控制器,负责维护集群的状态(如故障检测、自动扩展、滚动更新)。
etcd:一个高可用的键值数据库,持久化存储整个集群的状态和配置数据。
-
Node(工作节点):集群的“工作肌肉”。负责运行容器。每个Node上至少运行:
Kubelet:负责与Master通信,管理当前节点上Pod的生命周期(如创建、销毁容器)。
Kube-proxy:负责维护节点上的网络规则,实现Service的负载均衡和流量转发。
容器运行时:如Docker或containerd,负责真正运行容器。
-
-
应用类(最核心的一组概念):
-
Pod:K8s调度和管理的最小单位。一个Pod可以包含一个或多个紧密关联的容器(如主应用容器和日志收集Sidecar容器)。这些容器共享网络命名空间、IP地址、端口空间和存储卷。Pod是 ephemeral(短暂的),会被频繁地创建和销毁。
-
Label:标签,是附加到K8s对象(如Pod)上的键值对,用于标识对象的特定属性,是进行筛选和分组的核心手段。
-
Controller(控制器):通过管理Pod模板来维护应用的期望状态。
Deployment:最常用的控制器,用于部署无状态应用,它管理ReplicaSet,并提供滚动更新、回滚等强大功能。
ReplicaSet:确保指定数量的Pod副本始终在运行通常由Deployment自动创建和管理,一般不需要直接操作。
StatefulSet:用于部署有状态应用(如MySQL),它为Pod提供稳定的标识符、有序的部署和扩展、稳定的持久化存储。
DaemonSet:确保每个Node上都运行一个指定的Pod副本,用于运行集群级别的守护进程,如日志收集器(Fluentd)。
Job/CronJob:用于运行一次性任务或定时任务,任务完成后Pod即退出。
-
Service:服务发现与负载均衡的核心,定义一个访问Pod的逻辑集合(通常由Label选择器确定)的策略,Service有稳定的IP地址和DNS名称,无论后端的Pod如何重启、迁移,访问方式都保持不变。类型包括:
ClusterIP:默认类型,仅在集群内部可访问。
NodePort:通过每个节点的IP和静态端口暴露服务。
LoadBalancer:使用云服务商提供的负载均衡器对外暴露服务。
-
Ingress:管理外部访问集群服务的API对象,通常是HTTP/HTTPS流量,提供了比Service
LoadBalancer
更强大的功能,如基于域名和路径的路由、SSL终止等,需要配合Ingress Controller(如Nginx, Traefik)使用。
-
-
存储类:
- Volume:卷,解决了Pod内容器共享数据以及数据持久化的问题,但Volume的生命周期与Pod绑定。
- PersistentVolume:集群级别的存储资源,由管理员预先配置(如NFS卷、云存储盘)。
- PersistentVolumeClaim:用户对存储资源的申请,Pod通过PVC来使用PV,从而实现了存储与Pod的解耦,使得Pod可以随意调度而不担心数据丢失。
-
配置与安全类:
- Namespace:命名空间。在物理集群内部提供虚拟的隔离,用于将资源划分到不同的项目、团队或环境(如
dev
,prod
)。 - ConfigMap:用于将非机密的配置数据(如配置文件、环境变量)与应用代码分离。
- Secret:用于存储敏感信息,如密码、令牌、密钥。数据以Base64编码存储,提供一定的安全性。
- Namespace:命名空间。在物理集群内部提供虚拟的隔离,用于将资源划分到不同的项目、团队或环境(如
Kubernetes安装配置指南
核心安装方案详解
- 创建TLS证书和秘钥:需要为etcd、API Server、kubelet等各个组件以及管理员分别创建证书,并确保它们被正确的CA签名。。
- 部署高可用的etcd集群:在多个节点上部署etcd,配置其对等证书加密通信,并组成集群,这是整个集群的“数据库”,必须先部署。
- 部署Master组件(控制平面):
- API Server:配置其连接etcd的证书、服务端证书、以及用于认证的token文件等。
- Controller Manager:配置其kubeconfig文件以安全地访问API Server。
- Scheduler:同样配置其kubeconfig文件。
- 这些组件通常通过
systemd
守护进程来管理。
- 部署Node组件:
- kubelet:配置最复杂。需要其bootstrap kubeconfig文件(用于首次申请证书)、证书轮换、连接容器运行时等参数。
- kube-proxy:配置其kubeconfig文件以访问API Server。
- 部署集群插件:同样需要手动部署DNS和网络插件。
关键配置与运维指南
- 使用私有镜像库:企业环境中通常使用私有Harbor或Nexus仓库。
- 需要在所有节点上登录私有仓库(
docker login
)。 - 创建Kubernetes Secret,并在Pod定义中通过
imagePullSecrets
字段引用它,这样kubelet才有权限拉取私有镜像。
- 需要在所有节点上登录私有仓库(
- Kubernetes的版本升级:
- 介绍如何安全地进行集群升级,通常遵循“先Master,后Node”的顺序。
- 对于kubeadm集群,会介绍
kubeadm upgrade
命令的使用。 - 强调升级前一定要备份etcd和数据。
- CRI详解:
- 解释容器运行时接口的概念。Kubernetes并不直接操作Docker,而是通过CRI这个抽象接口与容器运行时交互。
- 这使得Kubernetes可以支持多种运行时(Docker, containerd, CRI-O)。书中会解释如何配置kubelet来使用不同的CRI。
- kubectl命令行工具用法详解:
- 语法格式:
kubectl [command] [TYPE] [NAME] [flags]
- 常用命令:
get
,describe
,create
,apply
,delete
,logs
,exec
。 - 输出格式:
-o wide
,-o yaml
,-o json
,-o name
等。 - kubectl补全:如何启用bash/zsh的自动命令补全功能,极大提升效率。
- 语法格式: