Kubernetes 进阶功能详解
Kubernetes 进阶功能详解
在掌握了 Kubernetes 基础部署之后,接下来我们可以深入了解一些更高级的功能,包括使用 Helm 进行包管理、配置持久化存储、设置健康检查和探针、实现自动扩缩容以及学习网络策略和安全设置。
1. 使用 Helm 进行包管理
Helm 是 Kubernetes 的包管理器,类似于 Linux 系统中的 apt 或 yum。它允许你定义、安装和升级复杂的 Kubernetes 应用程序。
Helm 核心概念
- Chart: Helm 包,包含了运行一个 Kubernetes 应用所需的所有资源定义
- Repository: Helm Chart 的仓库,用于发布和收集 Chart
- Release: 在 Kubernetes 集群中运行的一个 Chart 实例
安装 Helm
# 使用官方脚本安装
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
使用 Helm 部署应用
# 添加仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
# 查找 Chart
helm search repo bitnami
# 安装 Chart
helm install my-release bitnami/nginx
# 查看 Release 状态
helm status my-release
# 升级 Release
helm upgrade my-release bitnami/nginx --set service.port=8080
# 删除 Release
helm uninstall my-release
创建自定义 Chart
# 创建新的 Chart
helm create my-chart
# 目录结构
my-chart/
├── Chart.yaml # Chart 信息
├── values.yaml # 默认配置值
├── charts/ # 依赖的其他 Charts
└── templates/ # Kubernetes 资源模板
├── deployment.yaml
├── service.yaml
└── _helpers.tpl # 模板辅助函数
2. 配置持久化存储
在 Kubernetes 中,持久化存储通过 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 实现。
PersistentVolume (PV)
PV 是集群中的一块存储资源,由管理员配置。
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: slow
hostPath:
path: /data/my-pv
PersistentVolumeClaim (PVC)
PVC 是用户对存储的请求。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: slow
在 Pod 中使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: my-storage
volumes:
- name: my-storage
persistentVolumeClaim:
claimName: my-pvc
StorageClass 动态供应
StorageClass 允许动态创建 PV。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
3. 设置健康检查和探针
Kubernetes 提供三种类型的探针来检查容器的健康状况:
Liveness Probe(存活探针)
检测容器是否正在运行,失败时会重启容器。
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
Readiness Probe(就绪探针)
检测容器是否准备好接收流量,失败时从服务端点移除。
apiVersion: v1
kind: Pod
metadata:
labels:
test: readiness
name: readiness-http
spec:
containers:
- name: readiness
image: nginx
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
Startup Probe(启动探针)
检测容器内的应用是否已启动,主要用于启动较慢的应用。
apiVersion: v1
kind: Pod
metadata:
name: startup-probe
spec:
containers:
- name: startup
image: nginx
startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
periodSeconds: 10
4. 实现自动扩缩容
Horizontal Pod Autoscaler (HPA)
HPA 根据 CPU 使用率或其他指标自动调整 Pod 数量。
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
或者使用命令行:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
Vertical Pod Autoscaler (VPA)
VPA 根据历史资源使用情况自动调整 Pod 的资源请求。
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
5. 网络策略和安全设置
NetworkPolicy
NetworkPolicy 用于控制 Pod 之间的网络通信。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
RBAC 权限控制
Role 和 RoleBinding 用于控制用户和服务账户的权限。
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
Pod Security Standards
通过 PodSecurityPolicy 或准入控制器实施安全策略。
apiVersion: v1
kind: Pod
metadata:
name: security-context-demo
spec:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
volumes:
- name: sec-ctx-vol
emptyDir: {}
containers:
- name: sec-ctx-demo
image: busybox
command: [ "sh", "-c", "sleep 1h" ]
volumeMounts:
- name: sec-ctx-vol
mountPath: /data/demo
securityContext:
allowPrivilegeEscalation: false
总结
以上就是 Kubernetes 的几个重要进阶功能:
- Helm 提供了强大的包管理能力,简化了复杂应用的部署和维护
- 持久化存储 保证了数据的持久性和可靠性
- 健康检查探针 确保了应用的高可用性
- 自动扩缩容 根据负载动态调整资源,提高资源利用率
- 网络安全策略 增强了集群的安全性
掌握这些功能将帮助你在生产环境中更好地管理和运维 Kubernetes 集群。每项功能都有丰富的配置选项和最佳实践,建议根据具体需求深入研究相关文档。





