在 Kubernetes 上運行一個 Python 應用程序

在 Kubernetes 上運行一個 Python 應用程序

來自專欄 Linux8 人贊了文章

這個分步指導教程教你通過在 Kubernetes 上部署一個簡單的 Python 應用程序來學習部署的流程。

Kubernetes 是一個具備部署、維護和可伸縮特性的開源平台。它在提供可移植性、可擴展性以及自我修復能力的同時,簡化了容器化 Python 應用程序的管理。

不論你的 Python 應用程序是簡單還是複雜,Kubernetes 都可以幫你高效地部署和伸縮它們,在有限的資源範圍內滾動升級新特性。

在本文中,我將描述在 Kubernetes 上部署一個簡單的 Python 應用程序的過程,它包括:

  • 創建 Python 容器鏡像
  • 發布容器鏡像到鏡像註冊中心
  • 使用持久卷
  • 在 Kubernetes 上部署 Python 應用程序

必需條件

你需要 Docker、kubectl 以及這個 源代碼。

Docker 是一個構建和承載已發布的應用程序的開源平台。可以參照 官方文檔 去安裝 Docker。運行如下的命令去驗證你的系統上運行的 Docker:

$ docker infoContainers: 0Images: 289Storage Driver: aufs Root Dir: /var/lib/docker/aufs Dirs: 289Execution Driver: native-0.2Kernel Version: 3.16.0-4-amd64Operating System: Debian GNU/Linux 8 (jessie)WARNING: No memory limit supportWARNING: No swap limit support

kubectl 是在 Kubernetes 集群上運行命令的一個命令行界面。運行下面的 shell 腳本去安裝 kubectl

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

部署到 Kubernetes 的應用要求必須是一個容器化的應用程序。我們來回顧一下 Python 應用程序的容器化過程。

一句話了解容器化

容器化是指將一個應用程序所需要的東西打包進一個自帶操作系統的容器中。這種完整機器虛擬化的好處是,一個應用程序能夠在任何機器上運行而無需考慮它的依賴項。

我們以 Roman Gaponov 的 文章 為參考,來為我們的 Python 代碼創建一個容器。

創建一個 Python 容器鏡像

為創建這些鏡像,我們將使用 Docker,它可以讓我們在一個隔離的 Linux 軟體容器中部署應用程序。Docker 可以使用來自一個 Dockerfile 中的指令來自動化構建鏡像。

這是我們的 Python 應用程序的 Dockerfile:

FROM python:3.6MAINTAINER XenonStack# Creating Application Source Code DirectoryRUN mkdir -p /k8s_python_sample_code/src# Setting Home Directory for containersWORKDIR /k8s_python_sample_code/src# Installing python dependenciesCOPY requirements.txt /k8s_python_sample_code/srcRUN pip install --no-cache-dir -r requirements.txt# Copying src code to ContainerCOPY . /k8s_python_sample_code/src/app# Application Environment variablesENV APP_ENV development# Exposing PortsEXPOSE 5035# Setting Persistent dataVOLUME ["/app-data"]# Running Python ApplicationCMD ["python", "app.py"]

這個 Dockerfile 包含運行我們的示例 Python 代碼的指令。它使用的開發環境是 Python 3.5。

構建一個 Python Docker 鏡像

現在,我們可以使用下面的這個命令按照那些指令來構建 Docker 鏡像:

docker build -t k8s_python_sample_code .

這個命令為我們的 Python 應用程序創建了一個 Docker 鏡像。

發布容器鏡像

我們可以將我們的 Python 容器鏡像發布到不同的私有/公共雲倉庫中,像 Docker Hub、AWS ECR、Google Container Registry 等等。本教程中我們將發布到 Docker Hub。

在發布鏡像之前,我們需要給它標記一個版本號:

docker tag k8s_python_sample_code:latest k8s_python_sample_code:0.1

推送鏡像到一個雲倉庫

如果使用一個 Docker 註冊中心而不是 Docker Hub 去保存鏡像,那麼你需要在你本地的 Docker 守護程序和 Kubernetes Docker 守護程序上添加一個容器註冊中心。對於不同的雲註冊中心,你可以在它上面找到相關信息。我們在示例中使用的是 Docker Hub。

運行下面的 Docker 命令去推送鏡像:

docker push k8s_python_sample_code

使用 CephFS 持久卷

Kubernetes 支持許多的持久存儲提供商,包括 AWS EBS、CephFS、GlusterFS、Azure Disk、NFS 等等。我在示例中使用 CephFS 做為 Kubernetes 的持久卷。

為使用 CephFS 存儲 Kubernetes 的容器數據,我們將創建兩個文件:

persistent-volume.yml

apiVersion: v1kind: PersistentVolumemetadata: name: app-disk1 namespace: k8s_python_sample_codespec: capacity: storage: 50Gi accessModes: - ReadWriteMany cephfs: monitors: - "172.17.0.1:6789" user: admin secretRef: name: ceph-secret readOnly: false

persistent_volume_claim.yaml

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: appclaim1 namespace: k8s_python_sample_codespec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi

現在,我們將使用 kubectl 去添加持久卷並聲明到 Kubernetes 集群中:

$ kubectl create -f persistent-volume.yml$ kubectl create -f persistent-volume-claim.yml

現在,我們準備去部署 Kubernetes。

在 Kubernetes 上部署應用程序

為管理部署應用程序到 Kubernetes 上的最後一步,我們將創建兩個重要文件:一個服務文件和一個部署文件。

使用下列的內容創建服務文件,並將它命名為 k8s_python_sample_code.service.yml

apiVersion: v1kind: Servicemetadata: labels: k8s-app: k8s_python_sample_code name: k8s_python_sample_code namespace: k8s_python_sample_codespec: type: NodePort ports: - port: 5035 selector: k8s-app: k8s_python_sample_code

使用下列的內容創建部署文件並將它命名為 k8s_python_sample_code.deployment.yml

apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: k8s_python_sample_code namespace: k8s_python_sample_codespec: replicas: 1 template: metadata: labels: k8s-app: k8s_python_sample_code spec: containers: - name: k8s_python_sample_code image: k8s_python_sample_code:0.1 imagePullPolicy: "IfNotPresent" ports: - containerPort: 5035 volumeMounts: - mountPath: /app-data name: k8s_python_sample_code volumes: - name: <name of application> persistentVolumeClaim: claimName: appclaim1

最後,我們使用 kubectl 將應用程序部署到 Kubernetes:

$ kubectl create -f k8s_python_sample_code.deployment.yml $ kubectl create -f k8s_python_sample_code.service.yml

現在,你的應用程序已經成功部署到 Kubernetes。

你可以通過檢查運行的服務來驗證你的應用程序是否在運行:

kubectl get services

或許 Kubernetes 可以解決未來你部署應用程序的各種麻煩!

想學習更多關於 Python 的知識?Nanjekye 的書,和平共處的 Python 2 和 3 提供了完整的方法,讓你寫的代碼在 Python 2 和 3 上完美運行,包括如何轉換已有的 Python 2 代碼為能夠可靠運行在 Python 2 和 3 上的代碼的詳細示例。

關於作者

Joannah Nanjekye - Straight Outta 256,只要結果不問原因,充滿激情的飛行員,喜歡用代碼說話。關於我的更多信息


via: opensource.com/article/

作者:Joannah Nanjekye 譯者:qhwdw 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


推薦閱讀:

列表最常見的10個操作-python面試題 171121
Python變數作用域
網貸平台Prosper數據分析預測
python中模塊導入語句 from ..import ..與from import as的區別
04.複合線性變換

TAG:容器 | Kubernetes | Python |