Kubernetes 提供了容器協調平台,簡化容器化應用程式的管理。本文示範如何使用 Minikube 建立本地 Kubernetes 環境,並佈署一個大學應用程式。文章涵蓋了 Deployment 和 Service 的建立,以及如何透過 kubectl 進行佈署和管理。此外,也說明瞭如何使用 GitHub Actions 建立 CI/CD 流程,自動化建置、測試和佈署應用程式到 Kubernetes 叢集。最後,介紹瞭如何設定 Nginx 作為反向代理,提升應用程式的效能、安全性和可靠性,並提供詳細的 Nginx 設定範例。
Kubernetes 與應用程式協調
Kubernetes(K8s)是一個開源的容器協調平台,能夠自動化佈署、擴充套件和管理容器化的應用程式。它透過將應用程式的容器組織成邏輯單元,實作更好的可發現性和管理性。
Kubernetes 的關鍵功能
- Pods:Kubernetes 中最小的可佈署單元,通常包含一個或多個分享儲存和網路資源的容器。
- Nodes:節點可以是實體機器或虛擬機器,每個節點上可以執行多個 Pod。
- Services:定義了一組 Pod 的邏輯集合以及存取它們的策略,例如服務發現機制。
- Deployment:管理 Pod 的佈署和擴充套件,並提供對應用程式容器的更新。
安裝與設定 Kubernetes
對於開發環境,可以使用 Minikube 在本地執行單節點的 Kubernetes 叢集。
安裝 Minikube:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube啟動 Minikube:
minikube start安裝 kubectl:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" chmod +x kubectl sudo mv kubectl /usr/local/bin/
在 Kubernetes 上佈署大學應用程式
建立 Deployment 組態檔案
以下是一個範例 Deployment 組態檔案,用於佈署大學應用程式:
apiVersion: apps/v1
kind: Deployment
metadata:
name: university-app
spec:
replicas: 2
selector:
matchLabels:
app: university-app
template:
metadata:
labels:
app: university-app
spec:
containers:
- name: university-app
image: university-app:latest
ports:
- containerPort: 5000
內容解密:
apiVersion和kind:定義了 Kubernetes 資源的版本和型別。metadata:提供了 Deployment 的後設資料,如名稱。spec:指定了 Deployment 的規格,包括副本數量、選擇器和 Pod 範本。replicas: 2:指定了要執行的 Pod 副本數量。selector和template:定義了 Deployment 管理的 Pod 範本和標籤選擇器。
透過這些步驟,你可以在 Kubernetes 上成功佈署大學應用程式,並利用其強大的協調能力來管理容器化應用。
Kubernetes佈署大學應用程式
Kubernetes是一種容器協調工具,可以自動化佈署、擴充套件和管理容器化應用程式。本文將介紹如何使用Kubernetes佈署一個大學應用程式。
建立佈署設定檔
首先,需要建立一個deployment.yaml檔案,描述佈署的期望狀態:
apiVersion: apps/v1
kind: Deployment
metadata:
name: university-app-deployment
spec:
replicas: 2
selector:
matchLabels:
app: university-app
template:
metadata:
labels:
app: university-app
spec:
containers:
- name: university-app
image: university-app:latest
ports:
- containerPort: 5000
這個設定檔告訴Kubernetes維持兩個大學應用程式的副本,確保高用性。
佈署應用程式
使用kubectl命令套用設定檔:
kubectl apply -f deployment.yaml
暴露應用程式
為了讓大學應用程式可以從Kubernetes虛擬網路外部存取,需要建立一個服務:
apiVersion: v1
kind: Service
metadata:
name: university-app-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 5000
selector:
app: university-app
套用這個設定檔:
kubectl apply -f service.yaml
存取應用程式
由於使用的是Minikube,需要啟用Minikube服務:
minikube service university-app-service
這個命令會開啟預設瀏覽器,讓你可以與佈署的應用程式互動。
CI/CD for Python後端應用程式
瞭解CI/CD
持續整合和交付(CI/CD)的目標是建立高品質的軟體,易於使用和適應使用者需求,透過自動化測試和佈署程式碼變更。
Continuous Integration
持續整合在每次合併時執行自動化測試,將所有開發人員的工作副本合併到共用主線多次。
Continuous Deployment
持續佈署進一步將應用程式自動佈署到生產環境,假設測試執行成功。
為大學應用程式實作CI/CD
給定大學應用程式的容器化設定,可以使用Jenkins、GitLab CI/CD或GitHub Actions等工具實作強大的CI/CD管道。
版本控制設定
確保程式碼函式庫託管在版本控制平台上,如GitHub、GitLab或Bitbucket。
選擇CI/CD工具
這裡使用GitHub Actions,它直接與GitHub儲存函式庫整合。
建立GitHub Actions工作流程
- 瀏覽到GitHub儲存函式庫。
- 點選「Actions」標籤,建立新的工作流程。
- 使用Python應用程式的入門範本或從頭開始。
組態工作流程檔案
建立.github/workflows/python-app.yml檔案,定義以下步驟:
name: Python application CI/CD
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8 pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest
run: |
pytest
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build . -t university-app:${{ github.sha }}
- name: Push Docker image to Registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push university-app:${{ github.sha }}
- name: Deploy to Kubernetes
run: kubectl set image deployment/university-app university-app=university-app:${{ github.sha }}
env:
KUBECONFIG: ${{ secrets.KUBECONFIG }}
這個工作流程定義了兩個作業:
- 建置:安裝依賴項,使用flake8進行linting,並使用pytest進行測試。
- 佈署:根據建置作業的成功與否,在master分支上進行佈署,建置Docker映像,將其推播到Docker登入檔,並更新Kubernetes佈署以使用新的映像。
使用Nginx作為反向代理
Nginx的作用
Nginx是一種高效能的Web伺服器,也廣泛用作反向代理和負載平衡器。
反向代理的好處
- 負載平衡:Nginx可以將傳入的網路流量分配到多個後端伺服器,最佳化資源利用,最大化吞吐量,減少回應時間,確保可靠性。
- 安全性增強:Nginx可以作為伺服器到網際網路的閘道器,執行SSL/TLS終止等任務,從而加密和解密客戶端請求和伺服器回應,將這些任務從應用伺服器中解除安裝。
- 快取內容:Nginx可以快取伺服器的內容,減少對應用伺服器的請求次數,從而提高終端使用者的回應時間。
安裝和組態Nginx
安裝Nginx
在Ubuntu或Debian系統上,可以直接從套件管理器安裝Nginx:
sudo apt update
sudo apt install nginx
安裝後,可以啟動Nginx服務並啟用它在開機時執行:
sudo systemctl start nginx
sudo systemctl enable nginx
組態Nginx作為反向代理
需要修改Nginx組態檔案,通常位於/etc/nginx/sites-available/。下面是一個基本的組態,用於將Nginx設定為大學應用程式的反向代理:
sudo nano /etc/nginx/sites-available/university-app
在檔案中新增以下組態:
server {
listen 80;
server_name university.gitforgits.com;
location / {
proxy_pass http://localhost:5000; # 假設Flask應用程式執行在5000埠上
proxy_http_version 1.1;
# 其他代理設定...
}
}
內容解密:
此組態定義了一個Nginx伺服器區塊,監聽80埠,並將對university.gitforgits.com的請求代理到執行在http://localhost:5000的Flask應用程式。這樣,Nginx就充當了反向代理,將客戶端的請求轉發給後端的Flask應用程式,並將回應傳回給客戶端。
詳細步驟說明
listen 80;指定Nginx監聽80埠,這是HTTP流量的預設埠。server_name university.gitforgits.com;指定此伺服器區塊負責處理對university.gitforgits.com的請求。location / { ... }定義了一個位置區塊,用於處理對根URL(/)的請求。proxy_pass http://localhost:5000;將對根URL的請求代理到http://localhost:5000,這是Flask應用程式執行的位置。proxy_http_version 1.1;指定使用HTTP/1.1協定進行代理。
透過這種組態,Nginx能夠有效地作為反向代理,將流量引導至後端服務,同時提供負載平衡、安全性增強和內容快取等功能,從而提升整體系統的效能和可靠性。