1. 程式人生 > 實用技巧 >使用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的值

===============================

我是Liusy,一個喜歡健身的程式設計師。

歡迎關注微信公眾號【Liusy01】,一起交流Java技術及健身,獲取更多幹貨,領取Java進階乾貨,領取最新大廠面試資料,一起成為Java大神。

來都來了,關注一波再溜唄。