一、开始前叨叨

        本文作为超高校级的基础教程,适合那些刚开始了解学习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页面

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的仓库公开改成私有或者关闭。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