最近学习kubernetes,看书千言,不如一行。还是直接上手把一个项目迁移过去操作一下感觉深刻一点。废话少说,言归正传。
一、环境准备
操作系统版本 mac Mojove 10.14.5。
-
docker-desktop版本2.1.0.3,对应docker ce版本为19.03.2
这里下载最新的 [dockerCE]: https://store.docker.com/search?type=edition&offering=community
注意:请执行以下操作之前,检查之前本机是否有kubernetes环境,如果有不完整的,建议最好清除。请看我的 踩坑记录
二、docker-desktop开启kubernetes
- 为 Docker daemon 配置镜像加速,依次点击docker的小鲸鱼图标,preferences->daemon->registry mirrors下添加中科大的镜像源:
https://docker.mirrors.ustc.edu.cn
从github上获取阿里提供的k8s-for-docker-desktop并安装依赖,可以简化kubernetes的安装。(前半部分的安装文档参考于此)
git clone https://github.com/AliyunContainerService/k8s-for-docker-desktop
cd k8s-for-docker-desktop
./load_images.sh
镜像安装完成之后,开启 Kubernetes,apply,并等待 Kubernetes 开始运行。
TIPS:如果在Kubernetes部署的过程中出现问题,可以通过docker desktop应用日志获得实时日志信息:
pred='process matches ".*(ocker|vpnkit).*"
|| (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")'
/usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred"
踩坑记录:我在这一步卡住了。。勾选enable kubernetes后,右下角的状态一直为: kubernetes is starting.上面的日志信息显示的是:
localhost com.docker.driver.amd64-linux[60050]: (libsystem_info.dylib) [com.apple.network.libinfo:getaddrinfo] nat64_v4_requires_synthesis(127.0.0.1) == false
多方查证后,发现是我本机之前安装了minikube,存在了配置文件信息。清除之后重新执行就好了。
rm -rf ~/.kube rm -rf ~/.minikube rm -rf /usr/local/bin/minikube
这样kubernetes应该就安装好了,我们可以打开dashboard看看。在k8s-for-docker-desktop目录下执行:
kubectl create -f kubernetes-dashboard.yaml
开启 API Server 访问代理
kubectl proxy
好了,可以访问dashboard了
这里会要求你输入配置文件或者token。我这里用的token。先得生成一下~~
kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}'
复制结果粘贴上去,点击登录,就可以看到页面了~~
另外一种是指定config文件:
TOKEN=$(kubectl -n kube-system describe secret default| awk '$1=="token:"{print $2}')
kubectl config set-credentials docker-for-desktop --token="${TOKEN}"
然后页面上选择配置文件路径: ~/.kube/config就可以了。
安装到此结束。下面进入迁移过程。
三、制作springboot服务镜像
这里只做示范,所以新建了一个最简单的工程, 名为kubedemo。就一个controller
@RestController
public class Hello {
@GetMapping(value = "/hello")
public String hello() {
return "hello world";
}
}
- 接下来打包, 然后新建一个Dockerfile:
mvn clean install -Dmaven.test.skip=true
mkdir docker
cp target/kubedemo-0.0.1-SNAPSHOT.jar ./docker
cp src/main/resources/application.properties ./docker
cd docker
touch Dockerfile
Dockerfile 内容如下:
FROM anapsix/alpine-java
COPY . /
CMD java -Xmx1024m -Xms128m -jar kubedemo-0.0.1-SNAPSHOT.jar
- 然后创建docker image
docker image build -t skycsky/kubedemo .
# 查看镜像
docker images
执行以下语句启动,浏览器打开http://localhost:8080/hello试试,返回 “hello world”,正常~~
docker run -p 8080:8080 -it skycsky/kubedemo
- 接下来把镜像推到仓库,我这里直接推到hub.docker.com,自己的项目的话最好用私有仓库。
docker image push skycsky/kubedemo
四、部署到kubernetes
有关kubernetes的相关概念,这里就不展开了,我们简单粗暴的直接把流程走通先~
1.新建一个kubernetes的部署配置文件,我这里取名叫deploy.yaml 内容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubedemo-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: kubedemo
spec:
containers:
- name: kubedemo
image: skycsky/kubedemo
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: kubedemo-service
spec:
selector:
app: kubedemo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
- 正式发布,过程相当简单。
kubectl apply -f ./deploy.yaml
显示结果:
deployment.extensions/kubedemo-deployment created
service/kubedemo-service created
现在可以去dashboard上检查状态了,到处点点看看吧~·
一切顺利的话,应该状态都是正常的,然后容器日志应该已经显示服务正常启动了。
那么接下来是一个灵魂拷问~整了这么多,我怎么访问这服务?原来localhost:8080的地址访问不了了啊!
大兄弟,你很有潜力哇,都会抢答了~~
3.端口转发
就跟docker一样,服务跑在容器内,端口是需要跟本机端口做个映射的,让我们来操作一下~
先获得已经部署的容器:
kubectl get pods
显示如下:
➜ kubedemo kubectl get pods
NAME READY STATUS RESTARTS AGE
kubedemo-deployment-7bc687c89-nhm9h 1/1 Running 0 15m
然后执行端口转发:
kubectl port-forward kubedemo-deployment-7bc687c89-nhm9h 8080:8080
看到下面的显示就说明成功了:
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
好了,现在端口转发成功,我们可以再试试访问http://localhost:8080 ,又可以看到熟悉的 hello world 了~
写在最后
到此,最简单的将springboot服务部署到kubernetes的步骤就写完了,我知道,你一定在嘀咕,整了半天,你这跟docker上跑有什么区别?绕个弯放到kubernetes上好玩呢?
嗯.....你说得好像有道理,我竟无法反驳。于是我决定再看看书,研究出下一篇文章来回答。
to be continued...