容器和 Kubernetes 入门:数字海洋工作坊工具包

<$>[备注] [标签容器和Kubernetes研讨会套件材料入门 ] 该Meetup工具包旨在帮助技术受众熟悉Kubernetes的核心概念和实践。

其目的是为演讲者提供一套完整的资源来主持活动,并发表关于容器和Kubernetes的介绍性演讲。它包括:

本教程旨在通过额外的细节和说明来补充Talk演示。它也为寻求在DigitalOcean Kubernetes上启动和运行最小集装箱化瓶应用程序的读者提供参考。 <$>

简介

在过去的十年中,容器化应用程序和容器集群迅速取代了使用虚拟机扩展应用程序的旧模式。容器提供了相同的进程隔离,但通常比完全虚拟化更轻量级、可移植和更高性能。容器集群可用于跨一组物理机管理数千个正在运行的容器,它抽象了推出新版本应用程序、扩展应用程序和高效调度工作负载的大部分工作。其中,Kubernetes已经成为一个成熟的、可投入生产的系统。它提供了一系列丰富的功能,如滚动部署、运行状况检查、自我监控、工作负载自动扩展等。

本教程将向您展示如何利用这些技术,并将)。

前提条件

要学习本教程,您需要:

  • 启用基于角色的访问控制(RBAC)的Kubernetes 1.10+集群。此设置将使用DigitalOcean Kubernetes cluster
  • 安装在本地机器或开发服务器上的kubectl命令行工具,配置为连接到您的集群。您可以在官方documentation.]中阅读有关安装kubectl的更多信息
  • 您的本机或开发服务器上安装了Docker。如果您使用的是Ubuntu18.04,请按照如何在Ubuntu 18.04;上安装和使用Docker]中的步骤1和2操作,否则,请遵循官方documentation]了解在其他操作系统上安装的信息。请确保将您的非根用户添加到docker组中,如链接教程的步骤2所述。
  • ADocker Hub帐号,可选。有关如何设置的概述,请参考此introduction到Docker Hub。 如果您计划修改本教程中介绍的FlaskDocker镜像,则仅需要Docker Hub帐户。**

第一步-克隆应用仓库并构建烧瓶镜像

首先,将演示Flaskapp repo克隆到您的计算机上,导航到该目录,并列出目录内容:

1git clone https://github.com/do-community/k8s-intro-meetup-kit.git
2cd k8s-intro-meetup-kit
3ls
1[secondary_label Output]
2LICENSE README.md app k8s

app目录包含FlaskDemo应用程序代码,以及构建容器镜像的Dockerfilek8s目录包含实例、部署和服务的Kubernetes清单文件。要了解有关这些Kubernetes对象的更多信息,请参阅幻灯片或Kubernetes.简介

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

1cat app.py
 1[secondary_label Output]
 2from flask import Flask
 3app = Flask(__name__)
 4
 5@app.route('/')
 6def hello_world():
 7    return 'Hello, World!'
 8
 9if __name__ == "__main__":
10    app.run(debug=True, host='0.0.0.0')

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

以类似的方式,cat出应用程序的Dockerfile的内容:

1cat Dockerfile
 1[secondary_label Output]
 2FROM python:3-alpine
 3
 4WORKDIR /app
 5
 6COPY requirements.txt .
 7RUN pip install -r requirements.txt
 8
 9COPY . .
10
11EXPOSE 5000
12
13CMD ["python", "app.py"]

该Dockerfile首先提供了一个轻量级的阿尔卑斯山Linux Python父映像。然后复制到Python需求文件中,安装Flask,将APP代码复制到容器镜像中,并定义端口5000为容器端口,最后将默认命令设置为python app.py

接下来,构建应用程序映像:

1cd app
2docker build -t flask_demo:v0 .

我们使用-t选项为镜像命名为flASK_demo,并为其添加标签v0

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

1docker run -p 5000:5000 flask_demo:v0

此命令使用flask:v0镜像运行容器,并将本地端口5000转发到容器端口5000

如果您在本地机器上运行Docker,请在Web浏览器中导航到http://localhost:5000。你应该会看到Hello World,这是由Dockerized Flask应用程序生成的。

如果您在开发服务器上运行Docker,请导航到http://dev_server_external_IP:5000.如果您运行的是像UFW这样的防火墙,请确保允许在端口`5000‘上进行外部访问。要了解有关使用UFW执行此操作的更多信息,请参考UFW基础:通用防火墙规则和Commands.

此时,您可以尝试使用Docker命令,如docker psdocker topdocker images,以练习在系统上使用图像和容器。

下一步,我们将把这个演示应用部署到您的Kubernetes集群。我们将使用预构建的映像Docker Hub上的共享publicly。如果您想要自定义Flaskapp并使用您自己的镜像,您应该创建一个Docker Hub帐户,并按照此introduction]中的步骤将您的镜像推送到公共存储库。从那里,Kubernetes将能够将容器镜像拉入并部署到您的集群中。

第二步-在Kubernetes上部署FlaskApp

上一步中描述的应用程序和Docker镜像已经构建完毕,并在flask-helloworldDocker Hub存储库中公开可用。您可以选择为应用程序创建自己的存储库,并在整个步骤中将其替换为flASK-helloworld

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

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

