社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

将Python项目部署到Kubernetes

Python程序员 • 5 年前 • 524 次点击  

随着项目的发展,一些传统的处理方案如VM、SaaS等所发挥的作用越来越有限。为此,我们将采用新的方案:一个自动化容器操作的开源平台--Kubernetes来解决当前所面临的问题。本文将介绍如下内容:

  (1). 怎样利用Kubernete在集群上部署Python项目;

  (2).怎样对集群进行配置;

  (3).怎样设置Kubernetes清单以及一些自动化功能。

  

这是前一篇有关Python自动化项目的后续文章,在阅读本文之前有必要先回顾一下。

  

这是我的代码仓库,包含了完整的源代码和文档:https://github.com/MartinHeinz/python-project-blueprint


开发设置


为了在开发过程中更高效,有必要对Kubernetes进行本地化设置即仅在一台计算机上运行的小型集群,它与实际的生产集群非常接近,为此,我们将采用 KinD:


顾名思义,KinD (Kubernetes-in-Docker)是指在Docker容器中运行Kubernetes集群。它是用于Kubernetes v1.11+测试的工具,支持多节点集群和HA集群。由于是在Docker容器中运行K8s,所以KinD可以在Windows、Mac和Linux上运行。就是说,可以在任何安装了Docker容器的操作系统上运行KinD

  

接下来,让我们安装KinD(在Linux上--如果是在Windows上,请在此处查看安装方法):

  

然后,就可以对集群进行设置了。为此,我们需要以下YAML清单:

  

此清单描述了集群的基本结构。它有3个节点:1个control-plane,2个worker。我们还为它提供了更多的设置和参数,方便以后配置ingress控制器以使用HTTPS协议。这些设置的目的是:在指定的节点上,对host向ingress控制器进行端口转发。

 

小贴士:集群和Python应用程序的所有设置清单都可以在我的代码仓库中的k8s目录中找到。

  

现在,创建集群:

  

在这里,‘kind create cluster’命令用来创建集群;‘kubctl cluster-info’和‘kubectl get’命令用来检测集群的运行状态。接下来,我们要为集群设置ingress。为此,我们使用‘kubectl’命令将集群与KinD拟合:

  

上面的第一个命令作用是部署ingress-nginx组件;第二个命令的作用是通过NodePort暴露nginx服务;最后一个命令的作用是给ingress控制器打补丁。通过以上操作,我们创建的集群已经启动了。


配置清单

  

准备好群集后,就可以设置和部署应用程序了。为此,我们将使用非常简单的Flask应用程序提供echo服务:

  

我选择Flask应用程序而不是某些CLI工具(或Python包),是因为这些工具有时会使所部署的应用程序停止工作。注意,务必将字段‘host值设置为 0.0.0.0,否则,将无法把应用程序暴露为公开的Kubernetes服务。

 接下来,我们需要配置一下该应用程序的YAML清单,这里将分别阐述:


Namespace

 

  这里没什么好说的。如果不采用默认值,就设置自己的名称空间。


ConfigMap

 

在这里,为应用程序定义诸多变量。其中字段‘data:’的值将作为应用程序在容器中的环境变量。上面的例子中,FLASK_ENVFLASK_DEBUG等诸多变量将在应用程序启动时由Flask自动获取。


Secret

 

在这里,将设置应用程序的一些敏感数据。我们可以使用Secret向应用程序添加凭证和密钥之类的内容。但是,因为它包含敏感数据, 所以我们使用以下命令动态的创建它:

 

小贴士:部署应用程序所需的命令在此处列出。


Deployment

 

现在是最重要的内容——部署。相关配置是字段‘spec’部分,它指定了映像、端口和环境变量。对于字段‘image’,我们指定来自Docker Hub的镜像。如果想使用像Artifactory这样的私有注册表,则须添加imagePullSecret来拉取私有镜像,它为提取镜像提供了集群凭证。这个‘secret’可以使用以下命令创建:

  

在这里,显示了怎样从GitHub中提取私有镜像。由于上述YAML中的问题,目前它不适用于KinD,但它可以与Cloud中的生产集群很好地工作(假设它是 不使用KinD)。

  

如果要避免在每次重新部署应用程序时把镜像推送到远程注册表,则可以使用命令‘kind load docker-image martinheinz/python-project-blueprint:flask’将镜像加载到群集中。

  

设置好字段‘image’后,我们还需要指定为与应用程序进行信息交换而设定的监听端口,在本例中端口号为5000。接下来就是使用命令‘app.run(host ='0.0.0.0',port = 5000)’来启动应用程序。

  

最后,设置字段‘envFrom’,直接从上文的所述ConfigMapSecret中取值,并将值赋予以‘ref’为后缀的相应字段


Service

 

现在,我们已经在端口上侦听应用程序。接下来,我们需要暴露Service,将5000端口转发到集群节点上的的443端口。


Ingress

 

最后一个问题-Ingress,怎样管理集群中对Services的外部访问。让我们首先看一下字段‘rules’,如上所示,字段‘host’取值为‘localhost’,字段‘path’取值为‘/’,字段‘backend’取值为上文所述的Servers中的值,这表明所有发送到‘localhost/’的请求均关联‘backend’。

  

字段‘tls’提供对HTTPS协议的支持。它是通过指定包含tls.crttls.keySecret来实现的。让我们创建这个Secret

上面的代码片段首先设置了几个变量,然后使用opensslTLS生成证书和密钥文件。最后一个命令创建了包含这两个文件的Secret


部署应用


准备好所有清单后,我们终于可以部署我们的应用程序:

  

在这里,大多数命令在上文都已经介绍过。而命令‘kubectl apply -f app.yaml’的作用是:在集群中创建所有必需的对象。创建之后,可以使用命令‘kubectl get all’来查看这些对象是否创建成功。最后,使用命令‘curl’来检测应用程序能否被访问。到此,我们的应用程序就可以在集群上运行了!


优化配置

  

如果你对所有的‘kind’和‘kubectl’命令感到不舒服,或者你只是像我一样懒,不想把它们都打出来,那么我就编写几个脚本:


启动集群

 

在这里,如果群集尚未启动,此脚本将对群集进行配置;若集群已启动,此脚本将展示该群集的所有信息,方便你查看节点的状态和切换命名空间。 


重新部署/重新启动应用程序

 

这个非常简单,它所做的就是推出新的部署。因此,如果有新镜像,就进行部署,否则就重新启动应用程序。


调试

 

如果需要调试应用程序,则可能需要查看与应用程序相关的最新事件以及最近(过去一小时)的日志。这正是此脚本的作用。


获取远程shell

 

如果日志不足以解决问题,并且需要在容器中摸索,那么您可以运行此脚本来获得远程shell


更新清单

 

我们以前见过这个命令。它对YAML清单进行重载,可以方便对Kubernetes对象的属性进行调整。


结论

  

这篇文章并不是Kubernetes教程,但我认为它足以让您入门,并让您的应用程序快速启动和运行。要了解更多关于Kubernetes的内容,我建议你多了解一下配置清单,尝试着调整和改变一些东西,然后看看会发生什么。在我看来,这是了解事物如何工作并适应kubectl命令的好方法。如果您有任何问题、建议或话题,请随时联系我或在我的代码仓库中创建话题。在代码仓库中,你可以找到所有的文档和清单。


英文原文:https://martinheinz.dev/blog/20
译者:sky

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62310
 
524 次点击