在 Kubernetes 上運行一個 Python 應用程序
Kubernetes 是一個具備部署、維護和可伸縮特性的開源平台。它在提供可移植性、可擴展性以及自我修復能力的同時,簡化了容器化 Python 應用程序的管理。
不論你的 Python 應用程序是簡單還是複雜,Kubernetes 都可以幫你高效地部署和伸縮它們,在有限的資源範圍內滾動升級新特性。
在本文中,我將描述在 Kubernetes 上部署一個簡單的 Python 應用程序的過程,它包括:
- 創建 Python 容器鏡像
- 發布容器鏡像到鏡像註冊中心
- 使用持久卷
- 在 Kubernetes 上部署 Python 應用程序
必需條件
你需要 Docker、kubectl
以及這個 源代碼。
Docker 是一個構建和承載已發布的應用程序的開源平台。可以參照 官方文檔 去安裝 Docker。運行如下的命令去驗證你的系統上運行的 Docker:
$ docker info
Containers: 0
Images: 289
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Dirs: 289
Execution Driver: native-0.2
Kernel Version: 3.16.0-4-amd64
Operating System: Debian GNU/Linux 8 (jessie)
WARNING: No memory limit support
WARNING: 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.6
MAINTAINER XenonStack
# Creating Application Source Code Directory
RUN mkdir -p /k8s_python_sample_code/src
# Setting Home Directory for containers
WORKDIR /k8s_python_sample_code/src
# Installing python dependencies
COPY requirements.txt /k8s_python_sample_code/src
RUN pip install --no-cache-dir -r requirements.txt
# Copying src code to Container
COPY . /k8s_python_sample_code/src/app
# Application Environment variables
ENV APP_ENV development
# Exposing Ports
EXPOSE 5035
# Setting Persistent data
VOLUME ["/app-data"]
# Running Python Application
CMD ["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: v1
kind: PersistentVolume
metadata:
name: app-disk1
namespace: k8s_python_sample_code
spec:
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: v1
kind: PersistentVolumeClaim
metadata:
name: appclaim1
namespace: k8s_python_sample_code
spec:
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: v1
kind: Service
metadata:
labels:
k8s-app: k8s_python_sample_code
name: k8s_python_sample_code
namespace: k8s_python_sample_code
spec:
type: NodePort
ports:
- port: 5035
selector:
k8s-app: k8s_python_sample_code
使用下列的內容創建部署文件並將它命名為 k8s_python_sample_code.deployment.yml
:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: k8s_python_sample_code
namespace: k8s_python_sample_code
spec:
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: https://opensource.com/article/18/1/running-python-application-kubernetes
作者:Joannah Nanjekye 譯者:qhwdw 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive