本文基于K8S实战 之 私有镜像仓库 和K8S实战 之 数据库部署
目录
项目
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
镜像
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 docker run --name=v1 -p 9000:8080 -d repo-spring:0.1 curl localhost:9000/api
1 2 vim src/main/java/com/example/repospring/APIController.java
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 docker run --name=v2 -p 9001:8080 -d repo-spring:0.2 curl localhost:9001/api
数据
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
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 curl localhost:8080/db
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
仓库 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 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
部署
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' curl 172.10.66.201:32640/db -H 'Host: repo-spring.com'
清理 1 2 3 4 5 kubectl delete -f k8s.yml kubectl delete -f config.yml docker rm -f v1 v2 v3
参考