一、前言
本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是:
- 部署SpringBoot项目到阿里云服务器 ;
- 基于容器打包,推送私有镜像仓库 ;
- 采用K8S集群部署,对外暴露服务,pod副本扩容,公网可以访问 ;
二、完整的部署过程
- 基于阿里云服务器搭建基础运行环境,主要包括:JDK1.8,maven3.6.1;
- 本地代码上传阿里云服务器,通过maven打包,使用docker构建镜像 ;
- 推送构建好的镜像到阿里云私有镜像仓库 ;
- K8S集群部署服务,并对外暴露服务可以访问;
三、阿里云服务器安装jdk与maven
本篇的部署业务流程相对比较简单,只需所使用的服务器安装了docker,jdk以及maven即可;
前置准备
提前下载jdk与maven并上传至服务器目录
安装jdk
解压并重命名
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
安装maven
安装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
四、本地准备一个springboot工程
本地使用idea创建一个maven工程,完整的结构如下:
1、添加 pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>boot-k8s</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
2、添加一个测试接口类
import java.util.HashMap;
import java.util.Map;
@RestController
public class WebController {
@GetMapping("/api/v1/get")
public Map<String,Object> getInfo(){
Map<String,Object> resMap = new HashMap<>();
resMap.put("info","k8s");
return resMap;
}
}
3、创建一个用于服务器构建镜像的Dockerfile文件
FROM openjdk:8
ADD target/boot-k8s.jar boot-k8s.jar
ENTRYPOINT ["java","-jar","/boot-k8s.jar"]
4、将完整的工程代码上传到服务器目录
五、构建镜像
在上面的工程目录下就可以使用相关的命令进行镜像的构建了;
1、项目打包
mvn clean install
第一次打包可能时间有点久,需要下载较多的依赖包,需要耐心等待一会;
2、构建镜像
在当前的Dockerfile所在目录下执行如下命令进行构建
docker build -t boot-k8s:1.0 .
查看镜像,可以看到镜像已经可以看到了;
3、使用该镜像运行容器
docker run -d -it -p 8081:8081 --name=k8s-demo boot-k8s:1.0
通过docker ps命令查看启动的容器
通过浏览器进行访问:http://公网IP:8081/api/v1/get ,能够看到如下的内容,说明该镜像制作完成;
六、镜像推送
镜像制作好之后,接下来需要将镜像推送传到一个镜像仓库,这样k8s才能拉到镜像并使用,
镜像仓库通常可分为公共镜像仓库和私有镜像仓库;
1、公共镜像仓库
- 官方:Docker,基于各软件开发或者有软件提供商开发的 ;
- 非官方:其他组织或者公司开发的镜像,供大家免费试用 ;
2、私有镜像仓库
用于存放公司私有的镜像,不对外提供;
常用的私有镜像仓库
Harbor
由VMWare公司开源的容器镜像仓库,Habor是在Docker Registry上进行了相应的企业级扩展
Registry
由docker官方提供的私有镜像仓库
还有一些云厂商提供的私有仓库,比如:阿里云、腾讯云等;
3、阿里云私有镜像仓库配置
接下来我们演示如何使用阿里云镜像仓库完成后续的整个镜像的推送,以及到k8s部署的过程;
开通并配置阿里云镜像仓库
访问地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,选择个人实例;
设置镜像仓库登录的密码
此时,镜像仓库为空的;
创建命名空间
个人账户可以最多创建3个命名空间,这个命名空间的概念在很多地方都有,可以类比理解;
基于命名空间创建镜像仓库
创建成功后,如上图展示,就可以按照上面的操作步骤往这个镜像仓库推送镜像了;
4、镜像推送至阿里云镜像仓库
登录镜像仓库
docker login --username=你的账号 registry.cn-hangzhou.aliyuncs.com
镜像打tag
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
push镜像
这个过程耗时可能有点长,需要耐心等待;
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来部署应用;
完整的操作步骤
- 登录私有镜像仓,拉取镜像 ;
- 创建deployment ;
- 暴露服务访问端口;
- 外网访问服务接口;
前置准备
在使用k8s部署应用时,其实也是在模拟从登录镜像仓库,拉取镜像,然后启动的完整的过程,所以这里首先需要解决登录的问题;
在之前的文章中,我们降到了在k8s中有一种存储类型叫做secret,正好就可以使用这个;
创建secret
kubectl create secret docker-registry congge-docker-secret --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=zhangcongyi420 --docker-password=你的登录密码
创建k8s-demo-deployment 的yaml文件
使用下面的命令生成一个模板配置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也配置进去,就是补充下面这地方;
创建deployment
kubectl apply -f congge-k8s.yaml
创建NodePort类型的service
kubectl expose deploy k8s-demo --port=8081 --target-port=8081 --type=NodePort
通过service将端口暴露出去之后,我们就可以通过外网访问API接口了,如果是阿里云服务器,请开发网络安全组端口,看到如下效果,说明就成功了;