专栏首页Liusy01使用k8s部署springboot+redis简单应用

使用k8s部署springboot+redis简单应用

准备

本文将使用k8s部署一个springboot+redis应用,由于是示例,所以功能比较简单,只有设置值和获取值两个api。

(1)设置值

(2)获取值

构建Web应用

(1)创建一个springboot工程

(2)引入redis和jedis的maven依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.1.0</version>
</dependency>

(3)创建redis工具类,连接redis,redisIp使用变量引入

@Component
public class RedisUtil {
    @Value("${redisIp}")
    private String redisIp;
    @Value("${redisPort:6379}")
    private int redisPort;
    @Bean
    public RedisConnectionFactory initRedisConnFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisIp, redisPort);
//        configuration.setPassword("123456");
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(configuration);
        return connectionFactory;
    }
    @Bean
    public RedisTemplate getRedisTemplate(){
        RedisTemplate redisTemplate = new RedisTemplate();
        redisTemplate.setConnectionFactory(initRedisConnFactory());
        return redisTemplate;
    }
}

(4)创建api

@RestController
@RequestMapping(value = "/api/v1/k8s")
public class K8sDemoController {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 设值
     * @param key
     * @param value
     * @return
     */
    @GetMapping(value = "/setkv")
    @ResponseBody
    public String setKV(@RequestParam String key,@RequestParam String value) {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set(key,value);
        return "设置成功";
    }

    /**
     * 获取值
     * @param key
     * @return
     */
    @GetMapping(value = "/get/{key}")
    @ResponseBody
    public String get(@PathVariable(value = "key") String key) {
        ValueOperations valueOperations = redisTemplate.opsForValue();
        String result = String.valueOf(valueOperations.get(key));
        return result;
    }
}

(5)打成jar包上传至服务器待用,同时需要将jdk的安装包也放到服务器上

使用k8s启动一个redis服务

注:k8s的所有资源都可以使用yaml文件进行描述

(1)创建一个名为redis-controller.yaml的文件

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis
  labels:
    name: redis
spec:
  replicas: 1  #副本数为1
  selector:
    name: redis
  template:   #模板
    metadata:
      name: redis
      labels:
        name: redis
    spec:
      containers:
      - name: redis
        image: redis:latest
        imagePullPolicy: IfNotPresent  #镜像拉取策略
        ports:
        - containerPort: 6379   #容器端口

使用如下命令创建redis的ReplicationController控制器

kubectl create -f redis-controller.yaml

查看是否创建成功:

kubectl get rc

查看创建的Pod:

kubectl get pods

(2)创建一个名为redis-svc.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: redis
spec:
  selector:
    name: redis  #选择的Pod标签
  ports:
  - port: 6379  #暴露端口号
    targetPort: 6379  #服务端口号

使用如下命令创建redis的Service:

kubectl create -f redis-svc.yaml

查看是否创建成功:

kubectl get svc

如上图所知,当前redis被分配的IP为

10.109.56.243

redis已启动。

使用Dockerfile创建web应用镜像

Dockerfile内容如下:

#基础镜像
FROM centos:7
#标签信息
LABEL author=lsy
#设置变量,后续直接引用
ENV path=/usr/soft
#创建目录
RUN mkdir ${path}
#设置工作目录
WORKDIR ${path}
#将jdk安装包放入容器中的目录中,此命令会自动进行解压
ADD jdk-8u191-linux-x64.tar.gz ${path}
#设置容器java环境
ENV JAVA_HOME=${path}/jdk1.8.0_191
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#将web应用jar包拷贝到目录中
COPY k8s_demo-1.0.jar ${path}
#暴露8080端口
EXPOSE 8080
#容器刚启动时运行命令
CMD  java -jar -DredisIp=10.109.56.243 k8s_demo-1.0.jar

容器启动后执行的命令中的redisIp参数是由上一步获取的,k8s允许集群中服务间进行直接访问。

java -jar -DredisIp=10.109.56.243 k8s_demo-1.0.jar

在Dockerfile文件所在目录使用如下命令构建镜像:

