Kubernetes 已經成為容器協調領域的事實標準,其複雜性也伴隨著強大的功能。本文旨在提供 Kubernetes 的進階技術,涵蓋 Pod 的精細化排程、資源的彈性擴充套件、流量的有效管理以及叢集的安全性維護。從底層的 Node Affinity、Taints 和 Tolerations 等機制,到高層次的 Ingress 流量路由和自動擴縮減策略,都將進行深入的探討和實務操作指導。同時,文章也關注 Kubernetes 叢集的安全性,介紹 RBAC 的組態方法以及如何使用 kubectl 工具進行故障排查,以期協助讀者更好地應對生產環境中的各種挑戰。

Kubernetes 高階技術與實踐

Kubernetes Pod 排程高階技術

Kubernetes 的排程能力是其強大功能的核心之一。在本章節中,我們將探討 Kubernetes 中的 Pod 排程高階技術,包括 Node Affinity、Taints 和 Tolerations、靜態 Pod 等。

Node Affinity 的使用

Node Affinity 允許我們根據節點的標籤來排程 Pod。主要有三種方式:nodeNamenodeSelectornodeAffinity 組態。

使用 nodeName 排程 Pod

nodeName 是最直接的排程方式,它直接指定 Pod 執行的節點。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
  nodeName: node1

使用 nodeSelector 排程 Pod

nodeSelector 透過節點的標籤來選擇執行 Pod 的節點。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
  nodeSelector:
    disktype: ssd

使用 nodeAffinity 組態排程 Pod

nodeAffinity 提供了更靈活的排程策略,包括 requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd

#### 內容解密:

  • nodeName 直接指定節點名稱,簡單但不靈活。
  • nodeSelector 透過標籤選擇節點,較為靈活。
  • nodeAffinity 提供更復雜的排程邏輯,支援多種運算子。

Kubernetes 自動擴縮減技術

自動擴縮減是 Kubernetes 中的一項關鍵功能,可以根據實際負載動態調整資源。

垂直 Pod 自動擴縮減(VPA)

VPA 可以根據容器的實際資源使用情況自動調整其資源請求和限制。

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-vpa
spec:
  selector:
    matchLabels:
      app: my-app
  minAllowed:
    cpu: 100m
    memory: 128Mi
  maxAllowed:
    cpu: 200m
    memory: 256Mi

#### 內容解密:

  • VPA 透過監控容器資源使用情況自動調整資源請求。
  • 需要正確組態 minAllowedmaxAllowed 以確保資源使用的合理性。

水平 Pod 自動擴縮減(HPA)

HPA 根據 CPU 利用率或其他指標自動調整 Pod 的副本數量。

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
spec:
  selector:
    matchLabels:
      app: my-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

#### 內容解密:

  • HPA 根據 CPU 利用率或其他自定義指標進行擴縮減。
  • 需要正確組態 minReplicasmaxReplicas 以控制副本數量範圍。

Kubernetes 高階流量管理與多叢集策略

Kubernetes 提供了多種高階流量管理和多叢集策略,以滿足複雜的生產環境需求。

使用 Ingress 進行高階流量路由

Ingress 資源允許我們定義如何將外部流量路由到叢集內的服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80

#### 內容解密:

  • Ingress 資源用於定義外部流量的路由規則。
  • 支援根據主機名和路徑的路由。

Kubernetes 安全最佳實踐

安全是 Kubernetes 叢集管理的關鍵方面。以下是一些最佳實踐:

控制對 Kubernetes API 的存取

透過組態 RBAC(根據角色的存取控制)來限制對 Kubernetes API 的存取。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-rolebinding
roleRef:
  name: my-role
  kind: Role
subjects:
- kind: User
  name: my-user

#### 內容解密:

  • RBAC 用於控制使用者和服務賬戶對 Kubernetes 資源的操作許可權。
  • 需要正確組態 Role 和 RoleBinding 以確保許可權的精細控制。

Kubernetes 故障排除

有效的故障排除是確保 Kubernetes 叢集穩定執行的關鍵。

使用 kubectl 命令進行故障排除

kubectl 提供了一系列命令用於診斷和排除故障,如 kubectl logskubectl describekubectl exec

kubectl logs <pod-name>
kubectl describe pod <pod-name>
kubectl exec -it <pod-name> -- /bin/bash

