保姆级手把手SpringBoot开发与ACK部署
本文作为超高校级的基础教程,适合那些刚开始了解学习SpringBoot和k8s的同学(比如自己)。虽然现有的资料很多,但是节省了收集资料(和踩坑)的时间,也算是一种高效学习。这篇文章,手把手说明一个简单的SpringBoot项目是如何建立起来,再如何通过ACK部署上线。ps.本文涉及云产品:容器服务ACK、容器镜像ACR、云数据库RDS、云效Appstack(一个教程掌握四种产品何乐而不为)
一、开始前叨叨
本文作为超高校级的基础教程,适合那些刚开始了解学习SpringBoot和k8s的同学(比如自己)。虽然现有的资料很多,但是节省了收集资料(和踩坑)的时间,也算是一种高效学习。这篇文章,手把手说明一个简单的SpringBoot项目是如何建立起来,再如何通过ACK部署上线。
ps.本文涉及云产品:容器服务ACK、容器镜像ACR、云数据库RDS、云效Appstack(一个教程掌握四种产品何乐而不为)
二、数据库准备
1.RDS购买与设置
(1)买个最小规格最便宜的就行了,创建成功显示在页面上。
(2)新建数据库账号,设置高权限账号,记住username和passwod。
(3)新建外网连接后,打开白名单设置。
(4)设置白名单0.0.0.0/0,对公网开放,出于安全考虑建议实验结束后关闭。
2. 本地连接数据库
$ mysql -h {.RDS外网地址} -u{.username} -p
3.创建数据库“test”
mysql> CREATE DATABASE IF NOT EXISTS test DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
4. 数据库权限授予
赋予用户"test"数据库的完整权限,可读取可写入。
mysql> GRANT ALL PRIVILEGES ON test.* to '{ .username}'@'%' with grant option;
5. 创建数据表
创建数据表"country"表待用;
mysql> create table country (id bigint not null auto_increment, countrycode varchar(255), countryname varchar(255), primary key (id)) engine=InnoDB;
三、*SpringBoot项目搭建
有 Sprinboot基础的朋友本章可以跳过,项目地址 一个简单的SpringbootDemo 。本项目实现了在代码向远程数据库写入数据,再在前端页面展示数据(前后端都涉及了,麻雀虽小五脏俱全)。
-
开发环境:JDK 1.8及以上、Maven 3.6.3及以上、Git
1. 拉取代码
$ git clone https://github.com/f5556666/xinfeitest.git
2. 添加依赖
3. 工程编译
点击界面右边的maven窗口,双击“compile”;
出现了“BUILD SUCCESS”表示编译成功。
4. 修改数据库
修改src/main/resources/application.properties文件的2-4行
spring.datasource.url=jdbc:mysql://{ .数据库的外网地址}/test?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username={ .数据库username}
spring.datasource.password={ .数据库password}
5. 执行单元测试
src/test/java/com.example.springbootdemo/SpringBootApplicationTests代码,通过这个测试来验证怎么样通过实体对象实现对数据库的存取操作。
-
在country表中插入一条记录。
-
通过查询返回一个国家代码列表。
@BeforeEach
public void createCountry(){
Country country=new Country();
country.setCountrycode("86");
country.setCountryname("China");
countryRepository.save(country);
assert country.getId()>0 : "create error";
}
@Test
public void getData() {
List<Country> countries=countryRepository.findAll();
assert countries!=null:"getdata is null";
for (Country countryi:countries){
logger.info("=== country name ={}",countryi.getCountryname());
}
测试执行完成后,控制台可以看到“==== country name= China”。
6. 项目运行
src/main/java/com.example.springbootdemo/SpringBootApplication.java文件点击执行,只要运行程序后在本地浏览器输入http://localhost:8080/welcome后可以展示数据库的内容就可以了。
四、镜像构建
1. 打包
项目在本地执行成功后,用maven打包,先clean后再package。成功后会在项目新增文件target/Spring-boot-demo-0.0.1-SNAPSHOT.jar
2. Makefile文件编写(项目已有不用改)
FROM java:8
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} Spring-boot-demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-jar","/Spring-boot-demo-0.0.1-SNAPSHOT.jar"]
3. 代码上传git
$ git init
$ git add .
$ git commit -m “update”
$ git remote add origin {.你的git地址}
$ git add .
$ git commit -m “update”
$ git push -u origin master
4. 登陆阿里云ACR控制台
(1)创建镜像仓库
创建实例选择个人实例,企业版实例也可以,操作可能有细微不同。
(2)创建镜像仓库,个人账号可以选公开,可以部署时不用配置secret。(注:为了数据安全,实验完成后记得删除)
(3)代码源选择
选择github里代码的命名空间和仓库。
(4)创建成功后选择刚新建的镜像仓库,选择构建,再添加规则。
(5)新建完成后点击新建构建,一段时间后会在下面出现构建状态。
(6)返回基本信息,这一串就是部署所需要填写的镜像image了。
五、ACK部署
1.登陆ACK控制台
2. 创建deployment
$ vim deploymnet.yaml
#以下是内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
namespace: xinfeitest #你的k8s集群里的命名空间
labels:
app: myapp
spec:
replicas: 2
selector:
matchLabels:
name: myapp
template:
metadata:
labels:
name: myapp
namespace: xinfeitest
spec:
containers:
- name: myapp
image: registry.cn-hangzhou.aliyuncs.com/xinfeitesthe/springdemo:latest #刚刚记录的image
ports:
- containerPort: 8080
#保存后执行
$ kubectl create -f depolyment.yaml
#查看创建结果
$ kubectl get pod -n {$namespace} #替换掉你的namespce
如果出现以下结果,说明pod资源创建成功。
3. 创建service
-
主要用来实现应用程序对外提供服务的机制。
$ vim service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-service
namespace: xinfeitest
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
type: NodePort
selector:
name: myapp
#保存后执行
$ kubectl create -f service.yaml
#查看创建结果
$ kubectl get service -n {$namespace} #替换掉你的namespce
4. 创建ingress
-
Service 工作在 TCP/IP 层,而 Ingress 将不同的 URL 访问请求转发到后端不同的 Service ,实现 HTTP 层的业务路由机制。
$ vim ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: example-ingress namespace: xinfeitest spec: rules: - http: paths: - path: /welcome backend: serviceName: myapp-service servicePort: 8080 #保存后执行 $ kubectl create -f ingress.yaml #查看创建结果 $ kubectl get ingress -n {$namespace} #替换掉你的namespce
如果出现以下结果,说明ingress资源创建成功。记住ADDRESS。
5. 检验成果
打开网页,输入:http://{$ADDRESS}/welcome ,大功告成。
六、Appstack—应用部署平台
公司的研发模式打算套上CI/CD。在阿里云官网看了看Devops相关的产品是云效,其中Appstack是主打k8s应用部署,上手试用一下。
1. 访问Appstack页面
2. 新建服务连接
目的是赋予appstack访问ACK集群的权限。
3. 导入资源池
目的是将ACK托管到Appstack。操作是返回主界面,选择资源池。
此时,如果你的阿里云账号名下有ACK集群的话,在这里就能看到。如果是rancher或者其他的,可以选择通用K8s导入kubeconfig。如果没有K8s资源可以选择“8小时免费体验集群”进行创建。
4. 集群状态确认
如果agent是运行中状态,就可以进行下一步,如果安装失败的话可以提交工单。5. 创建应用
返回主页面,新建应用。
点击进入应用-设置-编排配置-k8s部署,选择他们的空模板。
6. 创建编排
此时点击添加组件,一次性添加上deployment、service、ingress。
最后把每个yaml具体的内容改成上一节的。把不需要的占位符都删掉,填写完成后点击保存
保存完成后点击应用-环境页面,新建一个环境。
7. 部署环境
点击立即部署;
新建部署单页面,按下图填写,分批部署,当部署完1批的时候会自动暂停,给用户考虑和检查的时间。
分批部署暂停中,点击“继续”会再次执行;说实话这个部署过程可观测页面做得不错。
部署成功后,返回环境详情;
发现一系列部署组件有deployment、service、ingress,点击网络,路由规则;
Ingress 控制器将提供实现特定的负载均衡器来满足 Ingress, 只要 Service 存在。 正常情况下(不巧,此时我的集群负载均衡过期未续费),会在框的位置看到Address, Address 字段代表负载均衡器的地址。
最后,打开网页,输入:http://{$ADDRESS}/welcome ,也是和第五节一样的结果。
七、结尾
记得把RDS的白名单对所有公网开放关闭。
记得把ACR的仓库公开改成私有或者关闭。
更多推荐
所有评论(0)