云原生 Kubernetesk8s集群部署springboot项目

Posted 小码农叔叔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生 Kubernetesk8s集群部署springboot项目相关的知识,希望对你有一定的参考价值。

一、前言

本篇,我们将基于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接口了,如果是阿里云服务器,请开发网络安全组端口,看到如下效果,说明就成功了;

以上是关于云原生 Kubernetesk8s集群部署springboot项目的主要内容,如果未能解决你的问题,请参考以下文章

Linux企业运维——Kubernetesk8s集群安装部署

云原生kubernetesk8s数据存储之Volume使用详解

kubernetesk8s简介及其集群安装部署

云原生kubernetesk8s中pod使用详解

#云原生征文#Kubernetes集群部署

云原生Swarm解决docker server的集群化管理和部署