K8s部署docker化Java應用

docker下載鏈接

Docker

下面以SpringBoot工程爲例

  • 首先建立一個SpringBoot工程,工程目錄結構如下:
> mt-myservice
    > .idea
    > .mvn
    > src
        > main
            > docker
                  Dockerfile         // Dockerfile(名字是固定的)爲工程docker的配置
        > java
            > com.my
                > controller         // web應用入口,controller控制器
                > service            // 業務邏輯類             
                  MyserviceApplication   // springBoot應用啓動類
    > resources
          application.properties     // springBoot配置類,tomcat默認端口號可在這裏修改
  • 上述添加docker配置文件Dockerfile,目錄結構設置爲src/main/docker,內容如下
#基礎鏡像環境
FROM java:8  
VOLUME /tmp  
#把工程生成的jar包添加到容器並改名爲app.jar
ADD myservice-0.0.1-SNAPSHOT.jar app.jar 
#命令入口,其中-Djava.security.egd=file:/dev/./urando是生成隨機數,urandom節約構建熵池時間
#設置應用最大內存爲1000M
ENTRYPOINT ["java","-Xmx1000m","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
  • pom中配置maven插件,配置如下
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.2.3</version>
                <configuration>
                    <imageName>demo/${project.artifactId}</imageName>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 指定tomcat端口號,以springboot爲例,在classpath路徑下修改application.properties文件,內容:
    server.port=<要修改的端口號>
  • 啓動docker(不啓動下面構建會失敗)
  • 執行maven命令:package docker:build(執行成功後會生成docker鏡像在本地倉庫)
  • 在docker命令行執行命令
    • docker images(查看本地鏡像)
    • docker login(登錄自己的docker賬號,沒有可以註冊下)
    • docker tag [ImageId]  demo/myservice:[鏡像版本號]   //修改版本號
    • docker push <username>/<tag>(推送鏡像到遠程倉庫)

常見問題:

  1. docker啓動失敗,可能是計算機沒有設置允許裝VM選項,可到bios進行更改
  2. 創建VM失敗,可能是VirtualBox版本問題,可以卸載VirtualBox重新裝

k8s部署service,yaml文件配置:

配置service信息:
api:/api/v1/namespaces/{mynamespace}/services/
請求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamespace",
        "labels":{
            "app":"myservice"
        }
    },
    "apiVersion":"v1",
    "kind":"Service",
    "spec":{
        "selector":{
            "app":"myservice"
        },
        "ports":[
            {
                "protocol":"TCP",
                "port":80,
                "targetPort":8080
            }
        ],
        "clusterIP":"None"
    }
}
注意:targetPort一定要和項目啓動的端口號一致。


配置Ingress信息(相當於nginx):
api:/apis/extensions/v1beta1/namespaces/{mynamesapce}/ingresses/
請求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamesapce"
    },
    "apiVersion":"extensions/v1beta1",
    "kind":"Ingress",
    "spec":{
        "rules":[
            {
                "host":"myservice.mtdata.bach.com",
                "http":{
                    "paths":[
                        {
                            "path":"/",
                            "backend":{
                                "servicePort":80,
                                "serviceName":"myservice"
                            }
                        }
                    ]
                }
            }
        ]
    }
}


配置deployment,定義Deployment來創建Pod和ReplicaSet
api:/apis/extensions/v1beta1/namespaces/{mynamespace}/deployments/
請求方式:post
{
    "metadata":{
        "name":"myservice",
        "namespace":"mynamespace"
    },
    "apiVersion":"extensions/v1beta1",
    "kind":"Deployment",
    "spec":{
        "template":{
            "metadata":{
                "labels":{
                    "app":"myservice"
                }
            },
            "spec":{
                "hostNetwork":false,
                "containers":[
                    {
                        "image":"docker鏡像路徑:版本號",
                        "imagePullPolicy":"Always",
                        "name":"subtitle",
                        "resources":{
                            "requests":{
                                "memory":"1024Mi",
                                "cpu":4
                            },
                            "limits":{  
                                "memory":"2048Mi",         //內存最大限制
                                "cpu":4                    //cpu核心數
                            }
                        },
                        "readinessProbe":{
                            "tcpSocket":{
                                "port":8080
                            },
                            "periodSeconds":10,
                            "initialDelaySeconds":20
                        }
                    }
                ],
                "affinity":{
                    "nodeAffinity":{
                        "requiredDuringSchedulingIgnoredDuringExecution":{
                            "nodeSelectorTerms":[
                                {
                                    "matchExpressions":[
                                        {
                                            "key":"gpu",
                                            "operator":"DoesNotExist"
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                }
            }
        },
        "replicas":1
    }
}

image升級時候,需要修改deployment,請求方式爲patch

api:/apis/extensions/v1beta1/namespaces/mynamespace/deployments/myservice

Content-Type:application/strategic-merge-patch+json


{
    "spec":{
        "template":{
            "spec":{
                "containers":[
                    {
                        "image":"docker鏡像路徑:版本號",
                        "name":"myservice"
                    }
                ]
            }
        }
    }
}

k8s api文檔:http://kubernetes.kansea.com/docs/api-reference/v1/operations/
k8s 參數說明文檔:http://kubernetes.kansea.com/docs/api-reference/v1/definitions/#_v1_event

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章