Kubernetes 提供多種佈署方式,包含單一 YAML 檔案管理多個資源,例如 ConfigMap、Deployment 和 Service。ConfigMap 存放網頁內容,Deployment 建立 Nginx 容器並掛載 ConfigMap,Service 則透過 NodePort 暴露服務。Helm 作為 Kubernetes 的套件管理器,簡化了應用程式佈署,其 Chart 包含 Chart.yaml、templates 和 values.yaml 等檔案,用於定義 Chart 資訊、資源範本和引陣列態。Helm 允許透過搜尋、安裝和管理 Chart,並支援版本控制和引數化組態。
Kubernetes 與 Helm 結合使用能簡化容器化應用佈署和管理,提供統一管理、版本控制和引數化組態等優勢。實際應用中,可實作多環境佈署、應用升級和資源管理。文章也探討了 DevSecOps 的成功模式,包括向左移 CI/CD、多雲佈署、自動化安全措施、以 Linux 為基礎以及重構與重新佈署。並說明瞭網路協定與命令列工具,包含 SMTP、DNS、HTTP/HTTPS、DHCP、SSH、ICMP、ARP 等協定,以及 pwd、cd、man、env、whoami、ls、less 等命令列工具的使用。
Kubernetes 佈署策略與 Helm 整合應用
在現代化的 DevSecOps 環境中,Kubernetes 已成為容器協調的關鍵技術,而 Helm 則進一步簡化了 Kubernetes 應用程式的佈署和管理流程。本篇文章將探討 Kubernetes 的佈署策略以及 Helm 的整合應用,並提供實際的程式碼範例和詳細的解說。
Kubernetes 佈署策略
Kubernetes 提供了多種佈署資源的方式,包括單一檔案管理和多檔案管理。以下是一個使用單一 YAML 檔案管理多個資源的範例:
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-chapter7-1
data:
index.html: |
<!doctype html>
<html>
<head>
<title>Deployment1</title>
</head>
<body>
<h1>Served from Deployment1</h1>
</body>
</html>
---
apiVersion: v1
kind: ConfigMap
metadata:
name: configmap-chapter7-2
data:
index.html: |
<!doctype html>
<html>
<head>
<title>Deployment2</title>
</head>
<body>
<h1>Served from Deployment2</h1>
</body>
</html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-chapter7-1
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: config-chapter7-1
mountPath: /usr/share/nginx/html
volumes:
- name: config-chapter7-1
configMap:
name: configmap-chapter7-1
---
apiVersion: v1
kind: Service
metadata:
name: service-chapter7
spec:
selector:
app: nginx
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30515
externalIPs:
- 192.168.1.158
內容解密:
- ConfigMap 資源定義:範例中定義了兩個 ConfigMap 物件,分別用於存放不同的 HTML 內容,用於後續掛載到不同的 Deployment 中。
- Deployment 組態:兩個 Deployment 物件被建立,分別使用不同的 ConfigMap 內容掛載到 Nginx 容器中,實作不同的網頁內容呈現。
- Service 組態:透過 NodePort 型別的 Service 對外暴露服務,並指定特定的外部 IP 位址。
Helm 的整合應用
Helm 是 Kubernetes 的套件管理器,能夠簡化應用程式的佈署和管理流程。Helm 將相關的組態檔案和目錄組織成一個稱為 Chart 的套件。
Helm Chart 結構
一個典型的 Helm Chart 目錄結構如下:
Chart.yaml
charts/
crds/
LICENSE
templates/
README.md
values.yaml
values.schema.json
Chart.yaml 檔案
Chart.yaml 檔案包含了 Chart 的基本資訊:
apiVersion: v2
name: example-chart
description: A Helm chart for example application
version: 1.0.0
Helm 搜尋與安裝
可以使用以下指令搜尋可用的 Chart:
helm search hub mariadb
搜尋結果會列出相關的 Chart,可以根據排序方式(如 Stars)來判斷 Chart 的流行程度。
Helm Chart 安裝與管理
當安裝一個 Chart 時,Helm 會建立一個 Release,可以重複安裝同一個 Chart 來建立多個 Release:
helm install my-mariadb mariadb
Kubernetes 與 Helm 的協同工作
Kubernetes 與 Helm 的結合使用,可以大大簡化容器化應用的佈署和管理流程:
- 統一管理:Helm 提供了一種統一的方式來管理 Kubernetes 資源。
- 版本控制:Helm Chart 可以進行版本控制,方便追蹤變更。
- 引數化組態:透過 values.yaml 檔案,可以靈活地調整佈署引數。
實際應用場景
在實際的 DevSecOps 環境中,可以利用 Kubernetes 和 Helm 實作以下場景:
- 多環境佈署:透過 Helm Chart 可以快速在不同環境(開發、測試、生產)中佈署相同的應用。
- 應用程式升級:利用 Helm 的升級功能,可以實作應用的無縫升級。
- 資源管理:透過 Kubernetes 原生的資源管理功能,結合 Helm 的套件管理,可以實作對應用的全面掌控。
隨著雲原生技術的持續發展,Kubernetes 和 Helm 將繼續在 DevSecOps 中扮演關鍵角色。未來可以期待更多根據這些技術的創新應用和最佳實踐的出現。
參考資料
- Kubernetes 官方檔案:https://kubernetes.io/docs/
- Helm 官方檔案:https://helm.sh/docs/
程式碼範例擴充
以下是一個更複雜的 Helm Chart 範例,展示瞭如何使用範本和變數:
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Values.deployment.name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Values.app.name }}
template:
metadata:
labels:
app: {{ .Values.app.name }}
spec:
containers:
- name: {{ .Values.container.name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
ports:
- containerPort: {{ .Values.container.port }}
# values.yaml
deployment:
name: example-deployment
replicaCount: 2
app:
name: example-app
container:
name: example-container
port: 80
image:
repository: nginx
tag: latest
內容解密:
- 範本化組態:透過 Helm 的範本功能,可以動態生成 Kubernetes 資源組態檔案。
- 變數管理:透過 values.yaml 檔案管理變數,實作組態的靈活調整。
- 引數化佈署:可以根據不同的佈署需求,調整變數值來生成不同的佈署組態。
透過這種方式,可以實作更靈活和可定製的佈署方案,滿足不同的應用場景需求。
超越 DevSecOps:未來發展與實踐模式
在撰寫一本關於 DevSecOps 的書籍時,最大的挑戰在於界定內容的範圍。因為「DevSecOps」這個術語本身具有多重解讀,不同的人根據其經驗、組織需求以及上下文環境,會對其有不同的理解。目前,DevSecOps 相關技術尚未發展到能夠提供一套標準成功模式的成熟階段。雖然有一些可遵循的模式和技術工具,但具體的操作細節卻難以標準化。重要的是,DevSecOps 並非最終目標,而是一個隨著新技術出現而持續改進的過程,旨在使軟體交付變得更快、更可靠。
DevSecOps 的成功模式
許多組織在邁向 DevSecOps 或使用成熟的 DevSecOps 軟體開發生命週期(SDLC)時,會遵循以下幾種成功的實踐模式:
- 向左移(Shifting Left)邁向 CI/CD:持續整合與持續佈署是 DevSecOps 的最終目標。
- 多雲佈署(Multicloud Deployments)實作冗餘:利用多雲策略來增強系統的冗餘性和彈性。
- 減少對佈署後安全性的依賴,轉而強調自動化和向左移的安全措施:將安全措施前置並自動化。
- 根據 Linux 的命令列工具:Linux 成為 DevSecOps 的後端驅動力,特別是根據命令列的工具。
- 減少故障排除和最佳化,轉而強調重構和重新佈署:在現代基礎設施中,重構和重新佈署往往比故障排除更具成本效益。
向左移並匯入 CI/CD
持續整合/持續佈署(CI/CD)是 DevSecOps 的核心目標。開發者編寫的程式碼應能順暢地透過多道關卡,最終佈署到生產環境。要實作真正的 CI/CD,需要對Pipeline(Pipeline)進行大量的客製化。
像 Argo CD 這類別軟體就是專為 DevSecOps 設計的。它提供了圖形化元件以增強可視性,同時也利用了 Kubernetes 和 Helm 等現代化後端工具。你可以直接使用 Argo CD,或者將其作為參考,來建立更現代化的Pipeline。
多雲整合
目前,容器化是 DevSecOps 的主流技術。三大主要雲端服務供應商——AWS、Google Cloud 和 Azure——都提供了與 Kubernetes 高度整合的容器化服務。特別是 Google Cloud,由於其與 Kubernetes 的歷史淵源,天然具有更高的親和力。組織可以根據需求、地理位置或冗餘要求,靈活地將容器和工作負載佈署到任意雲端。
自動化和整合的安全措施
難以實施或使用複雜的安全措施,往往會被忽視。成功的 DevSecOps 實踐強調「預設安全」和「無侵入式」的安全設計。普遍採用根據角色的存取控制(Role-Based Access Control, RBAC)。雖然在上線後發現安全問題尚可接受(前提是攻擊者尚未發現),但最佳實踐是將安全檢查前置,並實作自動化。
將 Linux 作為基礎
無論是伺服器架構還是無伺服器架構,Linux 都是 DevSecOps 的後端驅動力。這意味著推廣與 Linux 相容或根據 Linux 的工具。例如,避免使用需要在主機上執行代理程式的監控軟體,因為代理程式本身可能成為安全漏洞。相反,我們應優先使用最小許可權原則和 SSH 等整合工具來收集資訊。同時,組織內部應推廣 Linux 相關技能,如命令列操作和 Linux 架構理解。
重構與重新佈署
在過去,物理伺服器數量有限且執行多種服務,因此最佳化資源使用和故障排除非常重要,因為佈署新例項需要長時間採購新硬體。然而,在現代基礎設施中,由於資源(如記憶體和處理器)成本足夠低廉,重新佈署的成本往往低於深入排查故障。因此,現代 DevSecOps 實踐更傾向於在下一次迭代中進行重構,而不是花大量時間最佳化或故障排除。
內容解密:
上述 Python 程式碼範例模擬了一個簡化的 CI/CD 流程。main 函式作為流程的入口,首先呼叫 security_scan 函式進行安全掃描,然後呼叫 deploy_to_production 函式將應用佈署到生產環境。這個範例展示瞭如何在 CI/CD 流程中整合安全檢查和自動化佈署。
在實際應用中,可以根據需要擴充套件這些函式,例如加入更複雜的安全掃描邏輯或使用 Kubernetes 和 Helm 進行佈署。同時,這些步驟都應當在自動化的Pipeline中執行,以實作真正的 DevSecOps 實踐。
網路協定與命令列工具
在現代網路環境中,瞭解常見的網路協定和命令列工具對於系統管理員和開發人員至關重要。本文將詳細介紹一些關鍵的網路協定和命令列工具,幫助讀者更好地理解和運用這些技術。
常見網路協定
網路協定是電腦網路中用於資料交換的規則和標準。以下是一些常見的網路協定及其對應的埠號和描述。
簡單郵件傳輸協定(SMTP)
- 埠號: TCP/25、TCP/465、TCP/587
- 描述: SMTP用於在郵件傳輸代理(MTA)之間傳輸電子郵件。埠465和587是SSL保護的SMTP埠。
網域名稱系統(DNS)
- 埠號: UDP/53和TCP/53
- 描述: DNS負責將主機名稱解析為IP地址,並提供關於網域的資訊,如郵件交換(MX)記錄。TCP通常用於主DNS伺服器和輔助DNS伺服器之間的區域傳輸。
超文字傳輸協定(HTTP/HTTPS)
- 埠號: TCP/80和TCP/443
- 描述: HTTP用於傳輸超文字內容,而HTTPS是其SSL/TLS加密版本,分別使用埠80和443。
動態主機設定協定(DHCP)
- 埠號: UDP/67和UDP/68
- 描述: DHCP用於為本地網路上的客戶端分配IP地址、子網路掩碼和其他基本的網路組態資訊。
安全殼層(SSH)
- 埠號: TCP/22
- 描述: SSH是一種用於遠端管理伺服器和裝置的主要手段,提供端對端的加密。
網際網路控制訊息協定(ICMP)
- 埠號: 無
- 描述: ICMP通常透過ping命令體現,用於確定主機是否存活和回應,但可能被防火牆阻止。
位址解析協定(ARP)
- 埠號: 無
- 描述: ARP用於將MAC位址轉換為IP地址。
命令列導航基礎
對於來自圖形介面使用者來說,面對命令列可能會感到有些陌生。然而,掌握基本的命令列導航技能對於高效使用命令列至關重要。
瞭解目前目錄
- 使用
pwd命令可以顯示目前所在的目錄。 - 使用
cd ~可以切換到家目錄。
檢視手冊
- 使用
man命令可以檢視特定命令的手冊。例如,man zsh可以檢視zsh shell的手冊。
確定目前使用的Shell
- 使用
env命令檢視環境變數,其中包含目前使用的Shell資訊。 - 檢視
/etc/passwd檔案可以找到目前使用者的Shell資訊。 - 使用
chsh命令也可以檢視目前的Shell,按Ctrl-c可以離開。
檢視目前使用者名稱
- 使用
whoami命令可以顯示目前登入的使用者名稱。
目錄列表
使用ls命令可以列出目前目錄下的檔案和子目錄。常用的選項包括:
ls -la:顯示所有檔案(包括隱藏檔案)和詳細資訊。ls -latr:按時間排序並反向顯示,最近修改的檔案顯示在底部。
分頁顯示
使用less命令可以分頁顯示內容,支援向前和向後瀏覽、搜尋等功能。
命令回憶和補全
- 使用上箭頭可以回憶之前執行過的命令。
- 使用Ctrl-a可以將遊標移動到命令列的開頭。
- 使用Ctrl-e可以將遊標移動到命令列的結尾。
程式碼範例
以下是一個簡單的bash指令碼範例,用於顯示目前目錄下的檔案列表:
#!/bin/bash
# 顯示目前目錄
echo "目前目錄:"
pwd
# 列出目前目錄下的檔案
echo "檔案列表:"
ls -la
內容解密:
#!/bin/bash:指定指令碼使用的直譯器。echo:用於輸出文字到終端。pwd:顯示目前工作目錄的路徑。ls -la:列出目前目錄下的所有檔案和子目錄,包括隱藏檔案。
圖表翻譯
以下是一個使用Mermaid語法繪製的簡單網路架構圖:
graph LR
A[客戶端] -->|HTTP| B[負載平衡器]
B -->|HTTP| C[Web伺服器1]
B -->|HTTP| D[Web伺服器2]
C -->|SQL| E[資料函式庫伺服器]
D -->|SQL| E
圖表翻譯:
- 此圖示展示了一個簡單的網路架構,包括客戶端、負載平衡器、Web伺服器和資料函式庫伺服器。
- 客戶端透過HTTP請求存取負載平衡器。
- 負載平衡器將請求分發到後端的Web伺服器。
- Web伺服器與資料函式庫伺服器透過SQL進行資料互動。
結語
掌握常見的網路協定和命令列工具對於系統管理員和開發人員來說是非常重要的。本文介紹了一些關鍵的網路協定和命令列工具,並提供了實際的程式碼範例和圖表說明。希望讀者能夠透過本文的內容,更好地理解和運用這些技術。