使用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大神。
来都来了,关注一波再溜呗。