當前位置:
首頁 > 知識 > 在 Kubernetes 上運行一個 Python 應用程序

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

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


編譯自: https://opensource.com/article/18/1/running-python-application-kubernetes

作者: Joannah Nanjekye

譯者: qhwdw

這個分步指導教程教你通過在 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

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


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

機器人學影響 CIO 角色的 3 種方式
在 Linux 上用 DNS 實現簡單的負載均衡

TAG:Linux技術 |