本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是:
本篇的部署业务流程相对比较简单,只需所使用的服务器安装了docker,jdk以及maven即可;
提前下载jdk与maven并上传至服务器目录
解压并重命名
tar -zxvf jdk-8u181-linux-x64.tar.gz
mv jdk-8u181-linux-x64 jdk8
配置环境变量,拷贝下面的内容到配置文件中
vi /etc/profile
JAVA_HOME=/usr/local/soft/jdk8
CLASSPATH=$JAVA_HOME/lib/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME CLASSPATH
使环境变量立刻生效
source /etc/profile
安装unzip命令
yum install unzip -y
解压maven包并重命名
unzip apache-maven-3.6.1-bin.zip
mv apache-maven-3.6.1 mvn361
配置环境变量,拷贝下面的内容到配置文件中
MAVEN_HOME=/usr/local/soft/mvn361
PATH=$PATH:$MAVEN_HOME/bin
export PATH JAVA_HOME CLASSPATH MAVEN_HOME
使环境变量立刻生效
source /etc/profile
本地使用idea创建一个maven工程,完整的结构如下:
org.springframework.boot
spring-boot-starter-parent
2.5.5
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
boot-k8s
org.springframework.boot
spring-boot-maven-plugin
import java.util.HashMap;
import java.util.Map;
@RestController
public class WebController {
@GetMapping("/api/v1/get")
public Map getInfo(){
Map resMap = new HashMap<>();
resMap.put("info","k8s");
return resMap;
}
}
FROM openjdk:8
ADD target/boot-k8s.jar boot-k8s.jar
ENTRYPOINT ["java","-jar","/boot-k8s.jar"]
在上面的工程目录下就可以使用相关的命令进行镜像的构建了;
mvn clean install
第一次打包可能时间有点久,需要下载较多的依赖包,需要耐心等待一会;
在当前的Dockerfile所在目录下执行如下命令进行构建
docker build -t boot-k8s:1.0 .
查看镜像,可以看到镜像已经可以看到了;
docker run -d -it -p 8081:8081 --name=k8s-demo boot-k8s:1.0
通过docker ps命令查看启动的容器
通过浏览器进行访问:http://公网IP:8081/api/v1/get ,能够看到如下的内容,说明该镜像制作完成;
镜像制作好之后,接下来需要将镜像推送传到一个镜像仓库,这样k8s才能拉到镜像并使用,
镜像仓库通常可分为公共镜像仓库和私有镜像仓库;
用于存放公司私有的镜像,不对外提供;
由VMWare公司开源的容器镜像仓库,Habor是在Docker Registry上进行了相应的企业级扩展
由docker官方提供的私有镜像仓库
还有一些云厂商提供的私有仓库,比如:阿里云、腾讯云等;
接下来我们演示如何使用阿里云镜像仓库完成后续的整个镜像的推送,以及到k8s部署的过程;
访问地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,选择个人实例;
此时,镜像仓库为空的;
个人账户可以最多创建3个命名空间,这个命名空间的概念在很多地方都有,可以类比理解;
创建成功后,如上图展示,就可以按照上面的操作步骤往这个镜像仓库推送镜像了;
docker login --username=你的账号 registry.cn-hangzhou.aliyuncs.com
ImageId就是上面对项目jar包构建镜像后的那个
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:[镜像版本号]
docker tag 8c7f232ab5f4 registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0
这个过程耗时可能有点长,需要耐心等待;
docker push registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0
推送完毕之后,在控制台的镜像仓库就能看到刚刚推送上来的镜像了;
上面所在的一切工作可以说是一个准备过程,接下来进入到最后一个环节,使用k8s来部署应用;
完整的操作步骤
在使用k8s部署应用时,其实也是在模拟从登录镜像仓库,拉取镜像,然后启动的完整的过程,所以这里首先需要解决登录的问题;
在之前的文章中,我们降到了在k8s中有一种存储类型叫做secret,正好就可以使用这个;
kubectl create secret docker-registry congge-docker-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=zhangcongyi420 --docker-password=你的登录密码
使用下面的命令生成一个模板配置yaml文件
kubectl create deployment k8s-demo --image=registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0 --dry-run=client -o yaml > congge-k8s.yaml
生成后的yaml文件内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: k8s-demo
name: k8s-demo
spec:
replicas: 1
selector:
matchLabels:
app: k8s-demo
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: k8s-demo
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/boot-k8s/k8s-demo:1.0
name: k8s-demo
resources: {}
status: {}
修改此yaml文件,将上面创建的secret也配置进去,就是补充下面这地方;
kubectl apply -f congge-k8s.yaml
kubectl expose deploy k8s-demo --port=8081 --target-port=8081 --type=NodePort
通过service将端口暴露出去之后,我们就可以通过外网访问API接口了,如果是阿里云服务器,请开发网络安全组端口,看到如下效果,说明就成功了;