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

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/a_id_185

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

  1. Nginx笔记总结十五:nginx+keepalive+proxy_cache配置高可用nginx集群和高速缓存

    nginx编译 wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz ./configure --prefix=/usr/loca ...

  2. Dubbo入门到精通学习笔记(十六):Keepalived+Nginx实现高可用Web负载均衡

    文章目录 Keepalived+Nginx实现高可用Web负载均衡 Keepalived+Nginx实现高可用Web负载均衡 高可用架构篇 Keepalived + Nginx 实现高可用 Web 负 ...

  3. Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

    文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...

  4. Win10系统下基于Docker构建Appium容器连接Android模拟器Genymotion完成移动端Python自动化测试

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_196 Python自动化,大概也许或者是今年最具热度的话题之一了.七月流火,招聘市场上对于Python自动化的追捧热度仍未消减,那 ...

  5. 百万级高并发mongodb集群性能数十倍提升优化实践

    背景 线上某集群峰值TPS超过100万/秒左右(主要为写流量,读流量很低),峰值tps几乎已经到达集群上限,同时平均时延也超过100ms,随着读写流量的进一步增加,时延抖动严重影响业务可用性.该集群采 ...

  6. 容器化 | 在 K8s 上部署 RadonDB MySQL Operator 和集群

    作者:程润科 数据库研发工程师 编辑:张莉梅 高级文档工程师 视频:钱芬 高级测试工程师 本文将演示在 Kubernetes 上部署 RadonDB MySQL Kubernetes 2.X(Oper ...

  7. spring cloud深入学习(十二)-----Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式

    Zuul的核心 Filter是Zuul的核心,用来实现对外服务的控制.Filter的生命周期有4个,分别是“PRE”.“ROUTING”.“POST”.“ERROR”,整个生命周期可以用下图来表示. ...

  8. 四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_203 容器,又见容器.Docker容器的最主要优点就在于它们是可移植的.一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内 ...

  9. 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...

随机推荐

  1. opencv学习之边缘检测

    边缘检测 是图像处理 过程中经常会涉及到的一个环节.而在计算机视觉 和 机器学习领域,边缘检测 用于 特征提取 和 特征检测 效果也是特别明显.而 openCV 中进行边缘检测的 算法 真是五花八门, ...

  2. 用crash tool观察ARM64 Linux地址转换

    初学者学习Linux系统地址转换时,如果只是学习理论,又或者研读代码,那可能感觉比较枯燥.此时如果可以利用某些工具实际观察一下地址转换的过程,那可能会给枯燥的内核学习带来些微的乐趣.crash too ...

  3. 使用DSVPN解决分支网络出口为ADSL场景下的内网互通

    背景 最近接到一个项目是一家机构总部与多个分支之间的内网互通,总部具有固定ip,分部是使用adsl动态获取的不固定公网ip,由于两端互联网ip不固定所以不能使用传统的GRE技术来实现,所以最后经过评估 ...

  4. 论文解读《Bilinear Graph Neural Network with Neighbor Interactions》

    论文信息 论文标题:Bilinear Graph Neural Network with Neighbor Interactions论文作者:Hongmin Zhu, Fuli Feng, Xiang ...

  5. Centos7 安装 MPICH

    查看官网版本 https://www.mpich.org/downloads/ 最新的stable release是mpich 4.0.2,复制下载链接. 安装依赖 mpich需要系列依赖,如果不确定 ...

  6. python之模块(os、sys、json、subprocess)

    目录 os模块 sys模块 json模块 subprocess模块 os模块 os模块主要是与操作系统打交道. 导入os模块 import os 创建单层文件夹,路径必须要存在 os.mkdir(路径 ...

  7. 【单片机】CH32V103C8T6 ——窗口看门狗

    本章教程通过串口调试助手打印显示程序运行状态,具体现象如下: 若计数器值在上窗口值和下窗口值0X40之间的时候,进行喂狗操作,计数器重新计数,程序正常运行,串口打印显示:The program run ...

  8. 一文带你看懂Java中的Lock锁底层AQS到底是如何实现的

    前言 相信大家对Java中的Lock锁应该不会陌生,比如ReentrantLock,锁主要是用来解决解决多线程运行访问共享资源时的线程安全问题.那你是不是很好奇,这些Lock锁api是如何实现的呢?本 ...

  9. “摆地摊“都找不到全栈工程师?JNPF帮你分分钟搞定!

    大街上捕捉野生程序员 都这样了还找不到全栈工程师 全栈工程师(Full-Stack Engineer)图鉴: 全栈工程师,也叫全端工程师(同时具备前端和后台能力),英文Full Stack  deve ...

  10. 如何把你的 Android 使用得像 Linux

    前言 最近在学校里上课,老师讲的东西又听不进去,手里只有一个手机和一个平板,之前还可以用 ssh 连接云服务器玩点东西,但是我是用的软件 Juice ssh 并不是很友好,退出到后台一段时间后竟然会自 ...