Kubernetes 简介

一、核心架构:大脑与肌肉的分工
Kubernetes集群采用经典的主从架构,您可以将其理解为一个高效的现代化公司。
-
控制平面:公司的“大脑”
它负责做出所有决策,管理集群的期望状态,通常由一个或多个Master节点组成。核心组件包括:
-
kube-apiserver:集群的统一入口。所有内部组件、用户指令(
kubectl)都必须通过它来与集群交互,它负责认证、授权和校验请求。 -
etcd:集群的配置数据库。一个高可用的键值存储,持久化保存着整个集群的所有关键数据(如有哪些Pod、Service等),是集群状态的唯一真相源。
-
kube-scheduler:调度专员。监视新创建的Pod,并根据资源需求、策略等,为它们选择一个最合适的工作节点运行。
-
kube-controller-manager:运维监控中心。内部运行着多种控制器(如Node Controller, Deployment Controller),持续对比“当前状态”与“期望状态”,发现偏差(如Pod副本数不足)就驱动集群恢复到期望状态。
-
cloud-controller-manager:与特定云服务商(如AWS、阿里云)交互的接口人,用于管理负载均衡器、存储卷等云资源。
-
-
工作节点:公司的“肌肉”
它们负责执行“大脑”下达的任务,是实际运行业务容器的地方,也称为Worker节点或Node。每个节点上运行着:
-
kubelet:节点的现场管理员。负责与kube-apiserver保持通信,管理本节点上Pod的生命周期(创建、停止容器等),并报告节点和Pod的状态。
-
kube-proxy:节点的网络代理。维护节点上的网络规则,实现Service的负载均衡,让Pod之间、外部与Pod之间能够网络通信。
-
容器运行时:容器引擎。负责真正从镜像运行起容器,例如
containerd或CRI-O。
-
工作节点上最核心的组件就是 kubelet,当然还有底层的容器运行时,比如 Docker,其中 kubelet 就是主要来实现和底层的容器运行时进行通信的,这个通信的过程也被 Kubernetes 抽象成了一个 CRI(Container Runtime Interface)的远程调用接口,这个接口里面定义了容器运行时的所有标准操作,比如创建容器、删除容器等等。所以对于 Kubernetes 来说他根本不关心你部署的到底是什么容器运行时,只要你这个容器运行时可以实现 CRI 接口就可以被 Kubernetes 来管理。
二、核心概念与资源:您需要管理的对象
在Kubernetes中,一切都被抽象为资源,您通过编写YAML或JSON文件(称为“清单”)来声明这些资源的期望状态。
| 资源类型 | 角色与作用 | 运维关注点 |
| Pod | 最小的可部署单元,像一个“信封”,包含一个或多个紧密关联、共享资源的容器 | 通常不直接部署裸Pod,而是通过控制器管理 |
| Deployment | 无状态应用的管家。定义Pod的副本数、更新策略(滚动更新),并提供一键回滚能力,是最常用的控制器 | 滚动更新策略、健康检查、资源限制 |
| StatefulSet | 有状态应用(如MySQL、Redis集群)的管家。为Pod提供稳定的标识符、有序部署和独立的持久化存储 | 顺序性、稳定的网络标识、持久卷绑定 |
| DaemonSet | 确保每个节点(或符合条件的节点)都运行一个Pod副本,常用于日志收集(如Fluentd)、节点监控(如Node Exporter) | 节点亲和性、资源消耗 |
| Service | 服务的稳定访问入口。为一组功能相同的Pod(通常由Deployment管理)提供一个固定的虚拟IP(ClusterIP)和DNS名,并负责负载均衡 | 类型(ClusterIP/NodePort/LoadBalancer)、服务发现 |
| ConfigMap & Secret | 实现配置与程序分离。ConfigMap存储普通配置(如配置文件),Secret存储敏感信息(如密码)。它们可以被挂载到Pod中作为文件或环境变量使用 | ConfigMap/Secret的更新与热加载、Secret的加密 |
| PersistentVolume (PV) & PersistentVolumeClaim (PVC) | 持久化存储方案。PV是管理员准备的存储资源,PVC是Pod对存储的申请。Pod通过PVC使用PV,从而实现数据持久化 | 存储类别(StorageClass)、访问模式、回收策略 |
| Namespace | 集群内部的虚拟隔离空间。用于将集群资源分配给不同的租户、环境(如dev, prod)或项目,实现逻辑隔离 | 资源配额(ResourceQuota)、网络策略 |
三、常用kubectl命令
| 功能 |
命令示例 | 说明 |
| 应用配置 | kubectl apply -f nginx-deployment.yaml | 创建或更新资源 |
|
查看资源 | kubectl get pods -n <namespace> | 查看Pod列表 |
|
kubectl get deployments,svc | 同时查看Deployment和Service | |
| 排查问题 | kubectl describe pod <pod-name> | 查看Pod的详细事件和状态 |
| kubectl logs <pod-name> -c <container-name> | 查看容器日志 | |
| kubectl exec -it <pod-name> -- /bin/sh | 进入容器内部调试 | |
| 管理发布 | kubectl rollout status deployment/nginx-deployment | 查看滚动更新状态 |
| kubectl rollout undo deployment/nginx-deployment | 回滚到上一个版本 |
四、资源配置实战:从YAML到命令
编写YAML清单:一个简单的Deployment示例,它部署了一个Nginx应用,并包含了ConfigMap和Secret的使用雏形。
# 定义一个ConfigMap,存储nginx配置
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
nginx.conf: |
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
---
# 定义一个Secret,存储一个密码(示例,实际需用base64编码)
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
# 示例密码 "123456",实际命令:echo -n "123456" | base64
password: MTIzNDU2
---
# 部署应用的核心:Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 期望维持3个Pod副本
selector:
matchLabels:
app: nginx
template: # 这里定义Pod模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx-container
image: nginx:1.25
ports:
- containerPort: 80
# 将ConfigMap中的配置作为文件挂载到容器内
volumeMounts:
- name: config-volume
mountPath: /etc/nginx/conf.d/
# 将Secret中的密码作为环境变量注入
env:
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
volumes:
- name: config-volume
configMap:
name: nginx-config
---
# 创建一个Service,暴露Nginx服务供集群内部访问
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx # 选择标签为app=nginx的Pod
ports:
- protocol: TCP
port: 80 # Service的端口
targetPort: 80 # Pod的端口
type: ClusterIP
更多推荐



所有评论(0)