准備
本文將使用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大神。
來都來了,關注一波再溜唄。
