这个会面工具包旨在帮助技术观众熟悉 Kubernetes 的核心概念和实践。 其目的是为发言者提供一套完整的资源来主持一项活动,并就集装箱和 Kubernetes 作介绍性发言。 它包括: 幻灯片和演讲者笔记与命令运行现场演示。 这个演讲持续了大约45分钟。 本教程指导用户在 DigitalOcean Kubernetes 集群上展开示例“ Hello World” Flask 应用程序。本教程旨在通过附加细节和说明来补充演讲示例。 它也作为读者寻求得到一个最小的集装箱烧瓶应用程序和运行在 DigitalOcean Kubernetes 上的参考。

引言

在过去的十年中,集装箱化应用程序和容器集群已经迅速取代了使用虚拟机扩展应用程序的旧范例。 容器提供相同的虚拟化进程隔离,但是通常比完全虚拟化更轻量级、更便携、更高效。 容器集群可以用来管理一组物理机器上数以千计的运行容器,它抽象了大量的工作,包括推出新版本的应用程序,扩展它们,以及高效地调度工作负载。 除此之外,Kubernetes 已成为一个成熟的、可投入生产的体系。 它提供了一系列丰富的特性,比如滚动部署、健康检查、自我监视、工作负载自动缩放等等。

本教程是为了配合使用 Kubernetes Meetup Kit 的幻灯片和演讲者说明而设计的,它将向您展示如何利用这些技术,并将“ Hello World” Flask 应用部署到数字集群上。

先决条件

要遵循本教程,你需要:

  • 一个支持 RBAC 的库伯内特斯1.10 + 集群,这个设置将使用数字以角色为基础的存取控制库伯内特斯集群
  • Kubectl 命令行工具安装在本地计算机或开发服务器上,并配置为连接到集群。 您可以在官方文档中阅读关于安装 kubectl 的更多信息。
  • 安装在本地计算机或开发服务器上的 Docker。 如果你正在使用 Ubuntu 18.04,请按照如何在 Ubuntu 18.04上安装和使用 Docker 的步骤1和2操作; 否则,请按照官方文档了解在其他操作系统上的安装信息。 请确保将非根用户添加到 docker 组中,如链接教程的步骤2中所述。
  • 一个 dockerhub 帐户(可选)。 要了解如何设置这个属性的概述,请参阅对 dockerhub 的介绍。 如果您计划修改本教程中描述的 Flask Docker 映像,那么您只需要一个 Docker Hub 帐户。

第一步: 克隆应用程序库并建立烧瓶图像

首先,将 demo Flask app repo 复制到你的机器上,导航到目录,并列出目录内容:

  • git clone https://github.com/do-community/k8s-intro-meetup-kit.git
  • cd k8s-intro-meetup-kit
  • ls
Output
LICENSE README.md app k8s

应用程序目录包含 Flask demo 应用程序代码,以及用于构建其容器映像的 Dockerfile。 K8s 目录包含针对 Pod、 Deployment 和 Service 的 Kubernetes 清单文件。 要了解更多关于这些库伯内特物品的信息,请参考幻灯片或《 Kubernetes 简介》。

导航到 app 目录并打印 app.py 文件的内容:

  • cat app.py
Output
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello, World!' if __name__ == "__main__": app.run(debug=True, host='0.0.0.0')

这段代码定义了一个默认路由,它将打印“ Hello World” 此外,应用程序在调试模式下运行,以启用详细输出。

以类似的方式,屏蔽掉应用程序的 Dockerfile 的内容:

  • cat Dockerfile
Output
FROM python:3-alpine WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . EXPOSE 5000 CMD ["python", "app.py"]

这个 Dockerfile 首先提供了一个轻量级 Alpine Linux Python 父图像。 然后,它在 Python 需求文件中进行复制,安装 Flask,将应用程序代码复制到容器映像中,将端口5000定义为容器端口,最后将缺省命令设置为 Python app.py。

接下来,构建应用程序形象:

  • cd app
  • docker build -t flask_demo:v0 .

我们使用-t 选项为图像提供了名称、烧瓶演示和标记 v0。

在 Docker 完成构建之后,使用 run 运行容器:

  • docker run -p 5000:5000 flask_demo:v0

