准备

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

(1)设置值

53eaffe96426b9b9ffb495e7ade89bbc.png

(2)获取值

dad839e24fa9a72cdbad1319856d17ed.png

构建Web应用

(1)创建一个springboot工程

72a04070d8d06a32571299b21985c603.png

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

  org.springframework.boot  spring-boot-starter-data-redis  redis.clients  jedis  3.1.0

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

@Componentpublic 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的安装包也放到服务器上

f31e7a754d19eb8c84fcd0a49f5a6586.png

使用k8s启动一个redis服务

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

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

apiVersion: v1kind: ReplicationControllermetadata:  name: redis  labels:    name: redisspec:  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

25f2918af392a40035b312f40b8209b2.png

查看创建的Pod:

kubectl get pods

768327b02f5f5153fe19a65b6978b4f5.png

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

apiVersion: v1kind: Servicemetadata:  name: redisspec:  selector:    name: redis  #选择的Pod标签  ports:  - port: 6379  #暴露端口号    targetPort: 6379  #服务端口号

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

kubectl create -f redis-svc.yaml

查看是否创建成功:

kubectl get svc

30b8f73d970609186b54f5a0d839e66c.png

如上图所知,当前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_191ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV 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 .

fca6d34ef170fdf4da70320730e17037.png

使用如下命令查看镜像:

docker images

507e4b74fb283ba0603dc003c2e78166.png

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

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

a7d0e91f9c64c9fcff21dd582a0bcf32.png

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

使用k8s部署web应用

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

apiVersion: v1kind: ReplicationControllermetadata:  name: k8sdemo  labels:    name: k8sdemospec:  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

查看是否创建成功:

ce61cb6b93b0e302786c17f7a9778e1c.png

查看是否有创建3个Pod:

6a6c8103fbf8d28f8306f1d1626c6db4.png

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

apiVersion: v1kind: Servicemetadata:  name: k8sdemospec:  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

查看是否创建成功:

8a06ee59c7e9c1f509c971ce1105607d.png

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

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

验证

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

3bd0ef8bf8d7bf8a8c02d450641bfa98.png

(2)获取key=name的值

6725429b454e81948ef7898df3c763da.png

c7b3e82a838bba1a3dde5a10a4883a48.png 4f0a2f0a2ad671f696184a9407bae02c.png 1c571141d6ebd1b6aaab92d570d2d408.png
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