专栏首页k8s技术圈使用 PyCharm、Okteto 和 Kubernetes 搭建远程开发环境

使用 PyCharm、Okteto 和 Kubernetes 搭建远程开发环境

Okteto 是一个通过在 Kubernetes 中来开发和测试代码的应用程序开发工具。可以通过 Okteto 在 Kubernetes 中一键为我们启动一个开发环境,非常简单方便。前面我们也介绍过 Google 推出的 Skaffold 工具,今天我们演示下如何使用 Okteto 来搭建 Python 应用开发环境。

安装

我们只需要在本地开发机上面安装 Okteto CLI 工具即可,要想使用 Okteto 来配置环境就需要我们本地机上可以访问一个 Kubernetes 集群,所以前提是需要配置一个可访问的 Kubernetes 集群的 kubeconfig 文件,如果你没有 Kubernetes 集群的话,可以使用 OKteto Cloud 提供的环境,对于个人用户来说免费的额度基本上够用了。OktetoCLI 就是一个二进制文件,所以安装非常简单。

对于 MacOS 或者 Linux 系统执行执行如下命令即可:

$ curl https://get.okteto.com -sSfL | SH

对于 Windows 用户直接下载 https://downloads.okteto.com/cli/okteto.exe 并将其添加到您的 $PATH 路径中即可。

配置完成后在终端中执行如下命令,正常就安装完成了:

$ okteto version
okteto version 1.8.8

项目配置

打开 PyCharm IDE,为我们的应用环境一个新的项目,选择 PurePython 模板,命名为 guestbook

远程开发环境 其实就是一个运行在远程的一个 Docker 容器,其中包含构建和开发应用程序的一些环境依赖而已。Okteto 会在项目中读取 okteto.yml 文件来定义应用程序的开发环境。

比如我们这里在 guestbook 项目根目录下面创建一个名为 okteto.yml 的文件,文件内容如下所示:

name: guestbook
image: okteto/python:3
forward:
  - 8080:8080
remote: 2222
command:
- bash

该文件定义了 Okteto 的操作:

  • 创建一个名为 guestbook 的开发环境
  • 使用 okteto/python:3 这个镜像
  • 在 2222 端口上启动远程 SSH 服务器
  • 将端口 8080 转发到远程环境
  • bash 命令在启动的时候运行,所以我们可以获得一个远程终端

关于 okteto.yml 配置清单更多的使用可以查看文档 https://okteto.com/docs/reference/manifest 了解更多。

现在我们来部署开发环境,在 PyCharm 中直接打开本地终端,然后直接执行 okteto up 命令,第一次启动的时候会让我们确认是否创建它,输入 y 确认即可。该命令会自动执行环境配置任务:

  • okteto.yml 描述的开发环境部署到 Kubernetes 集群中
  • 将端口 8080 转发到远程环境中
  • 在端口 2222 中启动 SSH 服务器
  • 启动文件同步服务,这样可以让我们本地的文件系统和开发环境的 Pod 之间保持同步更新
  • 在远程开发环境中启动一个远程的 Shell,现在我们就可以像在本地计算机上一个构建、测试和运行应用程序了。

配置环境的过程其实就是在 Kubernetes 集群中启动一个 Pod 来提供开发环境,我们可以在 Kubernetes 中查看这个新启动的 Pod:

$ kubectl get pod -l app=guestbook
NAME                         READY   STATUS    RESTARTS   AGE
guestbook-8494ccd87b-q459j   1/1     Running   0          12m

默认情况下,PyCharm 会使用本地的 Python 解释器,我们这里的环境是远程的,所以需要将其配置为使用远程的开发环境作为解释器,这样可以确保我们的开发环境和本地没有任何关联。

在 PyCharm 最下方的状态栏的右下方选择 PythonInterpreters,然后点击 AddInterpreter... 菜单来添加一个新的解释器:

然后选择左侧的 SSHInterpreter

选择 Newserver configuration 新建一个配置,配置内容如下图所示:

点击 NEXT 进入认证配置页面,选择使用 Keypair,输入 Privatekey file 文件的路径 /Users/ych/.okteto/id_rsa_okteto,这里将 /Users/ych 替换成自己的 $HOME 目录路径即可:

okteto up 命令第一次运行的时候,会为我们创建一个 SSH 密钥对,并将其保存在 $HOME/.okteto/id_rsa_okteto$HOME/.okteto/id_rsa_okteto.pub 文件中,在开发环境中启动的 SSH 服务中会自动使用这些密钥进行身份验证。

