SpringBoot项目

新建springboot项目

@RestController
public class HelloWorldController {
	@RequestMapping("/")
	public String home() {
		return "Hello Docker World";
	}
}

构建镜像

前面说过怎么构建了

查看:

docker search hongdada|grep demo
hongdada/com.huishi.demo                                 0             

docker方式启动

docker run -p 8080:8080 -t hongdada/com.huishi.demo:latest

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.8.RELEASE)

2019-10-08 09:03:06.690  INFO 1 --- [           main] com.huishi.demo.DemoApplication          : Starting DemoApplication v0.0.1-SNAPSHOT on 55df098daeb9 with PID 1 (/app.jar started by root in /)
2019-10-08 09:03:06.697  INFO 1 --- [           main] com.huishi.demo.DemoApplication          : No active profile set, falling back to default profiles: default
2019-10-08 09:03:10.166  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-10-08 09:03:10.267  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-10-08 09:03:10.268  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.24]
2019-10-08 09:03:10.584  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-10-08 09:03:10.584  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3685 ms
2019-10-08 09:03:11.126  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-10-08 09:03:11.536  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-10-08 09:03:11.549  INFO 1 --- [           main] com.huishi.demo.DemoApplication          : Started DemoApplication in 5.986 seconds (JVM running for 7.011)

查看:

$ curl 18.16.202.95:8080
Hello Docker World

删除:

docker stop container_id
docker rm container_id

集成Kubernetes

NodePort

k8s-springboot-demo.yaml

apiVersion: apps/v1beta2  
kind: Deployment  
metadata:  
  name: k8s-springboot-demo  
  labels:  
    app: k8s-springboot-demo  
spec:  
  replicas: 1
  revisionHistoryLimit: 10
  selector:  
    matchLabels:  
      app: k8s-springboot-demo 
  template:  
    metadata:  
      labels:  
        app: k8s-springboot-demo  
    spec:  
      containers:  
      - name: k8s-springboot-demo
        image: hongdada/com.huishi.demo:latest
        ports:  
        - containerPort: 8080
          protocol: TCP  
        livenessProbe:  
          httpGet:  
            path: /  
            port: 8080  
          initialDelaySeconds: 30  
          timeoutSeconds: 30  
        imagePullPolicy: IfNotPresent  
      tolerations:  
      - key: node-role.kubernetes.io/master  
        effect: NoSchedule  
  
---  
apiVersion: v1  
kind: Service  
metadata:  
  name: k8s-springboot-demo
  namespace: default
  labels:  
    app: k8s-springboot-demo
spec:  
  ports:  
    - port: 8080  
      targetPort: 8080
  selector:  
    app: k8s-springboot-demo 
  type: NodePort  

创建deploy和service

[root@master demo]# kubectl apply -f k8s-springboot-demo.yaml
deployment.apps/k8s-springboot-demo created
service/k8s-springboot-demo created

[root@master demo]# kubectl get po,svc,deploy -o wide
NAME                                       READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
pod/curl-6bf6db5c4f-vhsqc                  1/1     Running   11         74d     10.244.2.56   slaver2   <none>           <none>
pod/k8s-springboot-demo-766c489688-jcxjz   1/1     Running   0          3m40s   10.244.2.57   slaver2   <none>           <none>

NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/k8s-springboot-demo   NodePort    10.105.149.77   <none>        8080:30516/TCP   3m40s   app=k8s-springboot-demo
service/kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          74d     <none>

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS            IMAGES                            SELECTOR
deployment.extensions/curl                  1/1     1            1           74d     curl                  radial/busyboxplus:curl           run=curl
deployment.extensions/k8s-springboot-demo   1/1     1            1           3m40s   k8s-springboot-demo   hongdada/com.huishi.demo:latest   app=k8s-springboot-demo

NodePort方式,可以到任意一个节点的30516端口查看

[root@master demo]# curl -i -X GET  slaver2:30516
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:30:20 GMT

Hello Docker World

[root@master demo]# curl -i -X GET  master:30516
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:30:33 GMT

Hello Docker World

[root@master demo]# curl -i -X GET  slaver1:30516
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:30:44 GMT

Hello Docker World

[root@master demo]# curl -i -X GET 18.16.202.163:30516
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:30:59 GM

ClusterIP

修改k8s-springboot-demo.yaml

apiVersion: v1  
kind: Service  
metadata:  
  name: k8s-springboot-demo
  namespace: default
  labels:  
    app: k8s-springboot-demo
spec:  
  ports:  
    - port: 8080  
      targetPort: 8080
  selector:  
    app: k8s-springboot-demo 
  type: ClusterIP  

将service的type修改为ClusterIP

应用:

[root@master demo]# vim k8s-springboot-demo.yaml
[root@master demo]# kubectl apply -f k8s-springboot-demo.yaml
deployment.apps/k8s-springboot-demo unchanged
The Service "k8s-springboot-demo" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'
[root@master demo]# kubectl get svc 
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/k8s-springboot-demo   NodePort    10.105.149.77   <none>        8080:30516/TCP   37m
service/kubernetes            ClusterIP   10.96.0.1       <none>        443/TCP          74d
[root@master demo]# kubectl delete svc k8s-springboot-demo 
service "k8s-springboot-demo" deleted
[root@master demo]# kubectl apply -f k8s-springboot-demo.yaml
deployment.apps/k8s-springboot-demo unchanged
service/k8s-springboot-demo created
[root@master demo]# kubectl get po,svc -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
pod/curl-6bf6db5c4f-vhsqc                  1/1     Running   11         74d   10.244.2.56   slaver2   <none>           <none>
pod/k8s-springboot-demo-766c489688-jcxjz   1/1     Running   0          37m   10.244.2.57   slaver2   <none>           <none>

NAME                          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE   SELECTOR
service/k8s-springboot-demo   ClusterIP   10.111.95.86   <none>        8080/TCP   24s   app=k8s-springboot-demo
service/kubernetes            ClusterIP   10.96.0.1      <none>        443/TCP    74d   <none>

ClusterIP方式不提供对外访问

如果实在要访问,可以使用kubectl proxy ,但是k8s官方不推荐这种方式。

LoadBalancer

将上述的服务删除,并设置为LoadBalancer方式

[root@master demo]# kubectl delete svc k8s-springboot-demo
service "k8s-springboot-demo" deleted
[root@master demo]# kubectl get po,svc,deploy
NAME                                       READY   STATUS    RESTARTS   AGE
pod/curl-6bf6db5c4f-vhsqc                  1/1     Running   11         74d
pod/k8s-springboot-demo-766c489688-jcxjz   1/1     Running   0          16h

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   74d

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/curl                  1/1     1            1           74d
deployment.extensions/k8s-springboot-demo   1/1     1            1           16h

命令方式修改

[root@master demo]# kubectl expose deploy k8s-springboot-demo --type=LoadBalancer
service/k8s-springboot-demo exposed

上述两种方式也可以使用kubectl expose方式修改,比较快捷

yaml文件修改

修改k8s-springboot-demo.yaml

apiVersion: v1  
kind: Service  
metadata:  
  name: k8s-springboot-demo
  namespace: default
  labels:  
    app: k8s-springboot-demo
spec:  
  ports:  
    - port: 8080  
      targetPort: 8080
  selector:  
    app: k8s-springboot-demo 
  type: LoadBalancer

将service的type修改为LoadBalancer

kubectl apply -f k8s-springboot-demo.yaml

查看:

[root@master demo]# kubectl get po,svc,deploy -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
pod/curl-6bf6db5c4f-vhsqc                  1/1     Running   11         74d   10.244.2.56   slaver2   <none>           <none>
pod/k8s-springboot-demo-766c489688-jcxjz   1/1     Running   0          16h   10.244.2.57   slaver2   <none>           <none>

NAME                          TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE     SELECTOR
service/k8s-springboot-demo   LoadBalancer   10.101.182.15   <pending>     8080:30852/TCP   2m44s   app=k8s-springboot-demo
service/kubernetes            ClusterIP      10.96.0.1       <none>        443/TCP          74d     <none>

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS            IMAGES                            SELECTOR
deployment.extensions/curl                  1/1     1            1           74d   curl                  radial/busyboxplus:curl           run=curl
deployment.extensions/k8s-springboot-demo   1/1     1            1           16h   k8s-springboot-demo   hongdada/com.huishi.demo:latest   app=k8s-springboot-demo

集群内部访问服务:

[root@master demo]#  curl -i -X GET  10.101.182.15:8080
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:41:21 GMT

Hello Docker World

集群外部访问服务:

[root@master demo]#  curl -i -X GET  master:30852
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:39:23 GMT

Hello Docker World 

[root@master demo]#  curl -i -X GET  slaver1:30852
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:39:35 GMT

Hello Docker World

[root@master demo]#  curl -i -X GET  slaver2:30852
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:39:39 GMT

Hello Docker World 

[root@master demo]#  curl -i -X GET  18.16.202.95:30852
HTTP/1.1 200 
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Wed, 09 Oct 2019 01:39:52 GMT

Hello Docker World

参考:

Spring Boot 项目转容器化 K8S 部署实用经验分享

K8s 集群使用 ConfigMap 优雅加载 Spring Boot 配置文件

Spring Boot应用容器化及Kubernetes部署

基于Kubernetes和Springboot构建微服务

Docker / Kubernetes部署Java / SpringBoot项目

在Kubernetes中部署spring boot应用