k8s
1 · k8s#
S 什么场景 写代码,在一台机器上运行 -> Docker 打包(解决环境一致性问题)-> Docker Compose (管理多个容器,但单机) C 什么冲突 多机器?自动扩容缩容?故障自动恢复? Q 什么问题 需要一个”跨多机器的容器编排系统” A 回答问题 Node(节点,运行容器的机器),Pod(调度最小单位,包含1或多个容器),Cluster(集群,一堆节点+一个控制系统),ControlPlane(控制平面,按spec自动管理)
minikube管理node,kubectl管理pod
1.1 · 基础概念
1.1.1 · Node#
定义:Node 是 K8s 集群中的工作节点,本质上就是一台机器,可以是物理机也可以是虚拟机,负责真正运行 Pod。
场景:一个集群通常由多个 Node 组成,调度器会把 Pod 分配到某个 Node 上运行。
1.2 · 架构
k8s架构:控制面/数据面,集群内少数节点用作控制面(管理)、其他大部份节点用作数据面(业务) 控制面节点称作master node、数据面节点称作worker node
master 内组件:
- apiserver: k8s系统入口,提供了一系列的RESTful api
- etcd: kv储存各种资源对象和状态
- scheduler: 容器编排
- controller-manager: 维护容器和节点
node 内组件:
- kubelet: 代理node,负责绝大多操作,只有这个可以和apiserver通信
- kube-proxy: node的网络代理,负责网络通信,转发TCP/UDP(已被容器化)
- container-runtime: 管理pod的生命周期,可以是docker/podman/containerd等
1.3 · kubectl 常用命令#
# 列出所有资源对象
kubectl api-resources
# 解释对应对象
kubectl explain $RESOURCE
# 获取对象实例
kubectl get $RESOURCE
# 详细信息
kubectl describe $RESOURCE
# 按命令生成资源
kubectl create deployment my-nginx --image=nginx --dry-run=client -o yaml
# 或从清单创建/更新资源
kubectl apply -f manifest.yaml
1.4 · 工作负载
1.4.1 · Pod#
定义:K8s 中最小的调度单位,里面运行一个或多个容器。所有的 Kubernetes 资源都直接或者间接地依附在 Pod 之上。
场景:部署一个 Nginx 容器,或者让业务容器和日志采集容器放在同一个 Pod 中一起运行。
Pod 可以”挂载(mount)“多个 Volume,可以以 Volume 的方式使用 ConfigMap/Secret。
Pod 分配了域名:IP地址.名字空间.pod.cluster.local(需要把IP地址里的 . 改成 -)
1.4.2 · Deployment#
定义:用于管理无状态应用,负责 Pod 的副本数、滚动更新和回滚。
场景:部署 Web 服务、API 服务、前端页面这类可以随时横向扩容的应用。
template 嵌入 pod 定义,replicas 字段明确应用部署的”期望状态”。
1.4.3 · StatefulSet#
定义:用于管理有状态应用,Pod 有固定名称、稳定网络标识和持久化存储。
场景:部署 MySQL、Redis、Kafka 这类需要稳定身份和存储的服务。
1.4.4 · DaemonSet#
定义:保证每个节点上都运行且仅运行一个 Pod。
场景:部署日志采集、监控 Agent、节点安全组件。
污点(taint)容忍度(toleration):前者节点,后者容器,两者关联的部署策略。
1.4.5 · Job#
定义:用于执行一次性任务,任务成功完成后就结束。template 嵌入 Pod,从模板创建 pod。
场景:执行数据库迁移、批处理脚本、离线数据计算。
1.4.6 · CronJob#
定义:用于按时间周期创建 Job,相当于 K8s 里的定时任务。template 创建 Job,再 template 创建 Pod。
场景:每天凌晨备份数据库、每小时清理日志、定时生成报表。
1.5 · 配置中心
1.5.1 · ConfigMap#
定义:用于保存普通配置数据,比如配置文件、环境变量、启动参数。
场景:把服务地址、端口、功能开关等配置从镜像中分离出来。
1.5.2 · Secret#
定义:用于保存敏感信息,比如密码、Token、证书。
场景:给应用注入数据库密码、API Key、TLS 证书。
1.6 · 网络
1.6.1 · Service#
Service 是对 Pod IP 地址的抽象,四层负载均衡 https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
Kubernetes 会给它分配一个静态 IP 地址,自动管理、维护后面动态变化的 Pod。 本质上就是一个由 kube-proxy 控制的四层负载均衡,使用 iptables 技术在 TCP/IP 协议栈上转发流量。
本身不关联、管理 pod,和 Deployment 组合使用。
Service 对象的域名完全形式是”对象.名字空间.svc.cluster.local”
1.6.2 · Ingress#
七层负载均衡
作为流量的总入口,统管集群的进出口数据,“扇入""扇出”流量。
Ingress Controller: 与上层业务关系密切,社区自己实现
- https://github.com/kubernetes/ingress-nginx
- https://github.com/nginx/kubernetes-ingress
- https://github.com/Kong/kubernetes-ingress-controller
Ingress Class: 插在 Ingress 和 Ingress Controller 中间,解耦。
1.7 · 数据持久化
PersistentVolume, StatefulSet
1.8 · 应用管理
- 滚动更新 kubectl apply 即可,回滚 kubectl rollout
- 资源配额、检查探针
1.9 · 集群管理
ResourceQuota