美文网首页
Kubernetes部署遇到的坑

Kubernetes部署遇到的坑

作者: 小明今晚加班 | 来源:发表于2019-08-15 11:32 被阅读0次

首先描述我的整个部署工作流:搭建一个springboot项目hello world,然后将项目使用mvn package docker:build将项目打包成docker image,接下来把image上传到docker Hub;最后配置deployment.yaml和svc.yaml文件,实现从浏览器访问到hello world页面。

贴出几个核心的code,
Dockerfile文件如下:

FROM java:8
MAINTAINER docker_user "zhaocgc@cn.ibm.com"
EXPOSE 8080
VOLUME /tmp
ADD springbootdemo-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

application.properties文件如下:(这里仅仅指定了Tomcat的访问端口为8081)

server.port=8081

controller如下:

package com.ibm.controller;

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

@RestController
public class HelloDockerController {

    @RequestMapping(value="")
    public String helloDocker() {
        return "hello, docker!";
    }
}

pom.xml有段docker的文件配置如下,

<properties>
    <java.version>1.8</java.version>
    <docker.image.prefix>springboot</docker.image.prefix>
</properties>

<!-- Docker maven plugin -->
<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.4.13</version>
    <configuration>
        <imageName>${docker.image.prefix}/${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>

首先,通过mvn package 打包,在target目录中可以得到项目jar包,target目录如下:

image.png
然后通过 java -jar target/springbootdemo-0.0.1-SNAPSHOT.jar启动,可在浏览器访问 http://localhost:8081,得到hello,docker! 的响应。
由此证明我们的项目是没有问题的!

接下来就是把项目打包成image
可以选择删除target目录(如果不删除的除的话,接下来的命令执行会覆盖之前的内容),在项目根目录下,执行 mvn package docker:build
在十几秒钟之后会提示image构建完成,你可以通过docker images查看刚刚生成的image,如下图,(springboot/springbootdemo)

image

测试小插曲:start
这里可以对镜像进行一个测试,测试其是否可访问,通过执行命令,

# 注意,8099是你映射到服务器8081的端口,在浏览器访问的时候应该访问8099.
docker run -d -p 8099:8081 springboot/springbootdemo

此时,在本地会有启动一个container,代表把项目放到了这个container中运行。(但是今天我们不提用docker的方式,将应用部署到container中,而是采用Kubernetes这个容器编排系统)
测试小插曲:end

言归正传,然后需要把image push到docekr Hub,需要首先将image的名字改成docker 账户名/docker 仓库名: tagName
需要执行的修改image name的命令如下:

docker tag imageId cczhao/cczhao-repo:springdemo

然后,image 的name会变成cczhao/cczhao-repo ,TAG显示为springdemo,接下来把image上传,执行

docker push cczhao/cczhao-repo:springdemo

耐心等待上传完成后可在自己的docker仓库中显示刚刚上传的image,我的image上传如下,


image.png

最后就是Kubernetes部署
创建dep.yaml和svc.yaml文件分别如下,

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: spdemo
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: spdemo
    spec:
      containers:
      - name: container1-spdemo
        image: docker.io/cczhao/cczhao-repo:springdemo
        ports:
        - containerPort: 8081
apiVersion: v1
kind: Service
metadata:
  name: spdemo-svc
  labels:
    app: spdemo
spec:
  type: NodePort
  ports:
  - port: 8081
    nodePort: 30010
  selector:
    app: spdemo

这里需要注意的地方就是service中selector 名字要和Deployment中的labels名字一致;另外Deployment中containerPort要和你的Tomcat服务器开启端口一致,而不是和Dockerfile文件中expose的端口一致。
最后测试在浏览器上访问,http://192.168.99.100:30010 可得到正确的请求响应。

之前在部署过程中一直以为在做端口expose的时候,expose的是Dockerfile中指定的端口,所以最后在浏览器测试访问的时候,一直报错:Connection refused.

在其它人的博客或者在线教程中也没遇到这种问题,因为不知道别人image中是如定义port信息的,但是更多时候在server上部署的时候开放的时候都是8080端口。但是在自己亲自去构建镜像,放到server上打包,然后再在Kubernetes中部署的时候,的确遇到不少坑。。。

相关文章

网友评论

      本文标题:Kubernetes部署遇到的坑

      本文链接:https://www.haomeiwen.com/subject/yziljctx.html