k8s基础概念
Kubernetes(简称k8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展、运维和管理。以下是k8s的核心知识点整理:
一、核心概念
-
Pod
- k8s的最小部署单元,包含一个或多个紧密关联的容器(共享网络、存储和生命周期)。
- 每个Pod有唯一IP,容器间通过
localhost
通信,Pod重启后IP可能变化。
-
Service
- 定义Pod的访问方式,为动态变化的Pod提供固定访问点(IP:端口)。
- 类型:
ClusterIP
(集群内部访问)、NodePort
(节点端口暴露)、LoadBalancer
(云厂商负载均衡)、ExternalName
(映射外部域名)。
-
Deployment
- 声明式管理Pod和ReplicaSet,支持滚动更新、版本回滚、扩缩容。
- 不直接创建Pod,而是通过管理ReplicaSet来间接管理Pod。
-
ReplicaSet
- 确保集群中始终运行指定数量的Pod副本,用于维持Pod可用性(Deployment会自动创建ReplicaSet)。
-
StatefulSet
- 用于部署有状态应用(如数据库),每个Pod有稳定的名称、网络标识和持久存储,支持有序部署/扩缩容、有序删除。
-
DaemonSet
- 确保所有(或指定)节点运行相同的Pod,常用于日志收集(如fluentd)、监控代理(如prometheus-node-exporter)。
-
ConfigMap/Secret
- ConfigMap:存储非敏感配置数据(如环境变量、配置文件),可被Pod挂载或注入环境变量。
- Secret:存储敏感信息(如密码、证书),数据会base64编码(非加密,需配合RBAC或外部密钥管理增强安全)。
-
Namespace
- 用于隔离集群资源(如开发、测试、生产环境),不同Namespace的资源名称可重复,默认有
default
、kube-system
等。
- 用于隔离集群资源(如开发、测试、生产环境),不同Namespace的资源名称可重复,默认有
二、核心组件(架构)
k8s集群由控制平面(Control Plane) 和节点(Node) 组成。
1. 控制平面组件(管理集群状态)
- API Server:所有操作的统一入口(RESTful API),负责认证、授权、数据验证和集群状态存储。
- etcd:分布式键值数据库,存储集群所有状态(唯一的存储组件)。
- Scheduler:根据节点资源(CPU/内存)、亲和性规则等,将Pod调度到合适的节点。
- Controller Manager:运行各种控制器进程(如Deployment控制器、Node控制器、Service控制器等),确保集群状态符合预期。
- Cloud Controller Manager:对接云服务提供商(如AWS、GCP)的API,管理云资源(如负载均衡、存储)。
2. 节点组件(运行容器的工作节点)
- kubelet:在每个节点上运行,确保容器按照Pod规范(yaml定义)运行,向API Server汇报节点和Pod状态。
- kube-proxy:在每个节点上运行,维护节点网络规则(如Service的负载均衡、Pod间通信),支持iptables或IPVS模式。
- 容器运行时:负责运行容器的软件,如containerd、CRI-O(需符合k8s的CRI规范)。
三、网络模型
k8s网络遵循三大原则:
- 每个Pod有唯一的IP地址;
- Pod之间可直接通信(无需NAT);
- Pod内容器共享网络命名空间(localhost通信)。
- 网络插件:需通过CNI(容器网络接口)插件实现,常用插件:
- Flannel:简单的Overlay网络,适合小规模集群;
- Calico:基于BGP的三层网络,支持网络策略(NetworkPolicy);
- Weave Net:自带DNS和网络策略,部署简单。
四、存储
-
临时存储
emptyDir
:Pod生命周期内的临时目录,Pod删除后数据丢失(如容器间共享临时文件)。
-
持久存储
- PersistentVolume(PV):集群级别的存储资源(由管理员创建),独立于Pod生命周期。
- PersistentVolumeClaim(PVC):用户对存储的“请求”,绑定到符合条件的PV后即可被Pod使用。
- StorageClass:动态创建PV的模板,无需管理员手动创建PV(如对接云存储自动生成)。
五、调度与亲和性
- 调度策略:Scheduler根据节点标签、Pod资源请求(requests)、节点污点(Taint)和Pod容忍度(Toleration)等选择节点。
- 亲和性/反亲和性:
- 节点亲和性(NodeAffinity):Pod倾向于调度到特定标签的节点(如“GPU=yes”);
- Pod亲和性(PodAffinity):Pod倾向于与特定标签的Pod调度到同一节点/拓扑域(如服务A和服务B需近距离通信);
- 反亲和性:避免Pod调度到特定节点或与特定Pod共处(如避免单节点故障导致服务不可用)。
六、自动伸缩
-
Horizontal Pod Autoscaler(HPA)
- 根据CPU使用率、内存使用率或自定义指标(如QPS)自动调整Pod副本数量(扩缩容)。
-
Vertical Pod Autoscaler(VPA)
- 自动调整Pod的资源请求(requests)和限制(limits),适用于资源需求变化大的应用(需重启Pod生效)。
七、常用操作(kubectl命令)
- 查看资源:
kubectl get pods/deployments/services/namespaces
- 创建资源:
kubectl create -f xxx.yaml
或kubectl apply -f xxx.yaml
(推荐,支持更新) - 查看详情:
kubectl describe pod <pod-name>
- 查看日志:
kubectl logs <pod-name>
- 进入容器:
kubectl exec -it <pod-name> -- /bin/bash
- 扩缩容:
kubectl scale deployment <deploy-name> --replicas=3
八、应用部署流程
- 编写Deployment yaml(定义Pod模板、副本数等);
- 通过
kubectl apply -f deployment.yaml
部署应用; - 编写Service yaml(关联Deployment的标签),暴露应用访问入口;
- (可选)配置Ingress实现HTTP/HTTPS路由、域名绑定;
- (可选)配置HPA实现自动扩缩容。
以上是k8s的核心知识点,掌握这些可以应对大部分基础运维和部署场景。深入学习可进一步研究网络策略、RBAC权限控制、自定义资源(CRD)等高级特性。