随着 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 用户来说都至关重要。
-
何时使用:使用 ConfigMaps 来配置在环境(开发、准备、生产)之间发生变化的应用程序配置,并使用 Secrets 来配置任何凭证、令牌或敏感信息。
-
链接:https://kubernetes.io/docs/concepts/configuration/secret/
4. 水平 Pod 自动扩缩器(HPA)
水平 Pod 自动缩放器根据观察到的 CPU 利用率或自定义指标自动调整 Deployment、ReplicaSet 或 StatefulSet 中的 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 来说,它们也是必需的。
-
对象:需要从 pod 内部安全地管理对 Kubernetes API 和资源的访问的 Kubernetes 集群管理员和开发人员。
-
何时使用:在部署与 Kubernetes API 交互或需要向集群内的其他服务进行身份验证的应用程序时使用服务账户,尤其是对于需要特定权限的自动化任务或微服务。
-
链接:https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
7. 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 的放置。
-
谁:寻求优化工作负载放置并在多租户环境中实施分离问题的集群管理员。
-
何时使用:当您需要防止某些 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 作业和 CronJobs
Jobs 和 CronJobs 分别管理需要按照指定时间间隔运行一次或重复运行的任务。
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
-
原因:Jobs 和 CronJobs 对于自动执行 Kubernetes 中的任务(例如备份、维护操作或批处理)至关重要。
-
谁:在 Kubernetes 环境中自动执行日常任务或运行批处理作业的工程师。
-
何时使用:为一次性任务实现Jobs或为需要按计划运行的任务设置CronJobs。
-
链接:https: //kubernetes.io/docs/concepts/workloads/controllers/job/
概括
这些高级 Kubernetes 配置为创建强大、高效且安全的云原生应用程序奠定了基础。了解并利用这些设置可让工程师充分利用 Kubernetes 的强大功能,根据特定需求定制部署,并保持最佳运营标准。
不看的原因
- 内容低质
- 不看此公众号内容