0%

学习Kubernetes

学习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
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: Pod
metadata:
name: flasktest
spec:
containers:
- image: testflask
name: flasktest-container
imagePullPolicy: IfNotPresent # 拉取的策略
ports:
- containerPort: 5000 # 容器的端口
protocol: TCP

通过配置文件来创建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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: v1
kind: ReplicationController
metadata:
name: flasktest
spec:
replicas: 3
selector:
app: flasktest
template:
metadata:
labels:
app: flasktest
spec:
containers:
- image: testflask
name: flasktest-container
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
protocol: TCP

重新创建,再启动服务,服务时启动了,不过还是有问题,使用minikube没有外部的ip的访问,需要使用如下命令。不过这个端口是随机的,跟原来用docker的那个不太一样。

1
minikube service flasktest-http

总结

网络的问题使本来简单的入门变得复杂,另外k8s的资料目前确实不是很多,一些细节网上的很少有人总结出来。不过感觉方案虽好,但是镜像大,以及可能要自己部署私有的镜像,再到其他的,其实投入还是蛮多的。