K8s 核心资源对象概览
Kubernetes 通过各种资源对象来描述应用的期望状态。理解这些对象是使用 K8s 的基础。
Pod:最小调度单元
Pod 是 K8s 中最小的部署和调度单元,包含一个或多个容器:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
yaml
Pod 的核心特性:
- 共享网络命名空间(同一 Pod 内容器共享 IP)
- 共享存储卷
- 生命周期短暂,不保证 IP 不变
Deployment:声明式应用管理
Deployment 管理 ReplicaSet,实现声明式的应用更新和回滚:
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.25
ports:
- containerPort: 80
yaml
Deployment 的能力:
- 滚动更新(Rolling Update)
- 回滚到历史版本
- 扩缩容
Service:服务发现与负载均衡
Service 为一组 Pod 提供稳定的访问入口:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 80 # Pod 端口
type: ClusterIP # 默认类型
yaml
Service 类型:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| ClusterIP | 集群内部访问(默认) | 微服务间通信 |
| NodePort | 通过节点端口暴露 | 开发测试 |
| LoadBalancer | 云厂商负载均衡 | 生产环境 |
| ExternalName | DNS CNAME 映射 | 引用外部服务 |
ConfigMap 与 Secret:配置管理
# ConfigMap:非敏感配置
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_url: "postgres://db:5432/myapp"
log_level: "info"
---
# Secret:敏感信息(Base64 编码)
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64("admin")
password: cGFzc3dvcmQ= # base64("password")
yaml
Namespace:资源隔离
apiVersion: v1
kind: Namespace
metadata:
name: production
yaml
Namespace 用于多团队/多环境的资源隔离,不同 Namespace 中的资源相互独立。
资源对象关系图
Namespace
├── Deployment
│ └── ReplicaSet
│ └── Pod
│ └── Container
├── Service → Pod (通过 selector)
├── ConfigMap → Pod (通过环境变量/挂载)
├── Secret → Pod (通过环境变量/挂载)
└── Ingress → Service
text
常用 kubectl 命令
# 查看资源
kubectl get pods
kubectl get deployments
kubectl get services
# 描述资源详情
kubectl describe pod <pod-name>
# 创建/更新资源
kubectl apply -f deployment.yaml
# 删除资源
kubectl delete -f deployment.yaml
# 查看日志
kubectl logs <pod-name> -f
# 进入容器
kubectl exec -it <pod-name> -- /bin/bash
bash
↑