Kubernetes 进阶功能详解
108
类别: 
开发交流

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 的几个重要进阶功能:

  1. Helm 提供了强大的包管理能力,简化了复杂应用的部署和维护
  2. 持久化存储 保证了数据的持久性和可靠性
  3. 健康检查探针 确保了应用的高可用性
  4. 自动扩缩容 根据负载动态调整资源,提高资源利用率
  5. 网络安全策略 增强了集群的安全性

掌握这些功能将帮助你在生产环境中更好地管理和运维 Kubernetes 集群。每项功能都有丰富的配置选项和最佳实践,建议根据具体需求深入研究相关文档。

标签:
评论 1
/ 1000
0
1
收藏