该命令使用 flask: v0 image 运行一个容器,并将本地端口5000转发到容器端口5000。

如果你在本地机器上运行 Docker,在你的网页浏览器中导航到 google http://localhost:5000。 您应该看到由 dockerized Flask 应用程序生成的“ Hello World”。

如果您在开发服务器上运行 Docker,请转到 http: / / dev server external ip: 5000。 如果你正在运行一个像 UFW 一样的防火墙,一定要允许外部访问端口5000。 要了解更多有关这样做与 UFW,请参考 UFW 基本要点: 通用防火墙规则和命令。

此时,您可以尝试使用 Docker 命令,比如 Docker ps、 Docker top 和 Docker 映像,以便在您的系统上练习使用映像和容器。

在下一步,我们将把这个演示应用程序部署到您的 Kubernetes 集群。 我们将使用一个在 dockerhub 上公开共享的预构建映像。 如果你想自定义 Flask 应用并使用你自己的图片,你应该创建一个 Docker Hub 帐户,并按照本介绍中的步骤将你的图片推送到公共存储库。 从那里,Kubernetes 将能够将容器映像拉入并部署到集群中。

第二步ー在 Kubernetes 上部署 Flask 应用

前面步骤中描述的应用程序和 Docker 映像已经构建完成,并已在 flask-helloworld Docker Hub 库中公开提供。 您可以选择为应用程序创建自己的存储库,并在整个步骤中将其替换为 flask-helloworld。

我们首先将这个演示的“ Hello World”应用程序部署到我们的集群中,作为一个独立的 Pod,然后作为一个多 Pod Deployment,最后作为一个 LoadBalancer 服务公开。 在本教程的最后,“ Hello World”应用程序将可以从 Kubernetes 集群之外公开访问。

在将任何工作负载启动到集群之前,我们将创建一个对象将在其中运行的名称空间。 命名空间允许您对集群进行分段并限制运行工作负载的范围。

创建一个名为 flask 的名称空间:

  • kubectl create namespace flask

现在,列出集群中的所有名称空间:

  • kubectl get namespace

您应该看到新的 Namespace 以及一些默认的 Namespaces,如 kube-system 和 default。 在本教程中,我们将专门在 flask Namespace 中工作。

返回到 demo repo 中的 k8s 目录:

  • cd ../k8s

在这个目录中,你会看到三个 Kubernetes 清单文件:

  • 应用程序舱清单
  • 部署应用程序清单
  • 应用程序 LoadBalancer 服务清单

让我们来看看 Pod 的清单:

  • cat flask-pod.yaml
Output
apiVersion: v1 kind: Pod metadata: name: flask-pod labels: app: flask-helloworld spec: containers: - name: flask image: hjdo/flask-helloworld:latest ports: - containerPort: 5000

在这里,我们定义了一个称为 flask-Pod 的最小 Pod,并用 app: flask-helloworld 键值对对来标记它。

然后,我们从 hjdo / flask-helloworld Docker Hub 存储库中为单个容器 flask 命名并将图像设置为 flask-helloworld: latest。 如果您正在使用存储在不同 dockerhub repo 中的映像,您可以使用这里的 image 字段引用它。 最后,我们打开端口5000来接受传入的连接。

使用 kubectl apply-f 和-n Namespace 标志将这个 Pod 部署到 flask Namespace 中:

  • kubectl apply -f flask-pod.yaml -n flask

大约10秒后,Pod 应该在集群中启动并运行:

  • kubectl get pod -n flask
Output
NAME READY STATUS RESTARTS AGE flask-pod 1/1 Running 0 4s

因为这个 Pod 运行在 Kubernetes 集群内部,所以我们需要将一个本地端口转发到 Pod 的 containerPort 以访问本地运行的应用程序:

  • kubectl port-forward pods/flask-pod -n flask 5000:5000

这里我们使用 port-forward 将本地端口5000转发到 Pod 的 containerPort 5000。

导航到 http://localhost:5000,在那里你应该会再次看到由 Flask 应用程序生成的“ Hello World”文本。 如果您在远程开发服务器上运行 kubectl,那么用您的开发服务器的外部 IP 地址替换 localhost。

