測試您的 Python 部署

先決條件

概觀

在本節中,您將學習如何使用 Docker Desktop 將應用程式部署到開發機器上功能齊全的 Kubernetes 環境。這允許您在部署前在本地 Kubernetes 上測試和除錯您的工作負載。

建立 Kubernetes YAML 檔案

在您的 `python-docker-dev-example` 目錄中,建立一個名為 `docker-postgres-kubernetes.yaml` 的檔案。在 IDE 或文字編輯器中開啟檔案並新增以下內容。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres
          ports:
            - containerPort: 5432
          env:
            - name: POSTGRES_DB
              value: example
            - name: POSTGRES_USER
              value: postgres
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: POSTGRES_PASSWORD
          volumeMounts:
            - name: postgres-data
              mountPath: /var/lib/postgresql/data
      volumes:
        - name: postgres-data
          persistentVolumeClaim:
            claimName: postgres-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: postgres
  namespace: default
spec:
  ports:
    - port: 5432
  selector:
    app: postgres
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Secret
metadata:
  name: postgres-secret
  namespace: default
type: Opaque
data:
  POSTGRES_PASSWORD: cG9zdGdyZXNfcGFzc3dvcmQ= # Base64 encoded password (e.g., 'postgres_password')

在您的 `python-docker-dev-example` 目錄中,建立一個名為 `docker-python-kubernetes.yaml` 的檔案。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: docker-python-demo
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      service: fastapi
  template:
    metadata:
      labels:
        service: fastapi
    spec:
      containers:
        - name: fastapi-service
          image: DOCKER_USERNAME/REPO_NAME
          imagePullPolicy: Always
          env:
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-secret
                  key: POSTGRES_PASSWORD
            - name: POSTGRES_USER
              value: postgres
            - name: POSTGRES_DB
              value: example
            - name: POSTGRES_SERVER
              value: postgres
            - name: POSTGRES_PORT
              value: "5432"
          ports:
            - containerPort: 8001
---
apiVersion: v1
kind: Service
metadata:
  name: service-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    service: fastapi
  ports:
    - port: 8001
      targetPort: 8001
      nodePort: 30001

在這些 Kubernetes YAML 檔案中,有各種物件,以 `---` 分隔

  • 一個部署,描述了一組可擴展的相同 Pod。在本例中,您將只獲得一個副本,或 Pod 的副本。該 Pod(在 `template` 下描述)中只有一個容器。該容器是從為您的 Python 應用程式設定 CI/CD中 GitHub Actions 建立的映像檔建立的。
  • 一個服務,它將定義容器中埠的映射方式。
  • 一個 PersistentVolumeClaim,用於定義一個在資料庫重新啟動後仍會持續存在的儲存空間。
  • 一個 Secret,使用 Kubernetes 的 Secret 資源將資料庫密碼作為範例保存。
  • 一個 NodePort 服務,它會將主機上埠 30001 的流量路由到它所路由到的 Pod 內部的埠 8001,讓您可以從網路連線到您的應用程式。

要瞭解更多關於 Kubernetes 物件的資訊,請參閱Kubernetes 文件

**注意**