作为 Kubernetes 专家必须掌握的13 个关键的 Kubernetes 配置
@TOC
推荐超级课程:
随着 Kubernetes 继续成为容器编排的基石,掌握其配置和特性变得对 DevOps 专业人员至关重要。在 2024 年,某些 Kubernetes 配置因其在云原生环境中增强自动化、安全性和性能的能力而脱颖而出。本博文深入探讨了 13 个关键的 Kubernetes 配置,提供了对每个配置的深入分析,包括使用案例、好处和代码示例。
1. 资源请求和限制
了解并正确设置资源请求和限制在 Kubernetes 中是基础性的。这确保您的应用程序具有运行所需的资源,同时防止任何单个应用程序垄断集群资源。
apiVersion: v1
kind: Pod
metadata:
name: sample-app
spec:
containers:
- name: app-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
- 为什么:这个配置对于维护单个应用程序和整个集群的稳定性和性能至关重要。它防止资源争夺,并确保应用程序不会因资源短缺而意外终止。
- 谁需要:对于希望优化应用程序性能和集群资源利用率的 Kubernetes 管理员和开发人员至关重要。
- 使用时机:对每个工作负载应用这个配置,以确保可预测的应用程序性能,并防止任何单个应用程序占用可能影响集群稳定性的过多资源。
- 链接:https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/
2. 存活探针和就绪探针
存活探针和就绪探针对于管理 Kubernetes 中应用程序的生命周期至关重要。它们帮助 Kubernetes 根据实际应用程序健康状况做出智能决策何时重新启动容器(存活)、何时容器准备好接受流量(就绪)。
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
- 为什么:它们通过确保 Kubernetes 可以基于实际应用程序健康情况而不仅仅是容器运行时状态自动管理容器的状态,增强了应用程序的弹性和可用性。
- 谁需要:部署需要高可用性和自愈特性的关键服务的开发人员和运营人员。
- 使用时机:为需要持续运行的应用程序实现存活探针,为只有在完全初始化并准备好服务请求时才应该接收流量的应用程序实现就绪探针。
- 链接:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
3. ConfigMaps 和 Secrets
ConfigMaps 和 Secrets 对于从应用程序代码中外部化配置和敏感数据是不可或缺的。ConfigMaps 允许您以键值对的形式存储非机密数据,而 Secrets 则用于敏感信息。
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.json: |
{
"database": "sql",
"timeout": "30s",
"featureFlag": "true"
}
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
password: cGFzc3dvcmQ=
- 为什么:这些配置将配置和秘密与应用程序逻辑分离,简化了在不同环境中的应用程序部署和管理,同时增强了安全性。
- 谁需要:对于管理需要配置数据或安全地处理凭证和其他敏感信息的任何 Kubernetes 用户至关重要。
- 使用时机:对于应用程序配置在不同环境(开发、测试、生产)之间变化和对于任何凭证、令牌或敏感信息使用 Secrets。
- 链接:https://kubernetes.io/docs/concepts/configuration/secret/
4. 水平 Pod 自动缩放(HPA)
水平 Pod 自动缩放可以根据观察到的 CPU 利用率或自定义指标自动调整部署、副本集或有状态集合中 Pod 副本的数量。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: sample-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: sample-app
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 80
- 为什么:HPA 确保您的应用程序可以根据需求进行扩展和收缩,优化资源使用并保持性能。
- 谁需要:希望根据实时需求自动缩放应用程序的管理员和 DevOps 专业人员。
- 使用时机:对于具有可变流量的应用程序特别适用,确保资源动态分配以满足需求而无需手动干预。
- 链接:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
5. 网络策略
网络策略是 Kubernetes 资源,用于控制 Pod 和网络端点之间的流量,允许您实施微分段并增强 Kubernetes 应用程序的安全性。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
- 为何: 它们是保护 Kubernetes 集群内 Pod 通信的关键,确保只有授权的流量可以在 Pod 之间或到外部服务之间流动。
- 谁: 需要在他们的集群中实施严格网络安全策略的 Kubernetes 管理员和专注于安全的工程师。
- 何时使用: 在多租户环境或具有高安全要求的应用程序中特别有用,以防止未经授权访问并限制潜在的攻击向量。
- 链接: https://kubernetes.io/docs/concepts/services-networking/network-policies/
6. 服务账户
Kubernetes 中的服务账户用于为 Pod 提供身份,与 Kubernetes API 和集群内其他服务交互。它们对于管理访问控制并确保服务之间的安全通信至关重要。
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-service-account
namespace: default
- 在 Pod 中使用服务账户:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-image
serviceAccountName: my-service-account
- 为何: 服务账户对于将来自 Pod 内的 API 请求归因于特定身份至关重要,实现细粒度访问控制和审计。它们还适用于需要访问 Kubernetes API 或其他集群服务的 Pod。
- 谁: Kubernetes 集群管理员和开发人员需要安全地管理 Pod 内对 Kubernetes API 和资源的访问。
- 何时使用: 部署需要与 Kubernetes API 交互或需要在集群内认证到其他服务的应用程序时使用服务账户,尤其适用于需要特定权限的自动化任务或微服务。
- 链接: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
7. Ingress 控制器和 Ingress 资源
Ingress 控器和资源管理集群中服务的外部访问,通常是 HTTP,允许您定义将流量路由到不同服务的规则。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
- 为何: 它们提供一种集中、可扩展和安全的管理方式,从互联网访问您的 Kubernetes 服务。
- 谁: 管理公共应用程序的 DevOps 专业人员和 Kubernetes 管理员。
- 何时使用: 对于需要来自 Kubernetes 集群外部的受控访问的任何应用程序至关重要,尤其是在管理多个服务或执行基于 URL 的路由时。
- 链接: https://kubernetes.io/docs/concepts/services-networking/ingress/
8. 持久卷 (PV) 和持久卷声明 (PVC)
持久卷 (PV) 和持久卷声明 (PVC) 提供一种管理 Kubernetes 存储的方法,抽象了存储提供方式和消费方式的细节。
apiVersion: v1
kind: PersistentVolume
metadata:
name: example-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
nfs:
path: /path/to/data
server: nfs-server.example.com
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
- 为何: 对于需要持久存储数据的有状态应用程序至关重要,超出了 Pod 生命周期的范围。
- 谁: 在 Kubernetes 中处理数据库、文件存储和其他有状态应用程序的工程师。
- 何时使用: 每当您的应用程序需要持久数据存储独立于 Pod 生命周期时使用,确保数据的持久性和可用性。
- 链接: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
9. 基于角色的访问控制 (RBAC)
RBAC 强制实施细粒度的访问控制策略到 Kubernetes 资源中,使用角色和角色绑定来限制集群内的权限。
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
- 为何: 它对于在整个 Kubernetes 集群中保持最少特权原则至关重要,确保用户和应用程序仅具有所需的权限。
- 谁: 管理集群及实施安全访问策略的管理员和注重安全性的工程师。
- 何时使用: 在需要保护 Kubernetes 资源的访问时实施 RBAC,尤其是在具有多个用户或团队的环境中。
- 链接: https://kubernetes.io/docs/reference/access-authn-authz/rbac/
10. 自定义资源定义(CRD)
CRD 允许您通过定义自定义资源来扩展 Kubernetes API,为您的需求提供定制的新功能。
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
names:
kind: CronTab
listKind: CronTabList
plural: crontabs
singular: crontab
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
image:
type: string
- 为何: CRD 赋予您创建和管理自定义对象的能力,与 Kubernetes API 和 kubectl 工具无缝集成。
- 谁: 希望在其 Kubernetes 环境中引入自定义操作或资源的开发人员和运营人员。
- 何时使用: 在现有资源无法满足应用程序特定要求时,用于扩展 Kubernetes 的理想选择。
- 链接: https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/
11. 污点和容忍度
污点和容忍度共同确保 Pod 不会被调度到不合适的节点上。
apiVersion: v1
kind: Node
metadata:
name: node1
spec:
taints:
- key: "key1"
value: "value1"
effect: NoSchedule
- 为何: 确保根据硬件、软件和其他自定义需求等因素控制 Pod 在节点上的 placement 的功能强大。
- 谁: 寻求优化工作负载分布并在多租户环境中执行分离关注的集群管理员。
- 何时使用: 当需要阻止某些 Pod 放置在特定节点上时使用,例如为特定工作负载指定节点。
- 链接: https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
12. 亲和性和反亲和性
亲和性和反亲和性设置允许您影响 Pod 相对于其他 Pod 的放置位置。
apiVersion: apps/v1
kind: Deployment
metadata:
name: with-pod-affinity
spec:
selector:
matchLabels:
app: with-pod-affinity
template:
metadata:
labels:
app: with-pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: "kubernetes.io/hostname"
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: "kubernetes.io/hostname"
- 为何: 管理 Pod 在集群中的分布以增强容错性、可用性或满足其他运营需求至关重要。
- 谁: 寻求调整 Pod 放置位置以进行性能优化或符合规定的管理人员和开发人员。
- 何时使用: 在高可用设置中特别有用,或者在需要出于安全性或合规性原因进行工作负载分离时使用。
- 链接: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
13. Kubernetes 作业和定时作业
作业和定时作业管理需要在指定间隔内运行一次或重复运行的任务。
apiVersion: batch/v1
kind: Job
metadata:
name: example-job
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["sh", "-c", "echo Hello Kubernetes! && sleep 30"]
restartPolicy: Never
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: example-cronjob
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["sh", "-c", "echo Hello Kubernetes! && sleep 30"]
restartPolicy: OnFailure
- 为何: 作业和定时作业对于在 Kubernetes 中自动化任务(如备份、维护操作或批处理处理)至关重要。
- 谁: 在其 Kubernetes 环境中自动化常规任务或运行批处理作业的工程师。
- 何时使用: 为一次性任务实施作业或为需要按计划运行的任务设置定时作业。
- 链接: https://kubernetes.io/docs/concepts/workloads/controllers/job/
总结
这些高级 Kubernetes 配置为创建稳健、高效和安全的云原生应用程序提供了基础。了解和利用这些设置允许工程师充分利用 Kubernetes 的功能,根据特定需求定制部署,并保持最佳操作标准。