【云原生 Kubernetes】k8s集群部署springboot项目

一、前言

本篇,我们将基于k8s集群,模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是:

  • 部署SpringBoot项目到阿里云服务器 ;
  • 基于容器打包,推送私有镜像仓库 ;
  • 采用K8S集群部署,对外暴露服务,pod副本扩容,公网可以访问 ;

二、完整的部署过程

  • 基于阿里云服务器搭建基础运行环境,主要包括:JDK1.8,maven3.6.1;
  • 本地代码上传阿里云服务器,通过maven打包,使用docker构建镜像 ;
  • 推送构建好的镜像到阿里云私有镜像仓库 ;
  • K8S集群部署服务,并对外暴露服务可以访问;

三、阿里云服务器安装jdk与maven

本篇的部署业务流程相对比较简单,只需所使用的服务器安装了docker,jdk以及maven即可;

前置准备

提前下载jdk与maven并上传至服务器目录

【云原生 Kubernetes】k8s集群部署springboot项目_第1张图片

安装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

【云原生 Kubernetes】k8s集群部署springboot项目_第2张图片

四、本地准备一个springboot工程

本地使用idea创建一个maven工程,完整的结构如下:

【云原生 Kubernetes】k8s集群部署springboot项目_第3张图片

1、添加 pom依赖

     
        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
            
        
    

2、添加一个测试接口类

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;
    }

}

3、创建一个用于服务器构建镜像的Dockerfile文件

FROM openjdk:8

ADD target/boot-k8s.jar boot-k8s.jar

ENTRYPOINT ["java","-jar","/boot-k8s.jar"]

4、将完整的工程代码上传到服务器目录

【云原生 Kubernetes】k8s集群部署springboot项目_第4张图片

五、构建镜像

在上面的工程目录下就可以使用相关的命令进行镜像的构建了;

1、项目打包

mvn clean install

第一次打包可能时间有点久,需要下载较多的依赖包,需要耐心等待一会;

【云原生 Kubernetes】k8s集群部署springboot项目_第5张图片

2、构建镜像

在当前的Dockerfile所在目录下执行如下命令进行构建

docker build -t boot-k8s:1.0 .

【云原生 Kubernetes】k8s集群部署springboot项目_第6张图片

查看镜像,可以看到镜像已经可以看到了;

3、使用该镜像运行容器

docker run -d -it -p 8081:8081 --name=k8s-demo boot-k8s:1.0

通过docker ps命令查看启动的容器

【云原生 Kubernetes】k8s集群部署springboot项目_第7张图片

通过浏览器进行访问:http://公网IP:8081/api/v1/get ,能够看到如下的内容,说明该镜像制作完成;

【云原生 Kubernetes】k8s集群部署springboot项目_第8张图片

六、镜像推送

镜像制作好之后,接下来需要将镜像推送传到一个镜像仓库,这样k8s才能拉到镜像并使用,

镜像仓库通常可分为公共镜像仓库和私有镜像仓库;

1、公共镜像仓库

  • 官方:Docker,基于各软件开发或者有软件提供商开发的 ;
  • 非官方:其他组织或者公司开发的镜像,供大家免费试用 ;

2、私有镜像仓库

用于存放公司私有的镜像,不对外提供;

常用的私有镜像仓库

Harbor

由VMWare公司开源的容器镜像仓库,Habor是在Docker Registry上进行了相应的企业级扩展

Registry

由docker官方提供的私有镜像仓库

还有一些云厂商提供的私有仓库,比如:阿里云、腾讯云等;

3、阿里云私有镜像仓库配置

接下来我们演示如何使用阿里云镜像仓库完成后续的整个镜像的推送,以及到k8s部署的过程;

开通并配置阿里云镜像仓库

访问地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,选择个人实例;

【云原生 Kubernetes】k8s集群部署springboot项目_第9张图片

设置镜像仓库登录的密码

【云原生 Kubernetes】k8s集群部署springboot项目_第10张图片

 此时,镜像仓库为空的;

【云原生 Kubernetes】k8s集群部署springboot项目_第11张图片

创建命名空间

个人账户可以最多创建3个命名空间,这个命名空间的概念在很多地方都有,可以类比理解;

【云原生 Kubernetes】k8s集群部署springboot项目_第12张图片

基于命名空间创建镜像仓库

【云原生 Kubernetes】k8s集群部署springboot项目_第13张图片

 【云原生 Kubernetes】k8s集群部署springboot项目_第14张图片

【云原生 Kubernetes】k8s集群部署springboot项目_第15张图片

创建成功后,如上图展示,就可以按照上面的操作步骤往这个镜像仓库推送镜像了;

 4、镜像推送至阿里云镜像仓库

登录镜像仓库

docker login --username=你的账号 registry.cn-hangzhou.aliyuncs.com

【云原生 Kubernetes】k8s集群部署springboot项目_第16张图片

镜像打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

【云原生 Kubernetes】k8s集群部署springboot项目_第17张图片

推送完毕之后,在控制台的镜像仓库就能看到刚刚推送上来的镜像了;

【云原生 Kubernetes】k8s集群部署springboot项目_第18张图片

七、使用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也配置进去,就是补充下面这地方;

【云原生 Kubernetes】k8s集群部署springboot项目_第19张图片

创建deployment

kubectl apply -f congge-k8s.yaml

【云原生 Kubernetes】k8s集群部署springboot项目_第20张图片

 创建NodePort类型的service

kubectl expose deploy k8s-demo --port=8081 --target-port=8081 --type=NodePort

【云原生 Kubernetes】k8s集群部署springboot项目_第21张图片

 通过service将端口暴露出去之后,我们就可以通过外网访问API接口了,如果是阿里云服务器,请开发网络安全组端口,看到如下效果,说明就成功了;

【云原生 Kubernetes】k8s集群部署springboot项目_第22张图片

你可能感兴趣的:(架构技术栈,技术总结,k8s,k8s集群部署java应用,k8s部署springboot,k8s部署java应用,k8s部署微服务项目,k8s部署微服务)