将Spring-Boot应用部署到KUBERNETES集群中

19-01-07 banq
              

预备:

Minikube:https//github.com/kubernetes/minikube

kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl/

docker:https//docs.docker.com/toolbox/toolbox_install_mac/

1.使用SPOTIFY maven插件构建简单的Spring MVC控制器和Docker镜像:

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

/**
 * Created by tomask79 on 20.06.18.
 */
@RestController
public class ControllerMVC {

    @RequestMapping("/sayhello")
    public String mvcTest() {
        return "I'm saying hello to Kubernetes!";
    }
}

 http://<hostIP>:8081/sayhello 会返回:"I'm saying hello to Kubernetes!"

Docker 部分

[INFO] --- docker-maven-plugin:1.0.0:build (build-image) @ demo ---
<p>[INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier]
<p>[INFO] Copying /Users/tomask79/Downloads/kubernetes-boot/target/demo-0.0.1-SNAPSHOT.jar -> /Users/tomask79/Downloads/kubernetes-boot/target/docker/demo-0.0.1-SNAPSHOT.jar
<p>[INFO] Building image test-controller:1.0-SNAPSHOT
Step 1/3 : FROM openjdk:latest

 ---> a2fbe0dde8c0
Step 2/3 : ADD /demo-0.0.1-SNAPSHOT.jar //

 ---> f6d0ea73d221
Step 3/3 : ENTRYPOINT ["java", "-jar", "/demo-0.0.1-SNAPSHOT.jar"]

 ---> Running in ef86f44eb22c
Removing intermediate container ef86f44eb22c
 ---> f9079973efda
ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
Successfully built f9079973efda
Successfully tagged test-controller:1.0-SNAPSHOT

如果要更改镜像名称和其他属性,请更改maven docker插件属性:

 <plugin>
            <executions>
                <execution>
                    <id>build-image</id>
                    <phase>package</phase>
                    <goals>
                        <goal>build</goal>
                    </goals>
                </execution>
            </executions>
            <groupId>com.spotify</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>1.0.0</version>
            <configuration>
                <imageName>test-controller:1.0-SNAPSHOT</imageName>
                <baseImage>openjdk:latest</baseImage>
                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}</directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>

现在运行docker镜像。您应该看到kubernetes集群组件的镜像,包括我们的测试控制器:1.0-SNAPSHOT :

$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
test-controller                            1.0-SNAPSHOT        f59ad695afd9        About an hour ago   640MB
openjdk                                    latest              a2fbe0dde8c0        2 weeks ago         624MB
k8s.gcr.io/kube-proxy-amd64                v1.10.0             bfc21aadc7d3        2 months ago        97MB
k8s.gcr.io/kube-apiserver-amd64            v1.10.0             af20925d51a3        2 months ago        225MB
k8s.gcr.io/kube-controller-manager-amd64   v1.10.0             ad86dbed1555        2 months ago        148MB
k8s.gcr.io/kube-scheduler-amd64            v1.10.0             704ba848e69a        2 months ago        50.4MB
k8s.gcr.io/etcd-amd64                      3.1.12              52920ad46f5b        3 months ago        193MB
k8s.gcr.io/kube-addon-manager              v8.6                9c16409588eb        4 months ago        78.4MB
k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64     1.14.8              c2ce1ffb51ed        5 months ago        41MB
k8s.gcr.io/k8s-dns-sidecar-amd64           1.14.8              6f7f2dc7fab5        5 months ago        42.2MB
k8s.gcr.io/k8s-dns-kube-dns-amd64          1.14.8              80cc5ea4b547        5 months ago        50.5MB
k8s.gcr.io/pause-amd64                     3.1                 da86e6ba6ca1        6 months ago        742kB
k8s.gcr.io/kubernetes-dashboard-amd64      v1.8.1              e94d2f21bc0c        6 months ago        121MB
gcr.io/k8s-minikube/storage-provisioner    v1.8.1              4689081edb10        7 months ago        80.8MB
k8s.gcr.io/echoserver                      1.4      

Kubernetes 部分:

  • 建议通过“minikube start”启动minikube
  • 通过kubectl cluster-info验证minikube本地kubernetes集群是否已启动

$ kubectl cluster-info
Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

是时候将应用程序部署到kubernetes了。在开始之前,我建议您熟悉这些条款。从这里开始,例如:https//kubernetes.io/docs/concepts/

关注条款:

  • Kubernetes POD
  • Kubernetes部署
  • Kubernetes服务(Type NodePort)

在pom.xml的根目录下运行“kubectl create -f deployment.yaml”

deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test-app
spec:
 replicas: 1
  template: 
    metadata:
      labels:
        app: test-app
    spec:
      containers:
      - name: test-app
         image: test-controller:1.0-SNAPSHOT
        ports:
        - containerPort: 8081

并验证是否已安装部署且POD正在运行。

$ kubectl get pods
 NAME                             READY     STATUS    RESTARTS   AGE
 hello-minikube-6c47c66d8-gzvgc   1/1       Running   4          5d
 test-app-64f8b5bfcd-vndtn        1/1       Running   0          2h

验证复制节点的DEPLOYMENT也是运行的:

$ kubectl get deployments
NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1         1         1            1           5d
test-app         1         1         1            1           2h

要从外部访问DEPLOYMENT测试应用程序,我们需要为此安装kubernetes服务。我将使用NODEPORT类型,随机分配的端口范围为30000-32767。

service.yaml ...

apiVersion: v1
kind: Service
metadata:
  name: test-app
  labels:
    name: test-app
  spec:
    type: NodePort
  ports:
      - port: 8081
        targetPort: 8081
  selector:
   app: test-app

安装服务运行"kubectl create -f service.yaml",验证确认:

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          5d
test-app     NodePort    10.107.38.160   <none>   

从外部访问部署

需要获取服务的URL,我们有两个选择:

1)minikube service test-app --url

$ minikube service test-app --url http://192.168.99.100:31201

2) kubectl describe service test-app ...

$ kubectl describe service test-app
Name:                     test-app
Namespace:                default
Labels:                   name=test-app
Annotations:              none
Selector:                 app=test-app
Type:                     NodePort
IP:                       10.107.38.160
Port:                     unset  8081/TCP
TargetPort:               8081/TCP
NodePort:                 unset  31201/TCP
Endpoints:                172.17.0.5:8081
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   none

我们知道master运行在192.168.99.100,分配端口是31201.所以让我们测试一下: 

$ curl http://192.168.99.100:31201/sayhello
I'm saying hello to Kubernetes!

好的,我们已成功将spring-boot应用程序部署到kubernetes ...我希望你喜欢它。

点击标题见原文