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