zoukankan      html  css  js  c++  java
  • Kubernetes部署Spring Boot应用

    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应用

  • 相关阅读:
    蓝桥杯程序设计 剪格子
    sql中 1<> 1=1的用处
    form表单的6种提交方式
    js中添加监听,判断是什么事件
    angular iFrame加载资源问题
    报表往子报表里传入list
    struts 文件上传
    获取运行时的泛型类型
    Dao层抽取BaseDao
    SSH整合总结
  • 原文地址:https://www.cnblogs.com/hongdada/p/11637290.html
Copyright © 2011-2022 走看看