docker build -t cnode-1:5000/k8sdemo:v1.2 .

使用如下命令查看镜像:

docker images

镜像创建成功之后,需要将镜像推送到私有仓库:

docker push cnode-1:5000/k8sdemo:v1.2

至此,web应用镜像已构建成功并推送至私有仓库

使用k8s部署web应用

(1)创建名为k8sdemo-controller.yaml的yaml文件

apiVersion: v1
kind: ReplicationController
metadata:
  name: k8sdemo
  labels:
    name: k8sdemo
spec:
  replicas: 3   #副本数为3,k8s会自动进行负载均衡
  selector:
    name: k8sdemo
  template:
    metadata:
      name: k8sdemo
      labels:
        name: k8sdemo
    spec:
      containers:
      - name: k8sdemo
        image: cnode-1:5000/k8sdemo:v1.2  #刚上传至私有仓库的镜像
        imagePullPolicy: IfNotPresent    #镜像拉取策略
        ports:
        - containerPort: 8080

使用如下命令创建web app的ReplicationController控制器:

kubectl create -f k8sdemo-controller.yaml

查看是否创建成功:

查看是否有创建3个Pod:

(2)创建名为k8sdemo-svc.yaml的yaml文件

apiVersion: v1
kind: Service
metadata:
  name: k8sdemo
spec:
  type: NodePort
  selector:
    name: k8sdemo
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080

由于此web app需要允许外部访问,所以需要将Service的spec.type设置为NodePort,同时需要在spec.ports里设置对应暴露给外部访问的端口好nodePort,这里设置的是30080

使用如下命令创建web app的Service:

kubectl create -f k8sdemo-svc.yaml

查看是否创建成功:

如上图,可看到其将8080端口映射到集群节点的30080端口。

接下来,就可以使用30080端口访问web app的api。

验证

(1)设置一个key=name,value=liusy

(2)获取key=name的值

本文分享自微信公众号 - Liusy01(Liusy_01),作者:Liusy01

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入理解Pod(三)

    Pod只是容器的载体,通常需要通过RC、Deployment、DaemonSet、Job等对象来完成Pod的调度和自动控制功能。

    Liusy
  • k8s重器之Service

    Service是k8s的核心,通过创建Service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载分发到各个容器应用上。

    Liusy
  • 【设计模式-享元模式】

    【导读】程序设计有时会面临需要创建大量相同对象或相似对象,创建大量的对象会耗费大量的内存,此时就需要一个创建之后可以重复使用的设计,这就是享元模式。

    Liusy
  • Tekton Pipeline教程

    Tekton Pipeline,是一个k8s native的pipeline, 任务跑在pod中,通过自定义CRD去管理任务与工作流等等,我看完tekton之后...

    sealyun
  • 信息收集?不存在的!

    「搜索引擎的语法」是你必须掌握的一点,这里我就不再列出来,直接附上一位博主的语法解释文章:传送门

    C4rpeDime
  • Oozie分布式任务的工作流——Spark篇

    Spark是现在应用最广泛的分布式计算框架,oozie支持在它的调度中执行spark。在我的日常工作中,一部分工作就是基于oozie维护好每天的spark离线任...

    用户1154259
  • 【Spark】Spark SQL原理、编译、配置及运行方式详述

    (1)在Hadoop中运行SQL的工具 在Hadoop中运行SQL的工具有Hive、Impala、Apache Drill、Presto、Spark SQL等...

    魏晓蕾
  • 设计模式之 原型模式

    在Java中实现原型模式十分简单,只需要实现Cloneable接口并重写clone()方法就可以了

    tanoak
  • Request对象的主要方法

    Request对象的主要方法: setAttribute(String name,Object):设置名字为name的request的参数值 getAttrib...

    用户1220053
  • 细说shiro之五:在spring框架中集成shiro

    特别地!Shiro使用了日志框架slf4j,因此需要对应配置指定的日志实现组件,如:log4j,logback等。 在此,以使用log4j为日志实现为例:

    2Simple

扫码关注云+社区

领取腾讯云代金券