30分钟无痛上云--springboot项目部署到kubernetes

封面图.jpg

最近学习kubernetes,看书千言,不如一行。还是直接上手把一个项目迁移过去操作一下感觉深刻一点。废话少说,言归正传。

一、环境准备

  1. 操作系统版本 mac Mojove 10.14.5。

  2. docker-desktop版本2.1.0.3,对应docker ce版本为19.03.2

    这里下载最新的 [dockerCE]: https://store.docker.com/search?type=edition&offering=community

  3. 注意:请执行以下操作之前,检查之前本机是否有kubernetes环境,如果有不完整的,建议最好清除。请看我的 踩坑记录

二、docker-desktop开启kubernetes

  1. 为 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 开始运行。

image-20190926100523288.png

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了

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

这里会要求你输入配置文件或者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";
    }
}
  1. 接下来打包, 然后新建一个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
  1. 然后创建docker image
docker image build -t skycsky/kubedemo .
# 查看镜像
docker images

执行以下语句启动,浏览器打开http://localhost:8080/hello试试,返回 “hello world”,正常~~

docker run -p 8080:8080 -it skycsky/kubedemo
  1. 接下来把镜像推到仓库,我这里直接推到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            
  1. 正式发布,过程相当简单。
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...

你可能感兴趣的:(30分钟无痛上云--springboot项目部署到kubernetes)