最后更新2022/02/06
kubernetes engine,GCP提供了k8s管理docker容器,这是介于:
之间的东西,而且可能同时包含了两者的特点或者优势。
一个完整的计算引擎需要考虑大量的操作系统相关的东西,而对于一个简单应用来说,好多都是无需提供,用不到的东西。额外的冗余并不总是好的,浪费资源,需要额外的管理,启动时间慢,管理复杂。
一个普世的应用引擎并不简单,尽管看起来你只需要操心自己的业务逻辑,其它一切都由应用引擎负责。这里的关键是普世。让一个应用引擎去满足各种稀奇古怪的业务需求,就要求这个引擎(至少是模板)要即大又全,所有一切都包含在内,而这样操作的结果是应用引擎完全失去了其存在的基础:针对性、精简、高效。。。
如何能做到德才兼备呢?把其中各方面需求汇总一下,取其精华,是个什么东西?这就是容器container。
容器首先基于IaaS,是对OS和硬件的抽象。所谓抽象是只提供标准的,统一的服务接口,例如文件系统,网络协议栈,进程线程管理调度等等,而且这一切都是经过虚拟的,抽象的,硬件不再被用户可见。换句话说,这是OS的PaaS,是提供操作系统(把OS看作是一种应用)的服务引擎。
kubernetes是管理这些容器的工具,而容器可以由docker生成,或者也可以用google自己的google container builder(后者似乎没人用。。。)
具体如何实现呢?假设我有一个python应用app.py,需要使用python flask库,提供web访问,那么首先要有依赖文件,记录生成这个容器都要包含哪些最基本的东西:
cat <<EOF > app.py
.....略
EOF
cat <<EOF > requirements.txt
#标识依赖库和提供的服务,为pip安装使用
Flask==0.12
uwsgi==2.0.15
EOF
#标识容器如何生成
cat <<EOF > Dockerfile
FROM ubuntu:18.10
RUN apt-get update -y && \
apt-get install -y python3-pip python3-dev
COPY requirements.txt /app/requirements.txt
WORKDIR /app
RUN pip3 install -r requirements.txt
COPY . /app
ENDPOINT ["python3", "app.py"]
EOF
#生成容器
docker build -t my-app-server .
#运行
docker run -d my-app-server
以上简单两个文件,几个命令,就让python的web app跑起来了,而且还能具有高扩展、高可靠等诸多超能力,怎么实现呢?这时我们就需要kubernetes了。docker创建和管理每个独立的容器,kubernetes完成全部容器的管理。我们先要把容器和承载容器的设备分开,可以类比容器为每个具体的工作任务,而kubernetes管理着好多“工人”,其实是一个个服务器或者虚拟机,全功能的OS实例。
每个kubernetes整体被称为一个kubernetes集群,其中要有一个master(工头)部署着管理容器,其它为普通node(工人)。gcp,更进一步说在GKE(google kubernetes engine平台)上一条命令就可以完成这个基础设置过程:
gcloud container clusters create k1
当然,你也可以自己完全独立地基于计算引擎,自己一步步安装部署配置自己的kubernetes环境,但可能需要大半天的时间,而在GKE,只是几秒钟一条命令而已。
这里还要介绍一个概念:Pod
Pod是kubernetes的最小部署单位,也就是其实你不能只创建一个容器,要连带它的资源要求,打包在一起构成一个Pod。如果只有一个容器,那Pod基本和容器没啥区别,但如果有多个容器,Pod的作用就显现出来了:Pod中所有容器的资源是共享的,对外提供的IP、端口是统一的,也就是可以很容易就实现scale out。Pod是一个逻辑概念,可能会跨越多个容器承载节点Node,kubernetes通过虚拟以太网网桥技术,可以将不同Node上的容器整合到一起,尽管物理上很远,但在一个Pod内的容器之间感觉就在一个以太网网段之内。
如果实标准应用,k8s部署以上这一切非常简单,例如:
kubectl run nginx --image=nginx:1.15.7
一条命令,nginx启动。
#查看pod
kubectl get pods
#带一些客户化参数的,deployments是部署名,类似一个省缺的pod名吧。LoadBalancer则自动将nginx部署与GKE外部域名管理系统整合,将80端口对外开放,而且具有负载均衡能力
kubectl expose deployments nginx --port=80 --type=LoadBalancer
#查看对外服务情况
kubectl get services
#增加服务实例
kubectl scale nginx --replicas=3
#如果CPU使用超过80%,自动增加实例```
kubectl autoscale nginx --min=10 --max=15 --cpu=80
#显示运行参数
kubectl get pods -l "app=nginx"
#按照运行参数(文件)重置容器特性
kubectl apply -f xxxx.yaml