Kubernetes與Spring Boot簡單HelloWorld教程 - Maroun

banq發表於2020-10-08

讓我們構建最簡單的Java Spring Boot應用程式,將其包裝在Docker容器中,然後在K8s pod中使用該容器,該容器由K8s部署進行編排並透過服務公開。服務由兩個pod和一個簡單的負載平衡器提供支援,可以根據應用程式的需求輕鬆擴充套件。
 
專案結構:

├── Dockerfile
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── k8s
│   └── depl.yaml
├── settings.gradle
└── src
    └── main
        └── java
            └── hello
                ├── App.java
                └── HelloWorldCtrl.java


 App.java是應用入口:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}


上面的程式碼包含建立Spring Boot應用程式所需的最少程式碼。
下面HelloWorldCtrl.java包含一個簡單的控制器,其對映的根路徑(“/”),並返回問候語的字串:

package hello;

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

@RestController
public class HelloWorldCtrl {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}


 

構建應用程式
我正在使用Gradle作為構建工具。該build.gradle檔案也是最小檔案,由以下幾行組成:

plugins {
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'io.spring.dependency-management' version '1.0.8.RELEASE'
    id 'java'
}

group = 'com.test'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
}


 

建立K8s資源
為了建立K8s部署,我們需要一個Docker映像/映象。讓我們在我們的程式碼中新增以下幾行Dockerfile:

FROM gradle:jdk10

COPY --chown=gradle:gradle . /app
WORKDIR /app
RUN gradle build

EXPOSE 8080
WORKDIR /app

CMD java -jar build/libs/gs-spring-boot-0.1.0.jar


Docker檔案中的步驟:
  • 將專案複製到 /app
  • 使用Gradle構建專案
  • 使用上一步的結果執行應用程式

現在,我們可以構建映像並推送到中心:

docker build -t marounbassam/hello-spring .
docker push marounbassam/hello-spring

 

K8s的部署很簡單。
它由部署服務組成

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world
        visualize: "true"
    spec:
      containers:
      - name: hello-world-pod
        image: marounbassam/hello-spring
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    visualize: "true"
  name: hello-world-service
spec:
  selector:
    app: hello-world
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
  type: ClusterIP


部署Deployment部分定義了Pod的兩個副本,這些副本將執行根據image屬性中指定的映像構建的容器。
服務Service部分是型別的ClusterIP(預設的Kubernetes服務)。它為我們提供了群集中其他應用程式可以訪問的服務。
在叢集中建立資源:

kubectl create -f <yaml_file>




+---------------------+
| hello-world-service |
|              |
|    10.15.242.210  |
+---------O-----------+
          |
          +-------------O--------------------------O
                    |                  |
              +---------O-----------+   +---------O-----------+
              |        pod 1  |    |        pod 2   |
              |             |    |               |
              |     hello-world  |    |     hello-world   |
              +---------------------+    +---------------------+


 

安裝叢集

$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-world-5bb87c95-6h4kh   1/1       Running   0          7h
hello-world-5bb87c95-bz64v   1/1       Running   0          7h
$ kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hello-world-service   ClusterIP   10.15.242.210   <none>        8080/TCP   5s
kubernetes            ClusterIP   10.15.240.1     <none>        443/TCP    7h
$ kubectl exec -it hello-world-5bb87c95-6h4kh bash
$ (inside the pod) curl 10.15.242.210:8080
$ (inside the pod) Greetings from Spring Boot!


我們可以看到伺服器已啟動並且正在pod內執行。根據您的雲提供商,您可以設定服務型別LoadBalancer並從叢集外部訪問應用程式。
 

相關文章