Kubernetes 具備完整的生態系統,提供了許多功能,可以顯著增強容器化應用程序的管理、可伸縮性和安全性。以下是 13 個技巧,每個都詳細說明了技巧解釋、使用示例、上下文應用以及注意事項。
- 使用 PreStop 鉤子優雅地關閉 Pod
技巧:PreStop 鉤子允許在 Pod 即將終止時在其內部執行特定命令或腳本。這種能力對于確保應用程序優雅地關閉非常關鍵,可以在必要時保存狀態,或執行清理任務以避免數據損壞,并確保平滑重啟。
使用示例:
apiVersion: v1
kind: Pod
metadata:
name: graceful-shutdown-example
spec:
containers:
- name: sample-container
image: nginx
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30 && nginx -s quit"]
這個配置確保 nginx 服務器在關閉之前有 30 秒的時間來完成正在服務的當前請求。
何時使用:在對服務連續性至關重要的環境中實施 PreStop 鉤子,以確保在部署、擴展或 Pod 重啟期間零或最小的停機時間。
注意事項:Kubernetes 允許 Pod 的終止優雅期。如果 PreStop 鉤子腳本執行時間超過這個優雅期,Kubernetes 將強制終止 Pod,可能導致你試圖避免的問題。
2. 使用 Kubelet 實現自動密鑰輪換
技巧:Kubernetes 支持在不重啟消耗這些密鑰的 Pod 的情況下自動輪換密鑰。這個功能對于通過定期更改敏感信息而不影響應用程序可用性來維護安全標準特別有用。
使用示例:假設你在 Kubernetes 中更新了一個密鑰。Kubernetes 將在不需要任何干預的情況下更新 Pod 中掛載的密鑰,確保應用程序始終具有最新的憑據,而無需手動更新或重新啟動。
何時使用:對于需要高水平安全合規性的應用程序,如數據庫密碼、API 密鑰或 TLS 證書等需要頻繁進行密鑰輪換的情況,此功能是不可或缺的。
注意事項:應用程序必須設計為動態讀取更新后的密鑰。一些應用程序在啟動時緩存密鑰,這意味著它們不會識別到更新后的密鑰而不重新啟動。確保你的應用程序定期檢查密鑰更新或適當地對變化做出反應。
3. 使用短暫容器調試 Pods
巧技:短暫容器提供了一種在運行中的 Pod 上臨時附加調試容器的方式,而不改變其原始規范。這對于在生產環境中調試實時問題非常有幫助,因為你不能擾亂服務。
使用示例:
kubectl alpha debug -it podname --image=busybox --target=containername
此命令向現有的 Pod 中添加一個 busybox 容器,允許你執行命令并檢查 Pod 的環境,而不改變其運行狀態。
何時使用:在診斷實時環境中的問題時,特別是當標準日志和指標提供的信息不足時,請使用短暫容器。這是實時深入分析生產問題的強大工具。
注意事項:由于短暫容器可以訪問 Pod 的資源和敏感數據,請謹慎使用,特別是在生產環境中。確保只有授權人員能夠部署短暫容器,以避免潛在的安全風險。
4. 基于自定義指標的水平 Pod 自動縮放
技巧:水平 Pod 自動縮放器(HPA)可以根據自定義指標擴展你的部署,而不僅僅是標準的 CPU 和內存使用情況。這對于需要根據特定業務指標或性能指標進行擴展的應用程序特別有用,比如隊列長度、請求延遲或自定義應用程序指標。
使用示例:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: custom-metric-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: your-application
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: your_custom_metric
target:
type: AverageValue
averageValue: 10
此 HPA 配置根據自定義指標 your_custom_metric 的平均值調整你的應用程序的規模。
何時使用:對于傳統的基于資源的指標無法準確表示負載的應用程序,或者需要根據業務需求進行精細調整的情況,請使用自定義指標擴展。
注意事項:設置自定義指標涉及與支持自定義指標的指標服務器(如 Prometheus)集成。確保你的指標是負載的可靠指標,以防止過度或不足縮放。
5. 使用初始化容器進行設置腳本
技巧:初始化容器在 Pod 中的應用容器之前運行,非常適合需要在應用程序啟動之前完成的設置腳本。這可能包括數據庫遷移、配置文件創建或等待外部服務可用等任務。初始化容器可以運行一系列設置任務,確保每個步驟在主應用程序容器啟動之前都成功完成。
使用示例:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
此示例使用初始化容器在啟動主應用程序容器之前等待名為 myservice 的服務可用。
何時使用:當你的應用程序容器依賴于外部服務或配置在它們啟動之前可用時,初始化容器是非常寶貴的。它們確保你的應用程序在環境準備就緒的情況下啟動。
注意事項:直到所有初始化容器成功完成,整個 Pod 的啟動才會被阻塞。確保初始化容器高效并且能夠優雅地處理失敗,以防止它們成為瓶頸或導致 Pod 啟動失敗。
插播浮力:
對越來越多學員對于真正學習K8s技術的訴求,今天就給大家分享一份來自阿里內部的《Kubernetes學習指南》和《4天實戰輕松玩轉Docker》,另外再分享一份《Jenkins持續集成從入門到精通》,圖文并茂,含金量很高,更偏實戰。超級詳細,真的實用,建議運維朋友帶走學習!
6. 用于工作負載特定調度的節點親和性
技巧:節點親和性允許你指定規則,限制 Pod 可以被調度到哪些節點上,基于節點上的標簽。這對于將工作負載定向到具有特定硬件(如 GPU)、確保數據本地性,或符合合規性和數據主權要求非常有用。
使用示例:
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
containers:
- name: with-node-affinity
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In
values:
- ssd
這個 Pod 只會被調度到帶有標簽 disktype=ssd 的節點上。
何時使用:當你的應用程序需要特定節點能力時,或者需要控制工作負載的分布以進行性能優化、法律或監管原因時,請使用節點親和性。
注意事項:過度使用節點親和性可能導致集群利用率低下和調度復雜性增加。確保你的集群具有平衡的標簽和親和性分布,以維持資源利用的高效性。
7. 用于 Pod 隔離的污點和容忍度
技巧:污點和容忍度共同確保 Pod 不會被調度到不合適的節點上。節點上的污點會排斥不容忍該污點的 Pod。容忍度應用于 Pod,允許它們在被污點的節點上調度。這個機制對于將節點專門用于特定工作負載非常重要,比如 GPU 密集型應用程序,或確保只有特定的 Pod 在帶有敏感數據的節點上運行。
使用示例:
# 對節點應用污點
kubectl taint nodes node1 key=value:NoSchedule
# 具有容忍度的 Pod 規范
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
這個設置確保 mypod 可以被調度到具有特定污點的 node1 上,其他 Pod 無法容忍該污點。
何時使用:在多租戶集群中,污點和容忍度特別有用,對于安全性或性能原因,隔離工作負載至關重要。它們也有利于運行需要專用資源的專業工作負載。
注意事項:配置污點和容忍度時要小心,可能會導致調度問題,例如未按預期調度 Pod 或某些節點被閑置。定期審查你的污點和容忍度設置,確保其符合調度需求。
8. 用于關鍵工作負載的 Pod 優先級和搶占
技巧:Kubernetes 允許你為 Pod 分配優先級,較高優先級的 Pod 可以在必要時搶占(驅逐)較低優先級的 Pod。這確保了關鍵工作負載即使在高度擁擠的集群中也能獲得所需的資源。
使用示例:
# PriorityClass definition
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "This priority class should be used for XYZ service pods only."
# Pod specification with priorityClassName
apiVersion: v1
kind: Pod
metadata:
name: high-priority-pod
spec:
containers:
- name: high-priority
image: nginx
priorityClassName: high-priority
這個配置定義了一個高優先級類,并將其分配給一個 Pod,確保它可以搶占其他較低優先級的 Pod。
何時使用:在對你的業務操作至關重要的應用程序中使用 Pod 優先級和搶占,特別是在資源爭用普遍的集群中運行時。
注意事項:不當使用可能會導致較不關鍵應用程序資源匱乏。平衡不同工作負載的需求,并考慮對集群健康和應用程序性能的整體影響。
9. 用于動態配置的 ConfigMaps 和 Secrets
技巧:ConfigMaps 和 Secrets 提供了將配置數據注入到 Pod 中的機制。這樣可以將配置外部化,使得應用程序更容易配置,無需硬編碼配置數據。ConfigMaps 適用于非敏感數據,而 Secrets 則用于敏感數據。
使用示例:
# ConfigMap Example
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
config.json: |
{
"key": "value",
"databaseURL": "http://mydatabase.example.com"
}
# Pod Spec using ConfigMap
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
這個配置將 app-config 的內容注入到 Pod 中,使得應用程序可以從 /etc/config/config.json 讀取其配置。
何時使用:每當你需要將應用程序的配置或機密數據外部化時,使其更容易管理、更新和維護,而無需重新構建容器鏡像時。
注意事項:雖然 ConfigMaps 適用于存儲非敏感數據,但避免將其用于任何需要保密的數據。始終使用 Secrets 存儲密碼、令牌、密鑰和其他敏感數據,并注意保護 Secrets 的最佳實踐,例如在靜態環境中對其進行加密。
10. 用于直接容器調試的 Kubectl Debug
技巧:kubectl debug 提供了一種創建臨時副本 Pod 并替換其容器為調試版本或添加新的故障排除工具的方式,而不會影響原始 Pod。這在不影響應用程序運行狀態的情況下,在實時環境中調試問題非常有用。
使用示例:
kubectl debug pod/myapp-pod -it --copy-to=myapp-debug --container=myapp-container --image=busybox
這個命令創建了 myapp-pod 的副本,并將 myapp-container 替換為用于調試目的的 busybox 鏡像。
何時使用:當你需要在生產環境中調試崩潰或行為不符預期的 Pod 時,這個技巧非常寶貴。它允許在最小程度影響服務的情況下進行實時調試。
注意事項:調試 Pod 仍然可能影響整體集群資源分配,并且可能訪問敏感數據。確保對調試命令的訪問受到嚴格控制,并在使用后清理調試 Pod。
11. 使用請求和限制進行高效資源管理
技巧:Kubernetes 允許您為 Pod 中的每個容器指定 CPU 和內存(RAM)請求和限制。請求保證容器獲取指定的資源量,而限制則確保容器絕不會使用超過分配數量的資源。這有助于高效地管理資源分配并防止任何單個應用獨占集群資源。
使用示例:
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: demo-container
image: nginx
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
這個 Pod 規范請求了一定數量的 CPU 和內存給 demo-container,確保它擁有所需的資源以實現最佳性能,同時防止它超出指定的限制。
何時使用:將請求和限制應用于所有容器,以確??深A測的應用程序性能,并避免集群中運行的應用程序之間的資源爭用。
注意事項:將限制設置得太低可能會導致 Pod 被終止或無法調度,如果集群無法提供請求的資源。相反,將它們設置得太高可能會導致集群資源的低效利用。根據需要監視應用程序性能并調整請求和限制。
12. 用于擴展 Kubernetes 的自定義資源定義(CRDs)
技巧:CRDs 允許您使用自己的 API 對象擴展 Kubernetes,從而創建操作類似于本機 Kubernetes 對象的自定義資源。這對于向集群添加特定于領域的功能、促進自定義操作并與外部系統集成非常有用。
使用示例:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
這個 CRD 在集群中定義了一個名為 CronTab 的新資源類型,可以像傳統的 cron 作業一樣用于調度任務,但具有 Kubernetes 本機管理功能。
何時使用:CRDs 是將 Kubernetes 功能擴展到滿足應用程序或服務特定需求的理想選擇,例如引入特定于領域的資源類型或與外部服務和 API 集成。
注意事項:設計和管理 CRD 需要對 Kubernetes 內部和 API 機制有很好的理解。設計不良的 CRD 可能會導致性能問題,并且使集群管理變得復雜。請始終確保對 CRD 進行徹底測試,并考慮對集群穩定性和性能的影響。
13. Kubernetes API 用于動態交互和自動化
技巧:Kubernetes API 使您能夠動態地與集群進行交互,從而可以以編程方式自動化擴展、部署和管理任務。通過利用 API,您可以創建與集群實時交互的腳本或應用程序,實現復雜的自動化和集成方案,超越了靜態配置文件和手動命令的可能性。
使用示例:以下是一個基本示例,使用 curl 與 Kubernetes API 交互以獲取默認命名空間中 Pod 列表。這假設您擁有一個訪問令牌,并且 Kubernetes API 可以在 https:// 上訪問。
curl -X GET https://<kubernetes-api-server>/api/v1/namespaces/default/pods \
-H "Authorization: Bearer <your-access-token>" \
-H 'Accept: application/json'
對于更復雜的交互,考慮使用各種編程語言中提供的客戶端庫,如 Go、Python、Java,它們可以將 HTTP 請求抽象化,并提供更便捷的接口來與 Kubernetes API 進行交互。
何時使用:Kubernetes API 對于開發自定義自動化、動態擴展策略、CI/CD 集成,甚至是擴展 Kubernetes 功能的自定義控制器都非常強大。當您需要將 Kubernetes 操作與外部系統集成或創建自定義部署工作流程時,它尤其有用。
注意事項:直接與 Kubernetes API 交互需要謹慎處理身份驗證和授權。確保您的腳本和應用程序遵循最小權限原則,僅請求其所需的權限。此外,在頻繁或復雜的查詢時要注意 API 服務器的潛在負載,因為這可能會影響集群性能。始終驗證和清理 API 客戶端的輸入,以避免安全漏洞,特別是如果它們與外部系統或用戶生成的內容進行交互。
這個技巧使開發人員和運維人員能夠根據其獨特的操作環境定制 Kubernetes,實現了一種可以顯著提高運維效率和靈活性的自動化和集成水平。
鏈接:https://yylives.cc/2024/02/29/13-kubernetes-tricks-you-didnt-know/ (版權歸原作者所有,侵刪)
如何入門學習K8s?
Kubernetes(簡稱K8S)是一個開源的容器編排平臺,主要用于自動化部署、擴展和管理容器化應用程序。由于K8S在容器編排方面的優勢,它已經成為了現代化應用程序部署和管理的事實標準
因此,對于運維人員來說,學習K8S已經成為了必須的技能之一。只有掌握了K8S,運維人員才能更好地管理和部署容器化應用程序,提高應用程序的可用性、性能和可靠性。
今天給大家分享一份kubernetes學習筆記,共973頁10個章節,內容全面成體系,涵蓋了K8S學習中所有需要掌握的核心知識點。講解詳細,易于理解,代碼清晰,可自由復制,而且免費,歡迎IT人尤其是運維朋友收藏和分享。
如果你想要學K8s,時效有限,速度帶走學習吧!
資料領取在這里,無償秒發,同學習共進步
不管是任何崗位(如運維、安全、網工、架構師等),只要你想學都可以進行學習。
本文鏈接:http://www.thecarconnectin.com/44871.html
網友評論comments