K8S实战 之 后端部署

本文基于K8S实战 之 私有镜像仓库K8S实战 之 数据库部署

目录

项目

1
2
java -version
# openjdk version "11.0.11"

docker-repository-backend-01.png

1
2
3
unzip repo-spring.zip

cd repo-spring
1
vim src/main/java/com/example/repospring/APIController.java
1
2
3
4
5
6
7
8
9
10
11
12
package com.example.repospring;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class APIController {
@GetMapping("/api")
public String api() {
return "v1";
}
}
1
2
3
4
./gradlew bootrun

curl localhost:8080/api
# v1

镜像

1
vim Dockerfile
1
2
3
4
5
6
7
8
9
FROM openjdk:11

ARG JAR_FILE

COPY ${JAR_FILE} /opt/app.jar

WORKDIR /opt

ENTRYPOINT ["java", "-jar", "/opt/app.jar"]
1
2
3
4
5
6
7
8
9
10
11
12
./gradlew build

docker build --build-arg JAR_FILE=build/libs/\*SNAPSHOT.jar -t repo-spring:0.1 .

docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# repo-spring 0.1 65ff78d205a9 9 seconds ago 665MB

docker run --name=v1 -p 9000:8080 -d repo-spring:0.1

curl localhost:9000/api
# v1
1
2
vim src/main/java/com/example/repospring/APIController.java
# v1 => v2
1
2
3
4
5
6
7
8
9
10
11
12
13
./gradlew build

docker build --build-arg JAR_FILE=build/libs/\*SNAPSHOT.jar -t repo-spring:0.2 .

docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# repo-spring 0.2 b3d75e797e06 7 seconds ago 665MB
# repo-spring 0.1 65ff78d205a9 About a minute ago 665MB

docker run --name=v2 -p 9001:8080 -d repo-spring:0.2

curl localhost:9001/api
# v2

数据

1
vim build.gradle
1
2
3
4
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
1
vim src/main/java/com/example/repospring/TestModel.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.repospring;

import lombok.Data;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "test_tb")
@Data
public class TestModel {
@Id
private Integer id;

private String data;
}
1
vim src/main/java/com/example/repospring/TestRepository.java
1
2
3
4
5
6
package com.example.repospring;

import org.springframework.data.jpa.repository.JpaRepository;

public interface TestRepository extends JpaRepository<TestModel, Integer> {
}
1
vim src/main/java/com/example/repospring/DBController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.repospring;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DBController {
@Autowired
private TestRepository testRepository;

@GetMapping("/db")
public String db() {
TestModel data =testRepository.findById(1).orElse(null);
return data.getData();
}
}
1
2
vim src/main/java/com/example/repospring/APIController.java
# v2 => v3
1
vim src/main/resources/application.properties
1
2
3
spring.datasource.url=jdbc:mysql://172.10.66.201:30653/test_db?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
1
2
3
4
5
6
7
./gradlew bootrun

curl localhost:8080/api
# v3

curl localhost:8080/db
# hello world
1
2
3
4
5
6
7
8
9
10
11
mv src/main/resources/application.properties src/main/resources/application.properties.dist

./gradlew build -x test

docker build --build-arg JAR_FILE=build/libs/\*SNAPSHOT.jar -t repo-spring:0.3 .

docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# repo-spring 0.3 078c84bbbe34 7 seconds ago 689MB
# repo-spring 0.2 b3d75e797e06 27 seconds ago 665MB
# repo-spring 0.1 65ff78d205a9 About a minute ago 665MB

仓库

1
2
3
4
5
6
7
8
9
10
11
docker tag 65ff78d205a9 registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.1

docker push registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.1

docker tag b3d75e797e06 registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.2

docker push registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.2

docker tag 078c84bbbe34 registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.3

docker push registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.3

配置

1
vim config.yml
1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: ConfigMap
metadata:
name: repo-spring-config
data:
bootstrap.properties: |
spring.datasource.url=jdbc:mysql://mysql-service/test_db?useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
1
kubectl apply -f config.yml

上述使用Service Name来访问服务的方式是基于Core DNS实现的

1
2
3
4
kubectl get pods --namespace=kube-system
# NAME READY STATUS RESTARTS AGE
# coredns-94d74667-jtfsx 1/1 Running 5 60d
# coredns-94d74667-twqll 1/1 Running 5 60d

部署

1
vim k8s.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
apiVersion: apps/v1
kind: Deployment
metadata:
name: repo-spring
spec:
selector:
matchLabels:
app: repo-spring
replicas: 3
template:
metadata:
labels:
app: repo-spring
spec:
containers:
- name: repo-spring
image: registry.cn-hangzhou.aliyuncs.com/ali-pub/repo-spring:0.3
imagePullPolicy: "Always"
args: ["--spring.config.location=bootstrap.properties"]
ports:
- containerPort: 8080
volumeMounts:
- name: repo-spring-config
mountPath: /opt/bootstrap.properties
subPath: bootstrap.properties
volumes:
- name: repo-spring-config
configMap:
name: repo-spring-config
items:
- key: bootstrap.properties
path: bootstrap.properties
---
apiVersion: v1
kind: Service
metadata:
name: repo-spring
spec:
selector:
app: repo-spring
ports:
- protocol: TCP
port: 9000
targetPort: 8080
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: repo-spring
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: repo-spring.com
http:
paths:
- backend:
serviceName: repo-spring
servicePort: 9000
1
2
3
kubectl apply -f k8s.yml

kubectl get pods,svc
1
2
3
4
5
6
7
NAME                              READY   STATUS    RESTARTS   AGE
pod/repo-spring-985b54f7c-74dgr 1/1 Running 0 2m37s
pod/repo-spring-985b54f7c-p4kgl 1/1 Running 0 2m37s
pod/repo-spring-985b54f7c-szdsx 1/1 Running 0 2m37s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/repo-spring NodePort 10.99.7.49 <none> 9000:30629/TCP 2m37s
1
2
3
4
5
curl 172.10.66.201:32640/api -H 'Host: repo-spring.com'
# v3

curl 172.10.66.201:32640/db -H 'Host: repo-spring.com'
# hello world

清理

1
2
3
4
5
kubectl delete -f k8s.yml

kubectl delete -f config.yml

docker rm -f v1 v2 v3

参考