原文转载自「刘悦的技术博客」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/produc...

这里咱们应用的就是Docker官网最新版3.1.0,外部集成的Kubernetes版本是1.19.3,在装置之前有两点要阐明下,如果是Windows用户,须要确保零碎版本为专业版:

第二,在专业版的根底上,开启零碎的Hyper-v虚拟化性能:

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

双击安装包进行装置,默认装置在C盘目录,胜利后,启动Docker-desktop,个别状况下,Docker很容易启动胜利,然而Kubernetes往往会卡在启动界面,这是因为一些学术问题导致无奈下载Kubernetes的依赖镜像,此时咱们须要另辟蹊径,采纳一些开源的三方库曲折帮咱们下载这些镜像,这里举荐这个开源我的项目:https://github.com/AliyunCont...

输出命令拉取我的项目:

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

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