请随意使用 kubectl 这样的命令来探索 Pod 资源。 完成后,使用 delete 删除 Pod:

  • kubectl delete pod flask-pod -n flask

接下来,我们将使用 Deployment 资源以可伸缩的方式推出这个 Pod。 打印出放置烧瓶的内容物。 Yaml 清单文件:

  • cat flask-deployment.yaml
Output
apiVersion: apps/v1 kind: Deployment metadata: name: flask-dep labels: app: flask-helloworld spec: replicas: 2 selector: matchLabels: app: flask-helloworld template: metadata: labels: app: flask-helloworld spec: containers: - name: flask image: hjdo/flask-helloworld:latest ports: - containerPort: 5000

在这里,我们使用 app: flask-helloworld Label 定义一个名为 Deployment 的部署,称为 flask-dep。 接下来,我们请求一个 Pod 模板的2个副本,这个模板与我们之前部署 Flask app Pod 时使用的模板相同。 Selector 字段将 app: flask-helloworld Pod 模板匹配到 Deployment。

使用 kubectl apply-f 展开 Deployment:

  • kubectl apply -f flask-deployment.yaml -n flask

在一个短暂的片刻之后,部署应该在您的集群中启动并运行:

  • kubectl get deploy -n flask
Output
NAME READY UP-TO-DATE AVAILABLE AGE flask-dep 2/2 2 2 5s

你也可以拉出由 Deployment 控制器管理的单个 Pods:

  • kubectl get pod -n flask
Output
NAME READY STATUS RESTARTS AGE flask-dep-876bd7677-bl4lg 1/1 Running 0 76s flask-dep-876bd7677-jbfpb 1/1 Running 0 76s

要访问这个应用程序,我们必须转发集群中的一个端口:

  • kubectl port-forward deployment/flask-dep -n flask 5000:5000

这将把本地端口5000转发到其中一个正在运行的吊舱上的 containerPort 5000。

你应该可以在 http://localhost:5000上访问这个应用程序。 如果您在远程开发服务器上运行 kubectl,那么用您的开发服务器的外部 IP 地址替换 localhost。

此时,您可以使用诸如 kubectl rollout 和 kubectl scale 之类的命令来试验回滚部署并缩放它们。 要了解关于这些和其他 kubectl 命令的更多信息,请参考 kubectl Cheat Sheet。

在最后一步,我们将使用 LoadBalancer Service 类型向外部用户公开这个应用程序,它将自动为 Flask 应用程序服务提供一个 DigitalOcean 云负载均衡器。

第三步: 创建 App 服务

一个 Kubernetes 部署允许操作员灵活地上下扩展 Pod 模板,以及管理推出和模板更新。 要为这组正在运行的 Pod 副本创建一个稳定的网络端点,您可以创建一个 Kubernetes 服务,我们将在这里完成。

首先检查服务清单文件:

  • cat flask-service.yaml
Output
apiVersion: v1 kind: Service metadata: name: flask-svc labels: app: flask-helloworld spec: type: LoadBalancer ports: - port: 80 targetPort: 5000 protocol: TCP selector: app: flask-helloworld

这个清单定义了一个名为 flask-svc 的服务。 我们将类型设置为 LoadBalancer,以提供一个数字 alocean 云负载均衡器,该均衡器将把流量路由到 Deployment Pods。 要选择已经运行的 Deployment,选择器字段设置为 Deployment 的 app: flask-helloworld Label。 最后,我们打开负载均衡器上的80端口,并指示它将运输路由到吊舱的 containerPort 5000。

要创建服务,使用 kubectl apply-f:

  • kubectl apply -f flask-service.yaml -n flask

它可能需要一点时间为 Kubernetes 提供云负载均衡器。 您可以使用 -w 监视标志来跟踪进度:

  • kubectl get svc -w

一旦您看到 flask-svc 服务的外部 IP,请使用 web 浏览器导航到它。 你应该看到“ Hello World”的应用程序页面。

总结

这个简短的教程演示了如何包含一个最小的 Flask 应用程序并将其部署到一个 Kubernetes 集群。 它与聚会工具包的幻灯片、演讲者笔记和 GitHub 存储库一起出现。