#### 內容解密:

  • kubectl logs 用於檢視 Pod 的日誌。
  • kubectl describe 用於檢視資源的詳細資訊。
  • kubectl exec 用於在 Pod 中執行命令,進行互動式除錯。

前言

容器技術的廣泛採用為虛擬化領域帶來了真正的飛躍,因為它們提供了更大的靈活性,特別是在雲端運算、敏捷開發和DevOps等熱門話題興起的今天。 如今,幾乎沒有人對使用容器技術提出質疑——它們基本上無處不在,特別是在Docker成功之後,以及Kubernetes作為領先的容器協調平台的崛起。 容器技術為企業帶來了巨大的靈活性,但在面臨將其佈署到生產環境的挑戰時,它們在很長一段時間內仍然存在著疑問。多年間,企業一直將容器用於概念驗證專案、本地開發等用途,但對於許多企業來說,將容器用於真實的生產工作負載的想法是難以想像的。

容器協調工具改變了遊戲規則,其中Kubernetes領先。Kubernetes最初由Google開發,如今已成為領先的容器協調工具,為您提供了在生產環境中大規模佈署容器所需的所有功能。Kubernetes很流行,但也很複雜。這個工具非常多才多藝,入門並進階到高階用法並不是一件容易的事:它不是一個容易學習和操作的工具。

作為協調工具,Kubernetes有其獨立於容器引擎的概念。當容器引擎和協調工具一起使用時,您將獲得一個強大的平台,準備好將您的雲原生應用程式佈署到生產環境。作為每天與Kubernetes合作的工程師,我們深信這是一項需要掌握的技術,因此我們決定分享我們的知識,以便涵蓋大多數協調工具的使用方法。

這本文完全致力於Kubernetes,是我們工作的成果。它提供了對Kubernetes的廣泛視角,涵蓋了協調工具的許多方面,從純粹的容器Pod建立到在公共雲上佈署協調工具。我們不希望這本文成為入門。我們希望這本文能教您一切您想了解的關於Kubernetes的知識!

本文適用物件

本文適用於打算使用Kubernetes與容器執行時的讀者。雖然Kubernetes透過容器執行時介面(CRI)支援各種容器引擎,並不侷限於任何特定的引擎,但Kubernetes與containerd的組合仍然是最常見的使用案例之一。

本文具有高度的技術性,主要從工程師的角度關注Kubernetes和容器執行時。它適用於工程師,無論他們來自開發還是系統管理背景,並不針對專案經理。它是對於每天使用Kubernetes的人或希望瞭解這個工具的人來說,是Kubernetes的聖經。在閱讀本文時,您不應該害怕在終端機上輸入一些命令。

完全是Kubernetes的初學者或具有中級水平並不是跟隨本文的問題。雖然我們在章節中涵蓋了一些容器的基本知識,但具備基本的容器技術熟悉度是有幫助的。如果您正在將現有的應用程式遷移到Kubernetes,本文也可以作為。

本文包含了允許讀者在公共雲端服務(如Amazon EKS或Google GKE)上佈署Kubernetes的內容。希望在雲上將Kubernetes新增到他們的技術堆疊中的雲使用者將會欣賞這本文。

本文涵蓋內容

第一章,Kubernetes基礎,介紹了什麼是Kubernetes,為什麼建立它,由誰建立,以及何時和為什麼應該將其納入您的技術堆疊。

第二章,Kubernetes架構——從容器映像到執行中的Pod,涵蓋了Kubernetes如何構建為分散式軟體,以及它在技術上不是單一的單體二進位制檔案,而是構建為一組相互互動的微服務。我們將在這一章中解釋這種架構以及Kubernetes如何將您的指令轉換為執行的容器。

第三章,安裝您的第一個Kubernetes叢集,解釋了由於Kubernetes的分散式性質,安裝它非常困難,為了使學習過程更容易,可以使用其其中一個發行版來安裝Kubernetes叢集。Kind和minikube是我們將在本章中探討的兩個選項,以便在您的機器上執行Kubernetes叢集。

第四章,在Kubernetes中執行您的容器,介紹了Pod的概念。

第五章,使用多容器Pod和設計模式,介紹了多容器Pod和設計模式,例如代理、介面卡或邊車,當您在同一個Pod中執行多個容器時,可以構建這些模式。

