写点什么

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

发布于: 2021 年 02 月 04 日
一寸宕机一寸血,十万容器十万兵|Win10/Mac系统下基于Kubernetes(k8s)搭建Gunicorn+Flask高可用Web集群

2021 年,君不言容器技术则已,欲言容器则必称 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


原文转载自「刘悦的技术博客」 https://v3u.cn/aid185


发布于: 2021 年 02 月 04 日阅读数: 89
用户头像

专注技术,凝聚意志,解决问题 v3u.cn 2020.12.21 加入

还未添加个人简介

评论

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