一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 2023年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像与容器时,怎样快速精准的对海量容器进行管理和编排就又成了新的课题,此时,由Google开源的Kubernetes(读音\[kubə'netis\],业界也有称其k8s的,但k8s其实就是文盲版的Kubernetes,只是因为k和s之间有8个字母)就应时而生了,它是一个开源的用于多个主机虚拟成一个云平台后进行容器资源管理和应用编排引擎,致力于让部署容器化应用简单并且高效,提供了应用的全生命周期管理,如应用部署,规划,更新,维护等机制。本次我们尝试在Win10/Mac系统下,

2023年,君不言容器技术则已,欲言容器则必称Docker,毫无疑问,它是当今最流行的容器技术之一,但是当我们面对海量的镜像与容器时,怎样快速精准的对海量容器进行管理和编排就又成了新的课题,此时,由Google开源的Kubernetes(读音[kubə'netis],业界也有称其k8s的,但k8s其实就是文盲版的Kubernetes,只是因为k和s之间有8个字母)就应时而生了,它是一个开源的用于多个主机虚拟成一个云平台后进行容器资源管理和应用编排引擎,致力于让部署容器化应用简单并且高效,提供了应用的全生命周期管理,如应用部署,规划,更新,维护等机制。本次我们尝试在Win10/Mac系统下,利用Kubernetes部署Gunicorn+Flask高可用Web集群项目。

首先,Kubernetes基于Docker-desktop,所以下载Docker-desktop安装包:https://www.docker.com/products/docker-desktop

这里我们使用的就是Docker官方最新版3.1.0,内部集成的Kubernetes版本是1.19.3,在安装之前有两点要说明下,如果是Windows用户,需要确保系统版本为专业版:

第二,在专业版的基础上,开启系统的Hyper-v虚拟化功能:

所以Windows用户想要对Kubernetes一亲芳泽的话,同时确保上面两点即可,而Mac用户则无特殊要求。

双击安装包进行安装,默认安装在C盘目录,成功后,启动Docker-desktop,一般情况下,Docker很容易启动成功,但是Kubernetes往往会卡在启动界面,这是因为一些学术问题导致无法下载Kubernetes的依赖镜像,此时我们需要另辟蹊径,采用一些开源的三方库迂回帮我们下载这些镜像,这里推荐这个开源项目:https://github.com/AliyunContainerService/k8s-for-docker-desktop

输入命令拉取项目:

git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop.git

进入项目的目录内,然后检查自己的Kubernetes版本号,该项目默认拉取的就是1.19.3的依赖镜像,如果您安装的Kubernetes是老版本,需要自行切换版本进行拉取操作:

如Kubernetes版本为 v1.18.8, 请使用下面命令切换 v1.18.8 分支 git checkout v1.18.8
如Kubernetes版本为 v1.18.6, 请使用下面命令切换 v1.18.6 分支 git checkout v1.18.6
如Kubernetes版本为 v1.18.3, 请使用下面命令切换 v1.18.3 分支 git checkout v1.18.3
如Kubernetes版本为 v1.16.5, 请使用下面命令切换 v1.16.5 分支 git checkout v1.16.5
如Kubernetes版本为 v1.15.5, 请使用下面命令切换 v1.15.5 分支 git checkout v1.15.5
如Kubernetes版本为 v1.15.4, 请使用下面命令切换 v1.15.4 分支 git checkout v1.15.4
如Kubernetes版本为 v1.14.8, 请使用下面命令切换 v1.14.8 分支 git checkout v1.14.8
如Kubernetes版本为 v1.14.7, 请使用下面命令切换 v1.14.7 分支 git checkout v1.14.7
如Kubernetes版本为 v1.14.6, 请使用下面命令切换 v1.14.6 分支 git checkout v1.14.6
如Kubernetes版本为 v1.14.3, 请使用下面命令切换 v1.14.3 分支 git checkout v1.14.3
如Kubernetes版本为 v1.14.1, 请使用下面命令切换 v1.14.1 分支 git checkout v1.14.1
如Kubernetes版本为 v1.13.0, 请使用下面命令切换 v1.13.0 分支 git checkout v1.13.0
如Kubernetes版本为 v1.10.11, 请使用下面命令切换 v1.10.11 分支 git checkout v1.10.11

随后,如果是Mac用户直接执行shell脚本:

./load_images.sh

如果是Windows用户,需要执行set-ExecutionPolicy RemoteSigned命令后再执行脚本:

set-ExecutionPolicy RemoteSigned  
.\load_images.ps1

执行后发现代理拉取Kubernetes依赖镜像:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> set-ExecutionPolicy RemoteSigned  
  
执行策略更改  
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 https:/go.microsoft.com/fwlink/?LinkID=135170  
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?  
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): y  
PS C:\Users\Administrator\www\k8s-for-docker-desktop> .\load_images.ps1  
k8s.gcr.io/pause:3.2=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2  
3.2: Pulling from google_containers/pause  
Digest: sha256:927d98197ec1141a368550822d18fa1c60bdae27b78b0c004f705f548c07814f  
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2  
registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2  
Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2  
Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/pause@sha256:927d98197ec1141a368550822d18fa1c60bdae27b78b0c004f705f548c07814f  
k8s.gcr.io/kube-controller-manager:v1.19.3=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.3  
v1.19.3: Pulling from google_containers/kube-controller-manager  
Digest: sha256:1ad35b623b9123c6aab99306ba5427e2829b36b378b9b80a6e988713ac5bffd4  
Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.3  
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.3  
Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.19.3  
Untagged: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager@sha256:1ad35b623b9123c6aab99306ba5427e2829b36b378b9b80a6e988713ac5bffd4

拉取结束后,执行命令查看镜像列表:

docker images

可以看到,针对Kubernetes1.19.3的基础镜像列表:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> docker images  
REPOSITORY                                                       TAG                                                     IMAGE ID       CREATED         SIZE  
redis                                                            latest                                                  621ceef7494a   3 weeks ago     104MB  
docker/desktop-kubernetes                                        kubernetes-v1.19.3-cni-v0.8.5-critools-v1.17.0-debian   bb2106081d17   2 months ago    285MB  
k8s.gcr.io/kube-proxy                                            v1.19.3                                                 cdef7632a242   3 months ago    118MB  
k8s.gcr.io/kube-apiserver                                        v1.19.3                                                 a301be0cd44b   3 months ago    119MB  
k8s.gcr.io/kube-controller-manager                               v1.19.3                                                 9b60aca1d818   3 months ago    111MB  
k8s.gcr.io/kube-scheduler                                        v1.19.3                                                 aaefbfa906bd   3 months ago    45.7MB  
k8s.gcr.io/etcd                                                  3.4.13-0                                                0369cf4303ff   5 months ago    253MB  
k8s.gcr.io/coredns                                               1.7.0                                                   bfe3a36ebd25   7 months ago    45.2MB  
docker/desktop-storage-provisioner                               v1.1                                                    e704287ce753   10 months ago   41.8MB  
docker/desktop-vpnkit-controller                                 v1.0                                                    79da37e5a3aa   11 months ago   36.6MB  
k8s.gcr.io/pause                                                 3.2                                                     80d28bedfe5d   11 months ago   683kB  
quay.io/kubernetes-ingress-controller/nginx-ingress-controller   0.26.1                                                  29024c9c6e70   16 months ago   483MB

此时,不要着急,如果是Mac用户,需要单独删除一下缓存:

# rm -rf ~/Library/Group\ Containers/group.com.docker/pki/  
# rm -rf ~/.kube

Windows用户不需额外操作,直接重启Docker-desktop,并且点击开启Kubernetes服务:

随后,在命令行中键入命令:

kubectl version

如果能返回版本号说明安装和配置成功:

PS C:\Users\Administrator> kubectl version  
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:50:19Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"windows/amd64"}  
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.3", GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df", GitTreeState:"clean", BuildDate:"2020-10-14T12:41:49Z", GoVersion:"go1.15.2", Compiler:"gc", Platform:"linux/amd64"}  
PS C:\Users\Administrator>

接下来,我们简单的部署一下Kubernetes容器,看看和Docker部署有何不同,先来看看Docker传统的部署方式,假设部署一台redis应用,首先拉取镜像:

docker pull redis

启动容器:

docker run -p 6380:6379 --name redis redis

使用redis客户端进行链接:

redis-cli -p 6380

返回数据库链接状态:

PS C:\Users\Administrator> redis-cli -p 6380  
127.0.0.1:6380> ping  
PONG

没有任何问题,因为Docker直接操作的对象就是镜像和容器,而Kubernetes是基于Deployment来对集群的Pod和rs服务进行管理,每一个Deployment 都对应集群中的一次部署,所以Deployment是基本的 Kubernetes对象。

首先建立Deployment对象:

kubectl create deployment --image=redis redis

这里镜像还是使用刚才拉取的redis镜像,deployment别名设置为redis:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> kubectl create deployment --image=redis redis  
deployment.apps/redis created

创建成功后,启动rs服务:

kubectl expose deployment redis --port=6379 --name=redis-server

这里的端口号是pod中隔离容器的端口,而非主节点端口:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> kubectl expose deployment redis --port=6379 --name=redis-server  
service/redis-server exposed

随后获取启动的pod列表:

kubectl get pods

我们知道pod是集群执行的最小单位,这里使用get pods来查看运行的pod:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> kubectl get pods  
NAME                     READY   STATUS    RESTARTS   AGE  
redis-6749d7bd65-l8gnw   1/1     Running   0          64s

可以看到已经运行成功,最后需要将pod端口和主节点端口进行端口映射操作:

kubectl port-forward redis-6749d7bd65-l8gnw 6380:6379

这里的参数就是pod的name:

PS C:\Users\Administrator\www\k8s-for-docker-desktop> kubectl port-forward redis-6749d7bd65-l8gnw 6380:6379             Forwarding from 127.0.0.1:6380 -> 6379  
Forwarding from [::1]:6380 -> 6379  
Handling connection for 6380  
Handling connection for 6380

随后使用redis客户端进行链接:

PS C:\Users\Administrator> redis-cli -p 6380  
127.0.0.1:6380> ping  
PONG

这里就部署成功了,虽然流程上要比Docker直接部署要略微繁复一些,但是Kubernetes自带良好的伸缩和扩展以及高可用特性,一旦pod僵死或者宕机,可以自动生成新的pod的来实现高可用。

接下来尝试一些进阶操作,部署Gunicorn+Flask的Web应用,还记得之前的这篇文章:利用DockerHub在Centos7.7环境下部署Nginx反向代理Gunicorn+Flask独立架构吗?里面详细阐述了如何使用Dockerfile打包镜像,这里我们拉取已经打包好的flask+gunicorn镜像:

docker pull zcxey2911/myflask

接着建立基于deployment的部署配置文件:deployment.yaml

apiVersion: v1  
kind: Service  
metadata:  
  name: myflask  
spec:  
  selector:  
    app: myflask  
  ports:  
  - protocol: "TCP"  
    port: 5000  
    targetPort: 5000  
  type: LoadBalancer  
  
---  
apiVersion: apps/v1  
kind: Deployment  
metadata:  
  name: myflask  
spec:  
  selector:  
    matchLabels:  
      app: myflask  
  replicas: 4  
  template:  
    metadata:  
      labels:  
        app: myflask  
    spec:  
      containers:  
      - name: myflask  
        image: zcxey2911/myflask  
        imagePullPolicy: Never  
        ports:  
        - containerPort: 5000

这个配置文件的含义是:将本地的myfalsk镜像作为Deployment基础镜像部署,集群运行四个pod来维持生产环境的服务保证,运行协议当然是TCP,主节点端口号和pod端口保持一致都是5000

然后执行命令启动服务:

kubectl apply -f deployment.yaml

查看服务状态:

liuyue:myflask liuyue$ kubectl get pods  
NAME                      READY   STATUS    RESTARTS   AGE  
myflask-74f646444-h7rtf   1/1     Running   0          42h  
myflask-74f646444-lfrdw   1/1     Running   0          42h  
myflask-74f646444-p96jl   1/1     Running   0          43h  
myflask-74f646444-zc7fp   1/1     Running   0          43h

可以看到四台pod同时运行,访问网址:http://localhost:5000

没有问题,即使我们手动kill一台pod:

liuyue:myflask liuyue$ kubectl delete pod myflask-74f646444-h7rtf  
pod "myflask-74f646444-h7rtf" deleted  
  
liuyue:myflask liuyue$   
liuyue:myflask liuyue$ kubectl get pods  
NAME                      READY   STATUS    RESTARTS   AGE  
myflask-74f646444-dg8v7   1/1     Running   0          10s  
myflask-74f646444-lfrdw   1/1     Running   0          42h  
myflask-74f646444-p96jl   1/1     Running   0          43h  
myflask-74f646444-zc7fp   1/1     Running   0          43h

可以看到集群立刻又会重新生成一个pod来维持服务稳定,这就是Docker原生容器所不具备的高可用特性。

结语:未来已来,将至已至,在21世纪的第二个十年里,阿里、字节跳动、腾讯、百度等中国互联网行业巨擘们,都在加紧深耕容器领域,而Kubernetes也是这些大厂未来的战略核心。有了Kubernetes,我们就可以将整个大规模的服务器对计算资源抽象化通过一个个容器进行自动化且细致化管理,将最终的应用服务交还给用户,而用户则并不需要关心容器本身。最后,奉上项目地址与君共飨:https://gitee.com/QiHanXiBei/myflask

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
26天前
|
开发框架 数据库 开发者
Web开发新境界:用Python玩转Django和Flask!
【6月更文挑战第12天】Python的Web开发框架Django和Flask各有千秋。Django是全能型框架,适合快速开发大型应用,提供ORM、模板引擎、URL路由和后台管理等全面功能。Flask则轻量级且灵活,适用于小型到中型应用,以其简单易用、高度可扩展和灵活路由著称。两者结合使用,能应对各种Web开发需求。
|
1月前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
41 1
|
19天前
|
关系型数据库 MySQL 数据库
如何使用Python的Flask框架来构建一个简单的Web应用
如何使用Python的Flask框架来构建一个简单的Web应用
35 0
|
1月前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
146364 19
|
18天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
|
19天前
|
开发框架 开发者 Python
使用 Flask 为 Web 应用添加路由
通过学习 Flask 中的视图函数和路由规则,你可以使用 Flask 构建强大的 Web 应用程序并为其添加功能。在 Flask 中,视图函数以 Python 函数的形式定义,每个视图函数都与一个 URL 相关联。在 Flask 中,URL 处理程序被称为视图函数,它们用于响应客户端请求并返回响应。在 Flask 应用程序中,这是可选的。在这里,我们将其命名为 'hello',并将其与 URL '/hello/<name>' 绑定在一起。在上面的示例中,我们使用了默认的视图函数名称 'hello'。
18 2
|
1月前
|
运维 Kubernetes Java
Java一分钟之Kubernetes(K8s):容器编排深入浅出
【6月更文挑战第6天】Kubernetes是容器编排的主流工具,简化分布式系统运维。本文介绍了K8s核心概念:节点、Pod、服务、部署和副本集。讨论了资源不足、依赖服务未就绪等常见问题及其解决策略,并提供创建Deployment的代码示例。学习K8s能提升部署效率和运维灵活性。
131 5
|
10天前
|
监控 Serverless API
函数计算操作报错合集之在函数计算用gunicorn启动flask,会报错找不到这个包,该怎么办
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
10天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
19 0
|
1月前
|
API 数据库 数据库管理
Flask Web开发基础:数据库与ORM实战
该文介绍了如何使用 Flask、SQLAlchemy 和 SQLite 实现数据库操作。首先,通过创建虚拟环境和安装 flask-sqlalchemy(版本2.5.1)及 sqlalchemy(版本1.4.47)来设置环境。接着,配置数据库URI,定义User和Movie模型类表示数据库表,并通过db.create_all()创建表。文章还展示了如何插入、查询、更新和删除记录,强调了db.session.commit()在保存更改中的关键作用。查询涉及filter、order_by等方法,提供了一系列示例。
305 1

相关产品

  • 容器服务Kubernetes版