创建名为flask的命名空间:

1kubectl create namespace flask

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

1kubectl get namespace

您应该会看到新的命名空间以及一些默认的命名空间,如kube-systemdefault。在本教程中,我们将专门在flask命名空间中工作。

导航回demo repo中的k8s目录:

1cd ../k8s

在该目录中,您将看到三个Kubernetes清单文件:

  • flask-pod.yaml:应用Pod清单
  • flask-deployment.yaml:应用部署清单
  • flask-service.yaml:应用程序LoadBalancer服务清单

让我们来看看Pod清单:

1cat flask-pod.yaml
 1[secondary_label Output]
 2apiVersion: v1
 3kind: Pod
 4metadata:
 5  name: flask-pod
 6  labels:
 7    app: flask-helloworld
 8spec:
 9  containers:
10  - name: flask
11    image: hjdo/flask-helloworld:latest
12    ports:
13    - containerPort: 5000

在这里,我们定义了一个名为flask-pod的最小Pod,并使用app:flask-helloworld键值对对其进行标记。

然后,我们将单个容器命名为flask,并从hjdo/flaskhelloworldDocker Hub存储库中将镜像设置为flaskHelloworld:latest。如果您使用的是存储在不同Docker Hub库中的镜像,您可以在此处的Image字段中引用它。最后,我们打开端口5000以接受传入连接。

使用kubectl app-f-n命名空间标志将该实例部署到flask命名空间中:

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

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

1kubectl get pod -n flask
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3flask-pod 1/1 Running 0 4s

由于该实例运行在Kubernetes集群内部,我们需要将本地端口转发到实例的tainerPort,才能在本地访问正在运行的APP:

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

这里我们使用port-forward将本地端口5000转发到实例的tainerPort``5000

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

您可以随意使用kubectl命令(如kubectl describe)来探索Pod资源。完成后,使用delete删除Pod:

1kubectl delete pod flask-pod -n flask

接下来,我们将使用部署资源以可扩展的方式推出此Pod。打印出flask.yaml清单文件的内容:

1cat flask-deployment.yaml
 1[secondary_label Output]
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: flask-dep
 6  labels:
 7    app: flask-helloworld
 8spec:
 9  replicas: 2
10  selector:
11    matchLabels:
12      app: flask-helloworld
13  template:
14    metadata:
15      labels:
16        app: flask-helloworld
17    spec:
18      containers:
19      - name: flask
20        image: hjdo/flask-helloworld:latest
21        ports:
22        - containerPort: 5000

在这里,我们定义了一个名为flaskep的部署,并带有app:flaskhelloworld标签。接下来,我们请求一个Pod模板的2个副本,该模板与我们之前用于部署Flaskapp Pod的模板相同。选择器字段将app:flASK-helloworldPod模板匹配到部署。

使用kubectl Apply-f展开部署:

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

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

1kubectl get deploy -n flask
1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE
3flask-dep 2/2 2 2 5s

您还可以调出由部署控制器管理的各个Pod:

1kubectl get pod -n flask
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3flask-dep-876bd7677-bl4lg 1/1 Running 0 76s
4flask-dep-876bd7677-jbfpb 1/1 Running 0 76s

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

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

这会将本地端口5000转发到其中一个正在运行的Pod上的容器端口5000

您应该能够访问应用程序在http://localhost:5000。如果您在远程dev服务器上运行kubectl,请将localhost替换为dev服务器的外部IP地址。

此时,您可以尝试使用kubectl roll outkubectl scale等命令来尝试回滚和扩展部署。要了解有关这些命令和其他kubectl命令的更多信息,请参阅kubectl cheat Sheet.

在最后一步中,我们将使用负载均衡器服务类型向外部用户公开此应用程序,这将自动提供DigitalOcean云为Flaskapp服务加载Balancer

第三步-创建应用服务

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

首先检查服务清单文件:

1cat flask-service.yaml
 1[secondary_label Output]
 2apiVersion: v1
 3kind: Service
 4metadata:
 5  name: flask-svc
 6  labels:
 7    app: flask-helloworld
 8spec:
 9  type: LoadBalancer
10  ports:
11  - port: 80
12    targetPort: 5000
13    protocol: TCP
14  selector:
15    app: flask-helloworld

该清单定义了一个名为flasksvc的服务。我们将类型设置为LoadBalancer,以配置一个将流量路由到部署实例的DigitalOcean负载均衡。要选择已经运行的部署,可以将选择器字段设置为部署的app:flaskhelloworld标签。最后,我们在负载均衡器上打开80端口,并指示它将流量路由到Pod‘tainerPort5000

要创建服务,请使用kubectl Apply-f

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

Kubernetes配置负载均衡可能需要一些时间。您可以使用-w监视标志来跟踪进度:

1kubectl -n flask get svc -w

当您看到flasksvc服务的外部IP后,使用Web浏览器导航到它。你应该会看到Hello World的应用程序页面。

总结

这篇简短的教程演示了如何包装一个最小的Flaskapp并将其部署到Kubernetes集群中。它附带MeetUp工具包的幻灯片和演讲者notesGitHub repository.

Published At
Categories with 技术
comments powered by Disqus