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

简介: 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

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
12月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
1059 6
|
Cloud Native 中间件 调度
云原生信息提取系统:容器化流程与CI/CD集成实践
本文介绍如何通过工程化手段解决数据提取任务中的稳定性与部署难题。结合 Scrapy、Docker、代理中间件与 CI/CD 工具,构建可自动运行、持续迭代的云原生信息提取系统,实现结构化数据采集与标准化交付。
1629 1
云原生信息提取系统:容器化流程与CI/CD集成实践
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1394 33
|
Prometheus Kubernetes 监控
OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性
聚焦近日OpenAI的大规模K8s集群故障,介绍阿里云容器服务与可观测团队在大规模K8s场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在K8s和Prometheus的高可用架构设计方面、事前事后的稳定性保障体系方面。
|
监控 关系型数据库 MySQL
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
zabbix7.0.9安装-以宝塔安装形式-非docker容器安装方法-系统采用AlmaLinux9系统-最佳匹配操作系统提供稳定运行环境-安装教程完整版本-优雅草卓伊凡
1263 30
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
2073 19
|
Kubernetes 应用服务中间件 nginx
二进制安装Kubernetes(k8s)v1.32.0
本指南提供了一个详细的步骤,用于在Linux系统上通过二进制文件安装Kubernetes(k8s)v1.32.0,支持IPv4+IPv6双栈。具体步骤包括环境准备、系统配置、组件安装和配置等。
5383 11
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1503 108

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多