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