第六章,Kubernetes中的名稱空間、配額和限制,用於實作多租戶,解釋了使用名稱空間是叢集管理的一個關鍵方面,不可避免地,您將在與Kubernetes的旅途中處理名稱空間。雖然這是一個簡單的概念,但它是一個關鍵的概念,您必須完美地掌握名稱空間才能成功使用Kubernetes。我們還將學習如何使用名稱空間、配額和限制在Kubernetes中實作多租戶。

第七章,使用ConfigMaps和Secrets組態您的Pod,解釋了在Kubernetes中,我們將Kubernetes應用程式與其組態分開。應用程式和組態都有自己的生命週期,這得益於ConfigMap和Secret資源。本章將專門介紹這兩個物件,以及如何將ConfigMap或Secret中的資料掛載為環境變數或掛載到您的Pod上的卷。

Kubernetes技術:深入探索與實務應用

Kubernetes作為當今最受歡迎的容器協調工具,其強大的功能和靈活性使其成為企業級應用的首選。本文內容涵蓋了Kubernetes的核心概念、實務操作以及進階技術,旨在幫助讀者深入瞭解並掌握Kubernetes的使用。

Kubernetes基礎與核心概念

在開始探討Kubernetes之前,瞭解其基本概念和架構是非常重要的。Kubernetes提供了一個強大的平台,用於自動化佈署、擴充套件和管理容器化應用。它支援多種容器執行時,如containerd,並且能夠在不同的環境中執行,包括本地資料中心和公有雲。

服務暴露與持久化儲存

服務暴露

Kubernetes中的服務(Service)是一種抽象,用於將執行在一組Pod上的應用暴露給其他Pod或外部網路。服務型別包括ClusterIP、NodePort和LoadBalancer,分別適用於不同的使用場景。

  • ClusterIP:預設的服務型別,提供一個內部IP供叢集內部存取。
  • NodePort:在每個節點上開放一個特定的埠,用於將外部流量導向服務。
  • LoadBalancer:與雲供應商的負載平衡器整合,提供外部存取入口。

持久化儲存

Pod預設情況下是無狀態的,這意味著當Pod被刪除或重建時,其中的資料會丟失。為瞭解決這個問題,Kubernetes提供了持久化儲存的解決方案,包括PersistentVolume(PV)和PersistentVolumeClaim(PVC)。

  • PersistentVolume(PV):叢集管理員組態的儲存資源,可以被Pod動態或靜態地掛載。
  • PersistentVolumeClaim(PVC):使用者對儲存資源的請求,用於宣告所需的儲存容量和存取模式。
  • StorageClass:定義了儲存的型別和引數,用於動態建立PV。

高用性與擴充套件性

ReplicationController和ReplicaSet

為了實作應用的高用性,Kubernetes提供了ReplicationController和ReplicaSet這兩種資源物件。它們確保了指定數量的Pod副本始終執行。

Deployment

Deployment是管理ReplicaSet的更高層抽象,用於宣告式地更新應用。它支援滾動更新、回復等功能,使得應用佈署更加安全和可靠。

狀態化應用與DaemonSet

StatefulSet

對於需要保持狀態的應用,Kubernetes提供了StatefulSet。它保證了Pod的身份和順序,適用於資料函式庫等需要持久化狀態的應用。

DaemonSet

DaemonSet確保了在每個節點(或指定的節點集合)上執行一個Pod副本。它常用於執行日誌收集、監控代理等系統級別的服務。

Helm Charts與Operators

Helm Charts

Helm是Kubernetes的包管理工具,用於簡化應用的佈署和管理。Helm Charts定義了應用的組態和依賴,使得應用可以被輕易地安裝和升級。

Operators

Operator是Helm Charts的補充,它提供了一種機制,用於封裝和管理複雜應用的生命週期。Operator可以自動處理應用的佈署、升級、備份等任務。

多雲環境下的Kubernetes

本文還探討了在不同雲平台上佈署和管理Kubernetes叢集的方法,包括Google Kubernetes Engine(GKE)、Amazon Elastic Kubernetes Service(EKS)和Azure Kubernetes Service(AKS)。

安全與進階主題

安全

Kubernetes提供了多種安全機制,包括根據角色的存取控制(RBAC)、網路策略和密鑰管理等,以確保叢集的安全。

進階排程與自動擴充套件

本文還介紹了Kubernetes的進階排程功能,如Node affinity和Taints/Tolerations,以及自動擴充套件機制,如Horizontal Pod Autoscaler和Cluster Autoscaler。

Kubernetes基礎介紹

