Java、K8s、Docker:三兄弟如何踏上自动化征程?

1,673 阅读5分钟

大家好,今天我们来聊聊如何用Java开发一个简单的Web应用,并将其通过Docker容器化,最后部署到Kubernetes集群中。

首先,我们来简单介绍一下Docker和Kubernetes。

一 、 概念

Docker

Docker 相信这个大家并陌生, Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。Docker让程序环境独立或复制对于开发、运维人员来说非常的友好。

Kubernetes

Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。Kubernetes可以帮助你管理多个容器,确保它们在集群中的高可用性和负载均衡。

第二、部署

简介绍下Kubernetes部署,以下是部署 k8s 的一些方式

比如kubeadm 是 Kubernetes 官方提供的一个工具,用于在 Linux 系统上快速设置和管理 Kubernetes 集群的初始化过程。与 Kind、Minikube不同,kubeadm 用于在生产环境中部署多节点的 Kubernetes 集群,而不仅仅是单节点的本地开发环境。

第三、实战

在介绍完Docker和Kubernetes基本概念后我们来上手实操一下,

3.1 Java开发Web应用

创建Spring Boot项目

使用Spring Initializr创建一个Spring Boot项目,选择以下依赖:

  • Spring Web
  • MyBatis-Plus
  • PostgreSQL

创建完成后,你会得到一个基本的Spring Boot项目结构。

编写代码

1. 创建实体类

src/main/java/com/hanko/user/entity目录下创建User.java文件:

package com.hanko.user.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@Data
public class User {
    private Long id;
    private String name;

}
2. 创建Dao层

src/main/java/com/hanko/user/dao目录下创建UserMapper.java文件:

package com.hanko.user.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.hanko.user.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
3. 创建Service层

src/main/java/com/hanko/user/service目录下创建UserService.java文件:

package com.hanko.user.service;

import com.hanko.user.entity.User;

public interface UserService {
    User getUserById(Long id);
}
4. 创建ServiceImpl层

src/main/java/com/hanko/user/service/impl目录下创建UserServiceImpl.java文件:

package com.hanko.user.service.impl;

import com.hanko.user.dao.UserMapper;
import com.hanko.user.entity.User;
import com.hanko.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }
}
5. 修改Controller层

src/main/java/com/hanko/user/controller目录下修改HelloController.java文件,增加用户信息查询的接口:

package com.hanko.user.controller;

import com.hanko.user.entity.User;
import com.hanko.user.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUserById(id);
    }
}
6. 配置数据库

src/main/resources目录下,修改application.properties文件,配置PostgreSQL数据库:

spring.datasource.url=jdbc:postgresql://localhost:5432/xx
spring.datasource.username=xx
spring.datasource.password=xx
spring.datasource.driver-class-name=org.postgresql.Driver

mybatis-plus.mapper-locations=classpath:/mapper/*.xml
mybatis-plus.type-aliases-package=com.hanko.user.entity
7. 创建数据库表

在PostgreSQL数据库中创建users表:

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL
);
8. 运行应用

在项目根目录下运行以下命令来启动应用:

mvn spring-boot:run

打开浏览器,访问http://localhost:8080/user/1,你应该能看到用户信息的输出。

3.2 容器化应用

编写Dockerfile

在项目根目录下创建一个名为Dockerfile的文件,内容如下:

# 使用官方的Java镜像作为基础镜像
FROM openjdk:11-jre-slim

# 设置工作目录
WORKDIR /app

# 将构建好的JAR文件复制到容器中
COPY target/user-app.jar /user-app/user-app.jar

# 暴露8080端口
EXPOSE 8080

# 运行应用
CMD ["java", "-jar", "user-app.jar"]

构建Docker镜像

在项目根目录下运行以下命令来构建Docker镜像:

docker build -t hanko/user-app:latest .

运行Docker容器

构建完成后,你可以运行以下命令来启动容器:

docker run -p 8080:8080 hanko/user-app:latest

再次访问http://localhost:8080/user/1,你应该能看到相同的输出。

3.3 部署到Kubernetes

创建Kubernetes部署文件

在项目根目录下创建一个名为deployment.yaml的文件,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-kubernetes
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-kubernetes
  template:
    metadata:
      labels:
        app: user-kubernetes
    spec:
      containers:
      - name: user-kubernetes
        image: hanko/user-app:latest
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: user-kubernetes-service
spec:
  selector:
    app: user-kubernetes
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: LoadBalancer

部署到Kubernetes

在项目根目录下运行以下命令来部署应用:

kubectl apply -f deployment.yaml

访问应用

部署完成后,你可以通过Kubernetes的Service来访问应用。运行以下命令来获取Service的IP地址:

kubectl get services

在浏览器中访问http://ip/user/1,你应该能看到相同的输出。

当然如果你不想使用命令行,也可以考虑使用图形界面来部署

配置部署:包含应用名称、容器镒、pod数量、Service非常的方便,不想设置配置yaml的可以很方便的部署。

点击部署就成功了k8s应用的部署了。部署后可以看到相应的deployment、pod、service等状态和信息。

  • Deployment

  • Pod

  • Service

3.4 Tapd进行DevOps持续交付

配置Tapd

  1. 创建Tapd项目:在Tapd中创建一个新的项目。
  2. 集成代码仓库:将GitHub仓库与Tapd项目集成。
  3. 配置CI/CD流水线:在Tapd中配置CI/CD流水线,定义构建、测试和部署的步骤。

配置CI/CD流水线

在Tapd中配置CI/CD流水线,定义以下步骤:

  1. 代码拉取:从GitHub仓库拉取代码。
  2. 构建项目:使用Maven构建项目。
  3. 构建Docker镜像:使用Docker构建镜像并推送到Docker Hub。
  4. 部署到Kubernetes:使用kubectl将应用部署到Kubernetes集群。

栈江湖 正在“豆包MarsCode AI 红人创造营”中借助 AI 工具创作精彩内容,请帮TA投上一票吧! www.marscode.cn/events/2024…