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 叢集。

  1. 安裝 Minikube

    curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
    sudo install minikube-linux-amd64 /usr/local/bin/minikube
    
  2. 啟動 Minikube

    minikube start
    
  3. 安裝 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

內容解密:

  1. apiVersionkind:定義了 Kubernetes 資源的版本和型別。
  2. metadata:提供了 Deployment 的後設資料,如名稱。
  3. spec:指定了 Deployment 的規格,包括副本數量、選擇器和 Pod 範本。
  4. replicas: 2:指定了要執行的 Pod 副本數量。
  5. selectortemplate:定義了 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工作流程
  1. 瀏覽到GitHub儲存函式庫。
  2. 點選「Actions」標籤,建立新的工作流程。
  3. 使用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 }}

這個工作流程定義了兩個作業:

  1. 建置:安裝依賴項,使用flake8進行linting,並使用pytest進行測試。
  2. 佈署:根據建置作業的成功與否,在master分支上進行佈署,建置Docker映像,將其推播到Docker登入檔,並更新Kubernetes佈署以使用新的映像。

使用Nginx作為反向代理

Nginx的作用

Nginx是一種高效能的Web伺服器,也廣泛用作反向代理和負載平衡器。

反向代理的好處

  1. 負載平衡:Nginx可以將傳入的網路流量分配到多個後端伺服器,最佳化資源利用,最大化吞吐量,減少回應時間,確保可靠性。
  2. 安全性增強:Nginx可以作為伺服器到網際網路的閘道器,執行SSL/TLS終止等任務,從而加密和解密客戶端請求和伺服器回應,將這些任務從應用伺服器中解除安裝。
  3. 快取內容: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應用程式,並將回應傳回給客戶端。

詳細步驟說明
  1. listen 80; 指定Nginx監聽80埠,這是HTTP流量的預設埠。
  2. server_name university.gitforgits.com; 指定此伺服器區塊負責處理對university.gitforgits.com的請求。
  3. location / { ... } 定義了一個位置區塊,用於處理對根URL(/)的請求。
  4. proxy_pass http://localhost:5000; 將對根URL的請求代理到http://localhost:5000,這是Flask應用程式執行的位置。
  5. proxy_http_version 1.1; 指定使用HTTP/1.1協定進行代理。

透過這種組態,Nginx能夠有效地作為反向代理,將流量引導至後端服務,同時提供負載平衡、安全性增強和內容快取等功能,從而提升整體系統的效能和可靠性。