歡迎閱讀《Kubernetes聖經》,我們很高興能夠陪伴您踏上Kubernetes的旅程。如果您在軟體開發行業工作,您很可能已經聽說過Kubernetes。這是正常的,因為Kubernetes的流行度在近年來大幅增長。

為何需要Kubernetes

由Google構建的Kubernetes是目前最受歡迎和廣泛採用的容器協調工具。如果您正在尋找一種解決方案來管理生產環境中的容器化應用程式,無論是在本地還是公共雲上,Kubernetes都是您的最佳選擇。請注意「容器協調」這個詞。因為預設情況下,像Docker這樣的容器引擎本身並不提供任何維護容器可用性和可擴充套件性的方法,所以大規模佈署和管理容器極為困難。

Kubernetes最初是作為Google的一個專案出現的,Google投入了大量精力來構建一個可以在其龐大分散式基礎設施上佈署大量容器的解決方案。透過採用Kubernetes作為您的技術堆疊的一部分,您將獲得一個由網際網路上最大的公司之一建立的開源平台,該平台具有最關鍵的穩定性需求。

儘管Kubernetes可以與許多不同的容器執行時一起使用,但本文將重點介紹Kubernetes和容器(Docker和Podman)的組合。

Kubernetes能為您做什麼

也許您已經每天使用Docker,但容器協調的世界可能對您來說完全陌生。甚至有可能您沒有看到使用這種技術的好處,因為僅使用原始Docker對您來說一切看起來都很好。因此,在本章中,我們不會詳細介紹Kubernetes。相反,我們將重點解釋什麼是Kubernetes,以及它如何幫助您在生產中管理應用程式容器。如果您瞭解為什麼要構建它,將更容易學習新技術。

在本章中,我們將涵蓋以下主要主題:

  • 瞭解單體和微服務
  • 瞭解容器
  • Kubernetes如何幫助您管理容器?
  • 瞭解Kubernetes的歷史

瞭解單體和微服務

內容解密:

這部分將探討單體架構和微服務架構之間的區別。單體架構是一種傳統的系統設計方法,其中所有的功能和元件都被封裝在一個單一的單元中。相反,微服務架構則是一種現代化的方法,它將應用程式分解為一系列小型的、獨立的服務。每個微服務負責一個特定的業務功能,並且可以獨立地開發、測試和佈署。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes進階技術實務

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

此圖示展示了單體架構和微服務架構的主要區別。單體架構是一個完整的、單一的應用程式,而微服務架構則是由多個獨立的服務組成,每個服務都有其特定的職責。

瞭解容器

容器是一種輕量級、可移植的應用程式封裝方式,它包含了應用程式及其依賴項。容器技術使得開發人員能夠在不同的環境中快速、可靠地佈署應用程式。

內容解密:

這部分將探討容器的概念及其優勢。容器透過提供一個隔離的環境,使得應用程式可以在不同的系統上執行而無需修改。此外,容器還可以提高資源利用率和降低佈署成本。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod

內容解密:

上述YAML檔案定義了一個名為nginx-pod的Pod。apiVersionkind欄位指定了Kubernetes API的版本和資源型別。在這個例子中,我們建立了一個Pod資源,用於執行一個Nginx容器。

Kubernetes如何幫助您管理容器?

Kubernetes提供了一種強大的方式來管理和協調大規模的容器化應用程式。它可以自動化容器的佈署、擴充套件和管理,並提供高用性和可擴充套件性。

內容解密:

這部分將探討Kubernetes的功能及其如何幫助您管理容器。Kubernetes可以自動檢測和還原故障容器,提供負載平衡和服務發現等功能。此外,Kubernetes還提供了豐富的API和工具,使得開發人員可以輕鬆地與其整合。

$ kubectl get nodes

內容解密:

上述命令用於取得叢集中所有節點的資訊。kubectl是Kubernetes的命令列工具,用於與叢集進行互動。在這個例子中,我們使用get nodes命令來取得節點列表。

瞭解Kubernetes的歷史

Kubernetes最初是由Google開發的一個內部專案,後來被捐贈給了Cloud Native Computing Foundation(CNCF)。如今,Kubernetes已經成為了一個由社群驅動的開源專案,並且已經成為了容器協調領域的事實標準。

內容解密:

這部分將探討Kubernetes的發展歷史及其演變過程。從最初的設計到現在的版本,Kubernetes經歷了多次迭代和改進。瞭解其歷史可以幫助我們更好地理解其設計理念和發展方向。