SSH 配置完成后,我们可以更新下解释器的路径,需要注意的是现在的路径是远程开发环境的路径,这里我们替换成 /usr/local/bin/python,文件夹映射设置为 <Projectroot>-> /okteto,并禁用文件上传,因为 Okteto 会自动帮我们同步的。

点击 FINISH 按钮就配置完成了。现在我们的项目就会直接使用远程开发环境中的 Python 解释器了,而不是本地的。

测试

在项目中新建一个名为 app.py 的文件来测试下应用,文件内容如下所示:

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/", methods=["GET"])
def get_messages():
    return jsonify(message="Hello okteto")

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

Flask 启动一个简单的 Web Server。现在还需要安装环境依赖,在控制台(注意带有 okteto> 提示的)中执行如下命令:

default:guestbook okteto> pip install flask

安装完成后,同样我们可以将依赖添加到 requirements.txt 文件中:

default:guestbook okteto> pip freeze > requirements.txt

其实上面我们的操作是在远程的 Pod 中执行的,但是由于 Okteto 会自动同步文件,所以很快我们也会在本地项目中看到 requirements.txt 这个文件。同样现在我们可以在控制台中执行 python app.py 命令来启动服务器:

default:guestbook okteto> python app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 599-491-525

启动完成后,我们的应用程序就在远程的开发环境中启动并运行起来了。

由于我们在 okteto.yml 文件中配置了将本地的 8080 端口转发到远程的 8080 端口,所以我们也可以通过本地的 8080 端口进行访问了,而且每次代码的改动, Flask 都会自动重新加载我们的应用程序:

$ curl http://0.0.0.0:8080{  "message": "Hello okteto"}

到这里我们就完成了为 Python 应用程序配置远程开发环境的功能。

本文分享自微信公众号 - k8s技术圈(kube100),作者:阳明

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kubernetes 中的 DNS 查询

    在 Kubernetes 中部署应用的主要优势之一就是可以做到无缝的应用发现。Service 的概念使群集内通信变得容易,Service 代表了支持一组 Pod...

    我是阳明
  • 3个工具助你玩转正则表达式

    正则表达式可以说一直是大家的梦魇,但是正则在工作中实在是使用太广泛了,又不得不学习,但是却很难掌握其中的奥秘(我也是一样,用了就忘记了~)。为了能够让大家不再惧...

    我是阳明
  • 使用 StatefulSet 部署 etcd 集群

    上文我们简单介绍了 etcd 的基本概念和使用场景,本文就来介绍如何搭建 etcd 集群。在生产环境中,为了整个集群的高可用,etcd 正常都会以集群方式部署,...

    我是阳明
  • 大数据24小时 | 谷歌阿里的“大数据之争”再升级 泰国欲耗资110亿泰铢建亚太最先进数据中心

    泰国将建亚太最先进数据中心,耗资110亿泰铢 ? 据悉,2017年第一季度,泰国将建成亚洲首个被数据中心基础设施评估机构Uptime 研究所评为IV级的数据中心...

    数据猿
  • 前端模块系统

    这是最原始的 JavaScript 文件加载方式,如果把每一个文件看做是一个模块,那么他们的接口通常是暴露在全局作用域下,也就是定义在 window 对象中,不...

    奋飛
  • tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)

    网上关于tensorflow模型文件ckpt格式转pb文件的帖子很多,本人几乎尝试了所有方法,最后终于成功了,现总结如下。方法无外乎下面两种:

    砸漏
  • django2.2.6 check_password 验证失败解决办法

    python3.6, django 2.2.6 AUTHENTICATION_BACKENDS 里添加自定义认证 CustomBackend(邮箱、手机号等),

    KEVINGUO_CN
  • 从 IP 开始,学习数字逻辑:FIFO 篇(上)

    使用 ip 对于数字逻辑方面的工作来说,是非常正常的,基础的 ip 之于数字逻辑设计,与与非门相比大概只是设计层次上的差别。更何况对于 SoC 公司来说...

    碎碎思
  • NodeJS学习二CommonJS规范

    Node程序由许多个模块组成,每个模块就是一个文件。Node模块采用了CommonJS规范。

    空空云
  • 将keras的h5模型转换为tensorflow的pb模型操作

    背景:目前keras框架使用简单,很容易上手,深得广大算法工程师的喜爱,但是当部署到客户端时,可能会出现各种各样的bug,甚至不支持使用keras,本文来解决的...

    砸漏

扫码关注云+社区

领取腾讯云代金券