1、必要条件
-
k8s环境。
-
Docker Harbor私有仓库,用于将打包的docker镜像推送到仓库。准备完成后在需要使用仓库的机器docker login。
-
开发机器需要Docker环境,build及push使用。
2、构建SpringBoot项目
pom文件中添加maven插件,以便打包过程中暴露主程序。
进行maven package:
将得到的jar包传输到服务器上。
3、构建镜像
-
Dockerfile文件
FROM openjdk:11.0.12
MAINTAINER wyh
ADD SpringBootForK8s-1.0-SNAPSHOT.jar app.jar
EXPOSE 8001
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]
Dockerfile与jar包放在同一路径下:
-
构建镜像
docker build -f Dockerfile -t springboot-k8s-jar .
-t表示新构建镜像的名称,最后的.表示当前目录。
构建完成后,docker images即可查看。
4、推送到harbor仓库并推送镜像
1)安装docker-compose
-
下载二进制文件
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
-
设置compose权限
chmod +x /usr/local/bin/docker-compose
-
验证安装是否成功
docker-compose --version
2)安装harbor
-
下载harbor
-
解压安装
tar -xvf harbor-online-installer-v2.4.1.tgz -C /usr/local
#进入harbor文件夹
cd harbor
-
配置IP端口
更改harbor.yml.tmpl
文件,配置IP以及端口。IP配置为本机IP,端口改成5000(避免80端口被其他程序占用)。
将harbor.yml.tmpl复制为harbor.yml:
cp harbor.yml.tmpl harbor.yml
-
修改/etc/docker/daemon.json文件
vi /etc/docker/daemon.json
在daemon.json文件中写入:
{
"registry-mirrors": ["https://nzhix59d.mirror.aliyuncs.com"],
"insecure-registries": ["ip:port"]
}
指定insecure-registries
信任的ip,IP为harbor仓库所在服务器的公网IP。
重启docker:
systemctl restart docker.service
-
启动harbor
#安装并生成dockerfile
./install.sh
编辑harbor.yml,将其中https的配置注释掉:
./prepare
#启动harbor
sudo docker-compose up -d
-
网站上打开并创建仓库
IP:5000 打开网站登录
Harbor默认用户名:admin
Harbor默认密码:xxx
-
新建仓库
3)push镜像到仓库
-
docker login
docker login ip:port #harbor仓库所在服务器的公有IP
输入用户名与密码即可显示登录成功。
-
更改镜像的标签
docker tag springboot-k8s-jar ip:port/xxx/springboot-k8s-jar:latest #ip为harbor服务器的公网IPport为harbor对外暴露的端口。
-
推送镜像到仓库
docker push ip:port/xxx/springboot-k8s-jar:latest
5、k8s部署
1)创建deploy.yaml文件
apiVersion: apps/v1
kind: Deployment #指定资源类别
metadata: #资源的一些元数据
name: springboot-k8s-deployment #deployment的名称
labels:
app: springboot-k8s-deployment #标签
spec:
replicas: 2 #创建Pod的个数
selector:
matchLabels:
app: springboot-k8s-deployment
template:
metadata:
labels:
app: springboot-k8s-deployment
spec:
containers:
- name: springboot-k8s-jar
image: ip:port/xxx/springboot-k8s-jar:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8001
2)创建service.yaml文件
apiVersion: v1
kind: Service
metadata:
name: springboot-k8s-service
labels:
app: springboot-k8s-service
spec:
type: NodePort
ports:
- port: 8001 #Pod对外暴露的端口
nodePort: 30001 #对外暴露的Node端口
selector:
app: springboot-k8s-deployment
3)运行kubectl create -f deploy.yaml创建Deployment
可以先在node节点上执行:docker pull 39.107.224.148:5000/wuyuehong/springboot-k8s-jar:latest
,将镜像拉取下来,这样k8s创建的Pod的就不需要去仓库中拉取镜像了(因为设置了imagePullPolicy: IfNotPresent),加快启动速度。
完成后执行kubectl get pods
,可以看到启动了两个Pod。
4)运行kubectl create -f service.yaml创建Service
可以看到,Service监控了两个Pod。
5)运行kubectl logs -f podsname查看日志
kubectl logs -f springboot-k8s-deployment-566f99bb79-jsxv6