K8s
kubernetes核心概念
1 有了docker 什么要用kubernetes
2 多容器跨主机提供服务
3 多容器分布节点部署
4 多容器的升级
5 高效管理容器
docker管理工具
Docker compose, docker machine, docker swarm
常见的容器编排工具:
kubernetes google伯格系统
swarm 2018已经被docker废弃
mesos marathon 容器编排组件
Kubernetes简介:
Kubernetes(简称 K8s,8 代表 k 和 s 中间的 8 个字母 ubernete),是 Google 开源的容器编排平台,使用 Go 语言开发,基于 Google 内部 Borg 系统演化而来,现在属于 CNCF 云原生基金会毕业项目,是容器编排的事实工业标准。
核心作用:管理大规模 Docker 等容器,实现容器自动化部署、扩缩容、故障自愈,把一堆服务器抽象成一个大资源池。
解决什么问题:
Docker 只解决了单个容器打包、运行;
当几十、上百个容器分布在多台服务器时,手动管理会遇到很多痛点:
1.容器挂掉需要手动重启
2.流量大了手动增加实例,流量下降手动减少
3.容器漂移 IP 变化,访问如何统一
4.多机器容器调度、版本滚动升级、回滚
5.存储、网络统一管理
K8s 就是用来自动化处理以上全部工作。
关键能力:
自愈:容器崩溃、节点宕机,自动重建 Pod
弹性伸缩 HPA:依据 CPU / 内存 / 自定义指标自动增减 Pod 副本
滚动升级 & 回滚:新版本逐步替换旧实例,出问题一键回滚
服务发现与负载均衡:内置 Service 实现内部负载均衡
存储编排:自动挂载本地、云存储
资源限制:给 Pod 设置 CPU、内存 request/limit,防止资源抢占
声明式 API:写 yaml 定义期望状态,K8s 自动向该状态靠拢,不是命令式操作。
和 OpenStack 区别:
OpenStack:IaaS,管理虚拟机、网络、存储,管理虚机生命周期
K8s:容器编排平台,管理容器;可以跑在虚拟机、物理机、云上。
对比项 | Kubernetes(K8s) | OpenStack |
定位 | 容器编排平台(CNCF) | IaaS 基础设施云平台 |
管理对象 | 容器 (Pod),应用层 | 虚拟机、裸金属、网络、块存储,硬件基础设施层 |
核心资源 | Pod、Deployment、Service、PV/PVC | VM 实例、Nova、Neutron、Cinder、Glance |
运行载体 | 物理机、虚拟机、公有云都可以跑 | 部署在物理服务器之上,产出虚拟机资源 |
生命周期 | 容器秒级启停,销毁重建是常态 | 虚拟机分钟级启动,倾向长期运行 |
网络模型 | Pod 网络,Service 服务发现,内部负载均衡 | 虚拟网络、子网、路由器、浮动 IP,虚拟机网络 |
存储 | PV/PVC 抽象,对接各类存储,给 Pod 使用 | Cinder 块存储、Swift 对象存储,给虚拟机挂载磁盘 |
高可用思路 | 应用自愈:Pod 异常自动重建、调度到其他节点 | 基础设施高可用:虚机 HA,节点故障虚拟机迁移 |
典型场景 | 微服务、云原生应用、CI/CD、容器化业务 | 私有云,批量创建虚拟机,传统业务上云,实训云环境 |
相互关系 | K8s 可以跑在 OpenStack 提供的虚拟机之上;OpenStack 也可以对接 K8s 做容器服务 | 给 K8s 提供底层虚拟机资源;也可独立使用 |
kubernetes架构与组件
核心架构(主从架构):
分为 Master 控制平面(控制节点) + Node 工作节点
控制平面(Master),集群大脑
kube‑apiserver:集群唯一入口,所有操作都走它,API 接口,鉴权校验,读写 etcd
etcd:分布式键值存储,保存集群全部数据(配置、状态),集群数据库
kube‑controller‑manager:各类控制器,维持资源期望状态,比如 Pod 挂了新建 Pod
kube‑scheduler:调度器,负责把 Pod 分配到合适的 Node 节点
Node 工作节点,真正跑业务容器
kubelet:每个节点代理,跟 Master 通信,管理本机 Pod 生命周期,保证 Pod 正常运行
kube‑proxy:网络代理,维护节点网络规则,实现 Service 访问、负载均衡
容器运行时:docker/containerd,真正执行容器启停
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中,一个nginx服务的安装请求会首先被发送到master节点的apiServer组件,apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上,此时它会从etcd中读取各个node节点的信息,然后按照特定的算法进行选择,并将结果告知apiServer,apiServer调用controller-manager去调度Node节点安装nginx服务,kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod,pod是kubernetes的最小操作单元,容器必须跑在pod中至此,一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理。这样外界用户就可以访问集群中的nginx服务了
k8s核心资源对象:
Pod:K8s 最小调度单元,一个 Pod 包含一个或多个紧密耦合容器,共享网络 / 存储;Pod 是临时的,可以随时销毁重建,IP 会变。
Deployment:无状态应用管理,管理 Pod 副本,支持滚动升级、回滚、副本扩缩,日常业务最常用。
StatefulSet:有状态应用(MySQL、Redis),稳定网络标识、稳定存储,有序启停。
DaemonSet:每个(或指定)Node 运行一个 Pod,比如日志采集、监控 agent。
Job/CronJob:一次性任务、定时任务。
Service:给一组 Pod 提供固定访问入口,负载均衡,屏蔽 Pod 动态 IP 变化,ClusterIP/NodePort/LoadBalancer 等类型。
ConfigMap / Secret:配置文件、敏感密码配置,解耦镜像和配置。
PV/PVC:存储抽象,持久化存储管理。
Namespace:命名空间,集群资源逻辑隔离,做项目、环境划分。
K8s 核心组件:
整体分为控制平面(Master) 和 工作节点(Node) 两大部分。
控制平面(集群大脑,管理整个集群)
kube‑apiserver
集群唯一 API 入口,所有 kubectl、yaml 操作都访问它;做鉴权、校验,负责读写 etcd,是集群的网关。
etcd
分布式键值数据库,保存集群全部状态数据(配置、节点信息、Pod 状态),集群唯一存储,必须高可用。
kube‑controller‑manager
控制器管理器,运行各类控制器,持续比对「期望状态」和「实际状态」。
例:Pod 崩溃就新建 Pod、节点故障回收资源。
kube‑scheduler
调度器,监听新创建未绑定节点的 Pod,根据资源、策略,挑选合适 Node 节点,把 Pod 调度过去。
可选组件:cloud‑controller‑manager,对接公有云厂商 API。
Node 工作节点(执行业务容器)
kubelet
每个工作节点上的代理程序。接收 apiserver 指令,管理本机 Pod:创建、销毁、监控 Pod 状态,上报节点状态给控制平面。
kube‑proxy
网络代理。维护节点上网络规则,实现 Service 的负载均衡、服务发现,转发访问 Pod 的流量。
容器运行时(Container Runtime)
真正启动容器的底层软件,如 containerd、docker。负责容器镜像拉取、容器启停。
除了核心组件,还有一些推荐的插件:
CoreDNS:可以为集群中的 SVC 创建一个域名 IP 的对应关系解析的 DNS 服务
Dashboard:为Kubernetes 集群提供了一个 B/S 架构的访问入口
Ingress Controller:官方只能够实现四层的网络代理,而 Ingress 可以实现七层的代理
Prometheus:给 Kubernetes 集群提供资源监控的能力
Federation: 提供一个可以跨集群中心多 Kubernetes 的统一管理功能,提供跨可用区的集群
Kubernetes集群部署
集群搭建示例:
首先规划节点
节点角色 | 主机名 | IP 地址 | 集群职责 | 组件 |
控制平面 | manager | 192.168.81.161 | 集群管理、调度、API 入口 | apiserver、etcd、controller-manager、scheduler |
工作节点 | work1 | 192.168.81.162 | 运行业务容器 | kubelet、kube-proxy、containerd |
工作节点 | work2 | 192.168.81.163 | 运行业务容器 | kubelet、kube-proxy、containerd |
并配置基础服务,调整基础设置/etc/hosts ipv4等等
关闭firewalld和selinux并关闭swap分区,之后验证
启动时间同步
启动模块并写入配置并检查配置是否写入参数成功
overlay
容器存储驱动,overlay2底层依赖,用来实现 docker/containerd 的镜像分层读写,没有该模块容器无法正常读写镜像。
br_netfilter
网桥过滤模块,让 iptables 可以对网桥内的数据包做转发过滤。K8s Service、kube‑proxy iptables 模式必须依赖。
所有节点配置k8s yum源
安装 containerd 容器运行时 + k8s 组件
生成默认配置文件并修改docker配置,之后检查并设置服务自启
第一条 sed
把 containerd 配置里的镜像地址 registry.k8s.io 替换为阿里云镜像仓库。
Rocky9 环境国内访问 k8s 官方镜像网络很差,不替换会 kubeadm init 镜像拉取失败。
分隔符用#而不是/,避免地址里的斜杠干扰 sed。
第二条 sed
SystemdCgroup = false → 修改成 SystemdCgroup = true
⚠️K8s 硬性要求:容器运行时 cgroup 驱动必须是 systemd。
安装kubeadm kubelet kubectl,版本统一v1.30.0
master 控制平面初始化
root 用户配置 kubeconfig
修改 flannel 配置,指定网卡 ens160,重启 flannel 网络组件并监控pod状态
在master节点生成hash串,在工作节点上进行认证
在master节点检验
此时集群已经成功创建并且状态良好
Ipvs和dashbroad的启用:
首先安装相关组件
启动相关模块并检验
修改配置文件
修改kebu-proxy
重建 kube‑proxy Pod 生效
验证ipvs模式是否生效
接下来部署 Kubernetes Dashboard
修改模式为NodePort
查看端口
创建admin.yaml
生成登录dashbroad时所使用的token
Dashboard 登录成功!集群可视化面板正常可用
示例:Deployment 管理 Nginx
创建 Deployment,3 副本 Nginx,Deployment 不会直接创建 Pod,它会先创建一个ReplicaSet(副本集),由 ReplicaSet 负责维持指定数量 Pod
查看此时pod的状态
查看此时pod是怎么分配的
扩容实验,新增 2 个 Pod,K8s 自动调度到空闲 worker 节点
对nginx镜像镜像升级
查看此时pod的状态
执行回滚(回到 revision=1,nginx1.24)
查看回滚历史
之后创建service暴露nginx端口并在 manager 节点测试访问
查看nginx服务关联哪些pod