Kubernetes 核心组件详解与基础命令
让我用开餐厅的比喻,帮你彻底理解这些组件之间的关系:

记忆技巧
"三层楼"模型
三层楼:Ingress (招牌) ← 顾客访问
二层楼:Service (前台) ← 内部路由
一层楼:Deployment (经理) ← Pod (员工) ← ConfigMap/Secret (手册)
地下室:PVC/PV (仓库)
"餐厅运营"口诀
招员工(Pod)靠经理(Deployment)
找员工靠前台(Service)
员工知识靠手册(ConfigMap/Secret)
员工储物靠仓库(PVC/PV)
顾客进门靠招牌(Ingress)
"创建顺序"口诀
先有手册(ConfigMap/Secret)和仓库(PV/PVC)
再招员工(Pod)和管理(Deployment)
然后设前台(Service)
最后挂招牌(Ingress)
Pod - 最小部署单元
Pod的含义:Kubernetes中的最小计算单元,包含一个或多个紧密相关的容器
Pod的作用:
-
运行应用容器
-
为容器提供共享网络和存储空间
-
容器生命周期的管理
Pod的使用场景:
-
运行单个容器应用
-
运行需要共享资源的多个容器(如主应用+日志收集器)
-
临时任务或一次性作业
Pod的基础命令
bash
# 查看所有Pod
kubectl get pods
# 查看Pod详情
kubectl describe pod <pod-name>
# 创建Pod(通过YAML文件)
kubectl apply -f pod.yaml
# 查看Pod日志
kubectl logs <pod-name>
# 进入Pod容器
kubectl exec -it <pod-name> -- /bin/bash
# 删除Pod
kubectl delete pod <pod-name>
# 简单Pod YAML示例
cat > nginx-pod.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
EOF
Deployment - Pod的控制器
Deployment的含义:管理Pod副本集的更高级抽象,确保指定数量的Pod始终运行
Deployment的作用:
-
声明式管理Pod副本数量
-
自动故障恢复(自愈)
-
滚动更新和回滚
-
版本控制
使用场景:
- 无状态应用的部署(如Web服务器)
- 需要高可用的服务
- 需要平滑升级的应用
Deployment的基础命令:
bash
# 创建Deployment
kubectl create deployment nginx --image=nginx:latest
# 查看Deployment
kubectl get deployments
# 查看Deployment详情
kubectl describe deployment <deployment-name>
# 扩展副本数
kubectl scale deployment nginx --replicas=3
# 更新镜像(触发滚动更新)
kubectl set image deployment/nginx nginx=nginx:1.19
# 查看更新状态
kubectl rollout status deployment/nginx
# 回滚到上一版本
kubectl rollout undo deployment/nginx
# 查看历史版本
kubectl rollout history deployment/nginx
# Deployment YAML示例
cat > nginx-deployment.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
EOF
Service - 服务发现与负载均衡
Service的含义:为一组Pod提供稳定的网络访问端点
Service的作用:
- 服务发现:通过DNS名称访问
- 负载均衡:流量分发到多个Pod
- 抽象:隐藏Pod的IP变化
Service的类型:
- ClusterIP(默认):集群内部访问
- NodePort:节点端口暴露
- LoadBalancer:云提供商负载均衡器
- ExternalName:外部服务别名
Service的使用场景:
- 微服务间的通信
- 外部访问集群内服务
- 负载均衡多个Pod实例
Service的基础命令:
bash
# 创建Service
kubectl expose deployment nginx --port=80 --type=ClusterIP
# 查看Service
kubectl get services
kubectl get svc
# 查看Service详情
kubectl describe service <service-name>
# 端口转发(临时外部访问)
kubectl port-forward service/nginx 8080:80
# 创建NodePort Service
kubectl expose deployment nginx --port=80 --type=NodePort
# Service YAML示例
cat > nginx-service.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
type: ClusterIP
EOF
ConfigMap - 配置管理
ConfigMap的含义:存储非敏感配置数据的键值对
ConfigMap的作用:
- 将配置与容器镜像分离
- 动态更新应用配置
- 支持多种使用方式(环境变量、配置文件)
ConfigMap的使用场景:
- 应用配置文件(如application.properties)
- 环境变量配置
- 命令行参数
ConfigMap的基础命令:
bash
# 从文件创建ConfigMap
kubectl create configmap app-config --from-file=config.properties
# 从字面值创建
kubectl create configmap app-config --from-literal=LOG_LEVEL=DEBUG
# 查看ConfigMap
kubectl get configmaps
kubectl get cm
# 查看内容
kubectl describe configmap app-config
kubectl get configmap app-config -o yaml
# 更新ConfigMap
kubectl edit configmap app-config
# 删除ConfigMap
kubectl delete configmap app-config
# ConfigMap使用示例
cat > configmap-demo.yaml <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
# 属性方式
log.level: "INFO"
app.name: "MyApp"
# 配置文件方式
application.properties: |
server.port=8080
db.host=database
db.port=5432
EOF
Secret - 敏感信息管理
Secret的含义:存储敏感数据(密码、令牌、密钥)
Secret的作用:
- 安全存储敏感信息
- 自动Base64编码
- 多种类型支持(Opaque、TLS、docker-registry)
Secret的使用场景:
- 数据库密码
- API密钥
- TLS证书
- Docker registry认证信息
Secret的基础命令:
bash
# 从文件创建Secret
kubectl create secret generic db-secret --from-file=./password.txt
# 从字面值创建
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password='S3cr3t!'
# 创建TLS Secret
kubectl create secret tls tls-secret \
--cert=./tls.crt \
--key=./tls.key
# 查看Secret
kubectl get secrets
# 查看内容(注意:值是Base64编码的)
kubectl get secret db-secret -o yaml
# 解码查看
kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 --decode
# 删除Secret
kubectl delete secret db-secret
# Secret使用示例
cat > secret-demo.yaml <<EOF
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # admin
password: UzNjcjN0IQ== # S3cr3t!
EOF
存储基础
PV(PersistentVolume)- 持久卷
PV的含义:集群中的存储资源,由管理员预先配置
PV的作用:
- 提供独立于Pod生命周期的存储
- 抽象底层存储细节
- 支持多种存储后端(NFS、云存储、本地存储)
PV的使用场景:
- 数据库持久化存储
- 文件共享
- 日志持久化
PVC(PersistentVolumeClaim)- 持久卷声明
PVC的含义:用户对存储资源的请求
PVC的作用:
- 为用户申请存储空间
- 绑定到合适的PV
- 在Pod中作为卷使用
PV和PVC的基础命令:
bash
# 查看PV和PVC
kubectl get pv
kubectl get pvc
# 查看详情
kubectl describe pv <pv-name>
kubectl describe pvc <pvc-name>
# 删除PVC(通常会自动删除对应PV的数据)
kubectl delete pvc <pvc-name>
# PV和PVC示例
cat > storage-demo.yaml <<EOF
---
# 1. 先定义PV(通常由管理员创建)
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: "/mnt/data"
---
# 2. 用户申请PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: manual
---
# 3. 在Deployment中使用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
EOF
Ingress - 外部访问入口
Ingress的含义:管理外部访问集群内部服务的HTTP/HTTPS路由规则
Ingress的作用:
- 基于域名或路径的路由
- TLS/SSL终止
- 负载均衡
- 外部访问的统一入口
重要:Ingress需要Ingress Controller才能工作(如Nginx Ingress Controller)
Ingress的使用场景:
- 一个IP多个应用(基于域名区分)
- HTTPS网站
- 复杂的路由规则
Ingress 的基础命令:
bash
# 查看Ingress
kubectl get ingress
kubectl get ing
# 查看Ingress详情
kubectl describe ingress <ingress-name>
# 创建Ingress Controller(以Nginx为例)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
# Ingress示例
cat > ingress-demo.yaml <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# TLS配置
tls:
- hosts:
- myapp.example.com
secretName: tls-secret
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend-service
port:
number: 8080
EOF