Kubernetes 核心概念与目标
- 定义:开源容器编排平台(K8s),自动化部署、扩缩容容器化应用。
- 目标:简化应用管理、提供弹性伸缩、保障服务可靠性。
Kubernetes集群安全性保障机制
Kubernetes集群需确保高安全性,以规避企业级服务部署中的重大风险,具体措施如下:
1 ) 身份认证
用户或服务访问集群资源前需通过严格认证,确保入口安全,支持两种核心方式:
- X.509 证书认证:基于数字证书验证身份
- 服务账号(ServiceAccount)认证:为 Pod 分配专用账号
未通过认证者禁止访问集群资源
2 ) 授权机制(RBAC)
认证通过后需二次授权控制资源访问权限,定义不同用户对资源的访问范围:
- 通过
Role和RoleBinding定义权限规则,绑定用户/服务账号与资源操作权限。 - 支持细粒度分类(如按命名空间隔离),确保最小权限原则。
3 ) 网络策略 (NetworkPolicy)
限制 Pod 间通信以提升网络安全性:
- 定义允许/拒绝特定 Pod 的访问规则(如基于标签选择器), 提升网络隔离性
- 示例策略:仅允许前端 Pod 访问后端服务。
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend
spec:
podSelector:
matchLabels:
role: frontend
ingress:
- from:
- podSelector:
matchLabels:
role: backend
4 ) 加密通信(Encrypted Communication)
保障集群内外数据传输安全:
- 默认启用 TLS 加密,保护 API Server 与组件间通信。
- 支持 HTTPS 证书及 Istio 等 Service Mesh 工具增强流量加密。
5 ) 敏感信息管理(Sensitive Data Handling)
通过 Secret 对象 存储加密敏感数据(如用户名/密码),避免明文暴露。
- 自动加密用户名、密码等敏感数据。
- 示例:将数据库密码注入 Pod 环境变量。
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: UEBzc3dvcmQxMjM= # Base64 编码
6 ) 安全上下文隔离(Security Context)
基于命名空间实现资源隔离:
- 不同服务部署于独立命名空间,防止权限越界。
- 通过
securityContext字段限制容器权限(如禁止 root 运行)。
7 ) 日志审计 (Audit Logging)
记录所有集群操作日志,支持事故溯源与合规审查。
- 存储 API Server 操作日志(如创建/删除资源)。
- 故障时快速定位异常操作来源。
yaml
# RBAC授权示例
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
Namespace 的核心作用
命名空间(Namespace)是资源隔离的核心机制:
1 )资源隔离
将不同服务(如开发/测试/生产环境)隔离至独立命名空间,避免资源冲突。
2 )环境隔离
单集群内划分多环境(如 dev/prod),确保环境独立性, 共享底层资源但逻辑隔离。
3 ) 监控与资源限制
精细化监控特定命名空间的服务,并实施资源配额(如 CPU/内存限制)。
- 监控时仅需关注特定命名空间(如
kubectl top pod -n dev)。 - 通过
ResourceQuota限制命名空间的 CPU/内存用量。
yaml
Namespace定义示例
apiVersion: v1
kind: Namespace
metadata:
name: production
Pod 基础概念与高级调度
1 ) Pod 的本质
- Kubernetes 最小部署单元,封装一个或多个容器。
- 最佳实践:单 Pod 单容器(简化日志排查与生命周期管理)。
Pod 是最小部署单元,关键特性如下:
- 基础单元: 用于部署应用容器,单 Pod 通常运行单容器。
- 多容器场景: 支持多容器共存,但仅限于强关联服务(如日志收集 sidecar),否则增加排查复杂度。
- 管理优化: 单容器 Pod 简化日志查看与故障定位。
2 ) 静态 Pod(Static Pod)
-
特殊 Pod,不受 API Server 管理,由
kubelet直控。 -
核心用途:部署集群依赖的基础服务(如 CNI 网络插件、CoreDNS),确保其独立于控制平面启动。
-
静态 Pod 不受 API Server 管理,由 kubelet 直接管控:
- 核心服务启动:用于集群启动依赖的核心服务(如 CNI 网络插件/DNS),在 API Server 不可用时仍可运行。
- 避免依赖循环:解决核心服务与 API Server 的启动顺序矛盾。
bash静态Pod配置路径(kubelet默认) /etc/kubernetes/manifests/
3 ) Pod 调度策略
| 策略类型 | 作用 | 示例场景 |
|---|---|---|
| 节点亲和性 | 将 Pod 部署至符合条件的节点(如 SSD 磁盘节点) | 高性能计算服务 |
| 节点反亲和性 | 避免 Pod 共置同一节点(如高可用部署) | 分布式数据库 |
| 资源请求/限制 | 通过 requests 和 limits 约束资源用量 |
防止单个 Pod 耗尽节点资源 |
常见调度策略包括:
-
预选/优选策略(Predicates/Priorities)
- 过滤节点并打分排序。
-
亲和性与反亲和性
- 节点亲和性(Node Affinity):将 Pod 调度至同一节点。
- 反亲和性(Anti-Affinity):避免 Pod 共处同一节点。
-
资源请求与限制
- 通过
requests/limits影响节点选择。
yaml亲和性配置示例 apiVersion: apps/v1 kind: Deployment spec: template: spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["web"] topologyKey: kubernetes.io/hostname - 通过
4 ) Pod 删除流程
删除操作遵循严格流程:
- 触发删除请求:通过命令行、API 或控制器发起指令。
- 更新 Pod 状态:API Server 将状态设为 Terminating。
- 发送终止信号:向容器发送 SIGTERM 信号,启动优雅关闭(默认等待 30 秒)。
- 强制终止(可选):超时后发送 SIGKILL。
- 释放资源:回收 CPU/内存/数据卷。
- 删除数据库对象:从 etcd 移除记录。
触发删除请求 API Server 更新 Pod 状态为 Terminating 向容器发送 SIGTERM 终止信号 等待优雅关闭(默认 30 秒) 强制终止(可选) 释放资源(CPU/内存/存储卷) 从 etcd 删除对象记录
5 )Pod 资源限制定义
通过 requests 和 limits 管控资源:
- requests:Pod 启动所需最小资源(保障性)。
- limits:允许使用的最大资源(防止资源抢占)。
yaml
资源限制示例
apiVersion: v1
kind: Pod
spec:
containers:
- name: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
标签(Label)与标签选择器(Selector)
- 标签:键值对(如
app: frontend),用于资源分类与标识。 - 标签选择器:筛选特定资源(如过滤
env=prod的 Pod)。
作用:支持资源分组、查询与批量操作。
yaml
# 标签选择器示例
apiVersion: v1
kind: Pod
metadata:
labels:
app: frontend
env: production
或
yaml
标签选择器示例
selector:
matchLabels:
env: prod
Service 与网络通信机制
1 ) Service 域名解析格式
Service 域名遵循标准结构:
bash
<Service名称>.<命名空间>.svc.<集群域名>
# 或
<Service名称>.<命名空间>.svc.cluster.local
# 示例
frontend-service.dev.svc.cluster.local
- 同命名空间:直接使用 Service 名称访问
- 跨命名空间:需包含命名空间(如
backend.production.svc.cluster.local)
2 ) Pod 与 Service 通信流程
- Service 作用:作为 Pod 组的负载均衡入口,分配 虚拟 IP(ClusterIP)。
- 标签匹配:Service 通过 Label Selector 关联后端 Pod。
- 流量转发:kube-proxy 基于 iptables 或 IPVS 实现流量路由。
- Endpoint:动态维护 Service 后端 Pod 的 IP:Port 列表。
- 流量代理:kube-proxy 实现流量转发(支持
iptables或IPVS模式)。
请求 Service IP 标签选择器匹配后端 Pod IPVS/iptables 转发 Pod Service Endpoint TargetPod
示例
yaml
# Service定义示例
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 9376
3 ) 集群内应用访问外部服务
创建 ExternalName 类型 Service,映射外部地址:
yaml
apiVersion: v1
kind: Service
metadata:
name: external-db
spec:
type: ExternalName
externalName: mysql.database.example.com
4 )Service、Endpoint 与 kube-proxy 关系
- Service:提供负载均衡与稳定访问入口。
- Endpoint:维护后端 Pod 的 IP:Port 列表(动态更新)。
- kube-proxy:实现流量转发(iptables/IPVS 模式)。
数据持久化方案
| 持久化方式 | 特点 | 适用场景 |
|---|---|---|
emptyDir |
临时卷,随 Pod 销毁而删除 | 缓存或临时数据处理 |
hostPath |
挂载宿主机目录,数据持久化但依赖节点 | 节点级日志收集 |
| PV/PVC | 解耦存储供给(PV)与消费(PVC),支持 NFS/云存储等 | 数据库持久化 |
| ConfigMap/Secret | 分离配置与镜像,Secret 专用于敏感数据 |
应用配置与凭据管理 |
| StatefulSet | 为有状态应用提供稳定网络标识(如 MySQL) | 数据库集群 |
注:有状态服务避免直接部署于 Kubernetes,优先使用云托管数据库。
yaml
# PV/PVC示例
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 10Gi
nfs:
server: nfs-server.example.com
path: "/exports"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-web
spec:
resources:
requests:
storage: 5Gi
Deployment 扩容与缩容
1 ) 修改副本数并应用更新:
bash
kubectl scale deployment/nginx --replicas=5 # 命令行扩容
deployment/nginx:目标 Deployment 名称(此处为 nginx)。--replicas=5:指定期望的 Pod 副本数量(从当前值调整为 5)。-n <命名空间>(可选):若 Deployment 不在默认命名空间,需添加此参数指定命名空间(如 -n production)。
验证扩容结果:
bash
kubectl get deployment nginx -o wide # 查看副本数状态
kubectl get pods -l app=nginx # 筛选查看关联 Pod
输出示例:
bash
NAME READY UP-TO-DATE AVAILABLE AGE REPLICAS
nginx 5/5 5 5 10m 5
若 READY 列显示 5/5,表示 5 个 Pod 已全部就绪
自动扩容原理:
Kubernetes 的 Deployment Controller 会检测副本数变化,自动创建新 Pod 或终止多余 Pod。
新 Pod 由关联的 ReplicaSet 管理,确保副本数始终匹配期望值(此处为 5)
操作记录与审计:
添加 --record 参数记录操作历史,便于后续排查:
bash
kubectl scale deployment/nginx --replicas=5 --record
通过 kubectl rollout history deployment/nginx 可查看历史变更
2 ) 编辑 YAML:
yaml
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3 # 调整此值
YAML更新:调整replicas字段并执行kubectl apply
3 ) 在线编辑:kubectl edit deployment实时修改副本数
bash
kubectl edit deployment <Deployment名称> [-n <命名空间>]
<Deployment名称>:需替换为你的 Deployment 名称(如 nginx)。-n <命名空间>:可选,指定命名空间(默认是 default)。
关键参数:
-o yaml:以 YAML 格式编辑(推荐,清晰易读)。--save-config:将修改保存到注解中(便于审计)
流程:命令会拉取当前 Deployment 配置 → 在默认编辑器(如 Vim)中打开 → 修改后保存退出 → 集群自动应用变更
示例
bash
kubectl edit deployment nginx-deployment -o yaml
系统会用默认编辑器(如 Vim)打开该 Deployment 的 YAML 配置
- 定位并修改 replicas 字段:
- 在 YAML 文件中找到 spec.replicas 字段(通常在 spec 部分):
yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # 修改此值,例如改为 5
selector:
matchLabels:
app: nginx
template:
# ... 其他配置(如容器定义)
将 replicas: 3 改为 replicas: 5
保存并退出编辑器:
- Vim 操作:
- 按 i 进入编辑模式 → 修改数值 → 按 Esc 退出编辑 → 输入 :wq 保存退出。
- 保存后,系统自动提交变更到 Kubernetes 集群
验证变更效果
ts
kubectl get deployment nginx-deployment -o wide # 查看副本数
kubectl get pods -l app=nginx # 检查新 Pod 是否创建
4 ) 替代方案对比
| 方法 | 适用场景 | 特点 |
|---|---|---|
kubectl scale |
快速手动扩缩容 | 即时生效,无需编辑文件[1][5] |
kubectl edit |
需同步修改其他配置(如镜像、资源限制) | 直接编辑 Deployment 的 YAML 配置[1] |
kubectl apply -f |
基于版本控制的批量更新 | 需修改本地 YAML 文件后应用[1] |
HPA(自动扩缩容) |
动态响应流量变化 | 需配置 CPU/内存等指标阈值[1][18] |
ReplicaSet(RS)与 Deployment
- ReplicaSet:确保 Pod 副本数符合预期,故障时自动重建。
- Deployment:RS 的高级封装,支持滚动更新与回滚。
yaml
ReplicaSet示例
apiVersion: apps/v1
kind: ReplicaSet
spec:
replicas: 3
selector:
matchLabels:
app: nginx
水平扩展与自动扩缩容
- 水平扩展:调整 Pod 副本数应对负载变化。
- HPA(水平自动扩缩容):基于 CPU/内存指标动态扩缩副本。
- 垂直扩展:调整单个 Pod 的资源限制(
limits/requests)。
yaml
# HPA示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
存储卷挂载实践
将卷挂载至 Pod 容器:
yaml
apiVersion: v1
kind: Pod
spec:
volumes:
- name: app-data
hostPath:
path: /mnt/data
containers:
- volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: app-data
Init 容器的作用
在主容器启动前执行初始化任务(如配置生成):
yaml
apiVersion: v1
kind: Pod
spec:
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'echo "DB setup complete" > /work-dir/init.log']
containers:
- name: main-app
image: nginx
配置文件安全管理
使用 Secret 加密敏感信息:
yaml
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4= # base64编码
password: MWYyZDFlMmU2N2Rm
Kubernetes 事件(Event)
记录集群操作与状态变更(如 Pod 调度失败),用于故障排查:
bash
kubectl get events --sort-by='.metadata.creationTimestamp'
容器生命周期与监控
1 ) Pod 生命周期钩子
在容器特定阶段执行自定义操作:
- postStart:容器启动后立即执行。
- preStop:容器终止前执行清理任务。
yaml
apiVersion: v1
kind: Pod
spec:
containers:
- lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/log"]
preStop:
exec:
command: ["/bin/sh", "-c", "nginx -s quit"]
2 ) 健康检查探针(Probes)
| 探针类型 | 作用 | 配置示例 |
|---|---|---|
| LivenessProbe | 检测容器运行状态,失败时重启 Pod。 | HTTP GET /healthz |
| ReadinessProbe | 检测服务可用性,失败时将 Pod 移出负载均衡。 | TCP 检查 8080 端口 |
| StartupProbe | 延迟其他探针直至容器启动完成(v1.16+)。 |
yaml
LivenessProbe示例
apiVersion: v1
kind: Pod
spec:
containers:
- livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
集群监控方案
- 核心组件:
Prometheus(指标收集)、Alertmanager(告警)、Node Exporter(节点监控)。 - 原生工具:
kube-state-metrics采集 Kubernetes 对象状态。
高级运维:滚动更新、扩展与跨集群管理
1 ) 应用程序水平扩展
修改 Deployment 的 replicas 字段并应用:
bash
kubectl scale deployment/nginx --replicas=5
2 ) 滚动更新(Rolling Update)
逐步替换旧 Pod,新 Pod 就绪后再终止旧实例(零停机):
bash
kubectl set image deployment/nginx nginx=nginx:1.21
3 ) 跨集群管理方案
| 工具 | 功能 | 工具举例 |
|---|---|---|
| 联邦集群 Kubernetes Federation | 联邦控制平面统一管理多集群。 | Kubernetes Federation |
| 服务网格(如 Istio) | 跨集群流量管理、安全策略与监控。 | Istio |
| CI/CD 上下文切换 | Jenkins 通过 kubectl 配置文件kubeconfig切换集群。 |
Jenkins + Kubectl |
| 专用管理平台 Rancher | Web 界面集中管理多集群。 | Rancher |
4 ) 集群监控方案
- Prometheus + Alertmanager:指标收集与告警。
- Node Exporter:监控宿主机资源。
- cAdvisor:容器级监控集成于 kubelet。
- kube-state-metrics:跟踪 K8s 资源状态。
安全措施总结
- 认证:X.509 证书/ServiceAccount。
- 授权:RBAC 控制资源访问权限。
- 网络策略:NetworkPolicy 限制 Pod 通信。
- 安全上下文:限定容器运行权限(如非 root 用户)。
关键总结
- 安全性核心:认证→授权→网络隔离→加密→审计形成闭环链条。
- Pod 设计原则:单容器 Pod 优先、静态 Pod 部署关键基础设施。
- 数据持久化:根据需求选择临时卷 (
emptyDir)、节点绑定 (hostPath) 或解耦存储 (PV/PVC)。 - 跨集群管理:联邦、服务网格、CI/CD 上下文切换、Rancher 为四大主流方案。
- 运维精髓:滚动更新保障可用性,探针与钩子增强应用自愈能力。