学习Docker后,发现还是得学习下k8s,目前使用Spring Cloud,引入k8s后原来现有的架构确实会有些变化,比如k8s的服务与Spring Eureka实际上有些功能相似的地方。最早我打算使用微服务的时候也是看中可以使用其他语言,但实际上使用了Eureka后,发现用其他语言还是有困难的,Java依旧是服务的首选。引入k8s后这似乎成为了一些可能,不过目前还没有使用来着。
书籍
关于k8s的书籍目前只买了《Kubernetes实战》,之前也是选了几本,但这本当时一看就觉得干货很多,不过在解决细节问题时还是依赖网路了,不过这次可能错了,关于k8s的资料网上的还是太少,解决细节的问题最后还是依靠这本书。这本书在理论和细节方面结合的很好。
使用本地镜像
我用的minikube
,本地构建的doker镜像,我并没有推送到docker的镜像服务器,打出的docker镜像,其实还是蛮大的,Python和Flask,只是个简单的Hello World的例子,有800多M。再将这个推送到docker镜像服务器太慢了,实际我根本就没有成功,但拉取镜像速度还不错。
一开始我使用kubectrl run
创建Pods。
1 | kubectrl run testflask --image=testflask --port=5000 --generator=run/v1 |
上面这种方式还是有局限,网上说要把imagePullPolicy
设置成IfNotPresent
或者Never
。但是怎么设置?网上的博文根本不说,最后还是从《Kubernetes实战》这书找到答案,使用配置文件来创建,创建一个flasktest.yaml
的配置文件。这里需要注意的是配置文件中一定要使用空格缩进而不是Tab,貌似我用的vs code和textmate都是使用Tab缩进。
1 | apiVersion: v1 |
通过配置文件来创建pods
1 | kubectl create -f flasktest.yaml # 通过配置文件创建pods |
最后发现还是有问题,这个镜像始终还是无法拉下来,网上搜索半天也没有找到个解决方案,最后打算直接使用docker
的公共镜像docker/getting-started
,估计是网络的问题,始终没有拉取下来。我一直把minikube
的当成本地的了,docker
也是共用一个,实际上犯了个严重的认知错误,minikube
在VirtualBox创建了一个minikube
虚拟机在运行,docker
肯定与我本地的不是一个,《Kubernetes实战》书中提供了一种把本地的docker复制到minikube
虚拟机中docker
镜像库的方法。
1 | docker save testflask | (eval $(minikube docker-env) && docker load) |
可以使用minikube ssh
登录到minikube
虚拟机中,查看docker
镜像是否已经复制过去了。最后顺利启动了,不过怎么访问服务呢?
1 | kubectl expose rc flasktest --type=LoadBalancer --name flasktest-http |
不过这里也个问题,提示replicationcontrollers "flasktest" not found
。其实命令kubectrl run testflask --image=testflask --port=5000 --generator=run/v1
中,--generator=run/v1
是创建replicationcontroller
的,但我使用的是配置文件创建,问题不大,修改下配置文件。如下:
1 | apiVersion: v1 |
重新创建,再启动服务,服务时启动了,不过还是有问题,使用minikube
没有外部的ip的访问,需要使用如下命令。不过这个端口是随机的,跟原来用docker的那个不太一样。
1 | minikube service flasktest-http |
总结
网络的问题使本来简单的入门变得复杂,另外k8s的资料目前确实不是很多,一些细节网上的很少有人总结出来。不过感觉方案虽好,但是镜像大,以及可能要自己部署私有的镜像,再到其他的,其实投入还是蛮多的。