K8s简介
k8s是Kubeneters的简称,是近年来流行的容器的调度平台。了解docker的同学都知道,多个容器的应用可以用docker-compose来部署,那为什么还需要k8s呢?
k8s可以看成是集群的操作系统,k8s与容器的就好比同操作系统与进程。那docker与它们是什么关系?docker是容器的运行时(runtime),k8s可以选择不同的容器运行时,比如rkt,这些容器运行时一般都兼容docker镜像。
k8s比docker-compose更强大也更复杂。
比如k8s的基本单元不是container而是pod,一个pod是运行在同一个物理节点上的一组容器的集合。每个pod有一个replication controller组件,负责保证集群里面每时每刻都存在pod在执行,来保证该种服务的高可用状态。
k8s还可以进行以pod为单位的水平弹性扩容,比如一个应用部署分为前端后端两部分,分别部署在Pod A与B上。前后端两个部分的水平扩容需求是不一样的,利用k8s可以轻松进行扩容: (A x 1 , B x 1 ) ----> (A x 1, B x 4)。当然这要求应用本身能够适应水平扩容,k8s只是简化了扩容步骤。
当然k8s也是十分复杂的,看看这个如何安装k8s的教程就知道:利用官方工具kubeadm安装k8s。萌新刚入门,就看到一堆术语: Pod, service, secret, kubelet, kubectl, kubeadm, .... 顿时眼花缭乱,不知东西。
光是安装k8s就有三种途径: kubeadm, minikue, kind,minikue是跑在VM上的,kind ( k8s in docker)就利用了docker,我就选了用kind。
让k8s从本地镜像仓库拉取镜像
这是我最近在搞的事情。k8s需要的镜像要从一个镜像仓库里面拉取,k8s默认连接的是GCR,GCE,由于神秘力量这几个网站都是不可访问的,每创建一个pod,最后都终止于ImagePullBackOff
。
网上有很多解决方法,对于kind这种搭建途径来说没有太大参考意义。后来找到了kind官方的文档: https://kind.sigs.k8s.io/docs/user/local-registry/, 得到解决问题的思路。
基本步骤如下:
- 安装docker
- docker安装registry:2,这个是docker image repo的镜像。
- 网上找个教程把registry跑起来,最后验证是否成功, 比如作者访问在 http://localhost: 5000/v2/,得到一个
{}
, 表明仓库跑起来了。docker ps -a
看看跑起来的仓库容器叫什么名字,比如笔者的叫: myrepo
。
- docker login localhost: 5000, 登录成功。
- 通过docker安装kind,安装好后会有一个kind命令,此时先不要创建cluster。
- 找个地方创建一个文件,文件名叫
conf
。把这些内容复制到里面去:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
containerdConfigPatches:
- |-
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
endpoint = ["http://myrepo:5000"]
这里解释一下,倒数第一行是myrepo容器对外开放的端口;倒数第二行是外部访问的端口。这个按照自己的情况镜像修改。然后创建集群:kind create cluster --name=kind --config=./conf
。
- 接下来利用docker network把两个容器连接,
docker network connect "kind" "myrepo"
- 安装好kubectl,这个是命令行控制程序,利用annotation功能通知每个node更新仓库地址。可以参考下面的shell脚本,或者手动输入:
for node in $(kind get nodes); do
kubectl annotate node "${node}" "kind.x-k8s.io/registry=localhost:5000";
done
接下来你可能要创建一个pod来检查上面的过程是否成功,基本过程如下:
- docker拉取你需要的镜像
- docker tag 来重命名这些镜像,比如
docker tag redis localhost:5000/tsumida/redis:v2
- docker push localhost:5000/tsumida/redis:v2, 把镜像push到本地仓库myrepo上。
- 创建pod :
kubectl run myredis --image=localhost:5000/tsumida/redis:v2
- 等待pod创建成功,可每隔几秒用
kubectl get pods
查看状态,running表示容器跑起来了:
NAME READY STATUS RESTARTS AGE
myredis 1/1 Running 0 72m
k8s只能拉取本地仓库myrepo里面的镜像,所以需要自己为docker拉取下来的镜像修改标签,并且重新push到myrepo什上,不然k8s会拉取失败。