kubernetes通过dockerfile构建应用

在本地使用Kubernetes时,您可能希望在Kubernetes中运行一些本地构建的Docker镜像。但是 kubernetes 希望你把镜像上传到镜像仓库,这个仓库可以是公开的,也可是是私有的,当需要用到镜像时,再从仓库中拉取下来。

在调试阶段,这可能会遇到一些麻烦。那能不能直接通过本地的 Dockerfile 文件来运行 kubernetes 应用呢?

这篇文章介绍一种办法,不需要把镜像发布到镜像仓库,直接使用本地的 Dockerfile 文件来操作。

# Dockerfile 编写

首先我写了一个网络服务,想通过 kubernetes 部署。代码经过简化:

from flask import Flask

app = Flask("payment")

@app.route("/")
def index():
  return "I'm payment server!"

app.run(port=5000)

我编写了一个 Dockerfile 来构建镜像:

FROM python:3.9.0-slim
ADD . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

构建镜像:

docker build -t flask-demo .

有了镜像先用 docker 运行一下看看行不行:

docker run flask-demo

可以看到服务正常启动了

image-20220601165643337

# 用 kubernetes 试试

用 docker 运行容器不是我的目的,我是想通过 kubernetes 来运行的,所以现在需要编写一个 yaml 文件来指定运行的 docker 容器:

# flask.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - args:
        - python
        - app.py
        image: flask-demo
        name: flask
      restartPolicy: Always

其中 args 表示启动容器时要运行的命令,启动一下:

kubectl create -f flask.yaml

查看一下 pod 的状态,发现镜像拉取失败了。

> kubectl get pods
NAME              READY STATUS       RESTARTS AGE
flask-world-lfrzh 0/1   ErrImagePull 0        6s

这是因为我们自己创建的镜像既不在 minikube 的绑定镜像库中,也没有在 docker hub 的公共镜像库中,它只在 docker 的本地库。

# 不从公共镜像库中拉取

现在我们直接在 yaml 中添加一行,不拉取镜像:

# flask.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask
spec:
  replicas: 1
  selector:
    matchLabels:
      app: flask
  template:
    metadata:
      labels:
        app: flask
    spec:
      containers:
      - args:
        - python
        - app.py
        image: flask-demo
        name: flask
        imagePullPolicy: Never
      restartPolicy: Always

当再次部署后,得到的 pod 状态是 ErrImageNeverPull:

> kubectl get pods
NAME              READY STATUS            RESTARTS AGE
flask-world-r4g9g 0/1   ErrImageNeverPull 0        6s

这是因为 minikube 本身的镜像库和 docker 自带的不是同一个,因此使用 kubenetes 时找不到镜像,因为要把 Docker daemon 绑定到 minikube 的内部镜像库,可以通过以下命令得到具体的提示:

> minikube docker-env
export DOCKER_TLS_VERIFY=”1"
export DOCKER_HOST=”tcp://172.17.0.2:2376"
export DOCKER_CERT_PATH=”/home/user/.minikube/certs”
export MINIKUBE_ACTIVE_DOCKERD=”minikube”
# To point your shell to minikube’s docker-daemon, run:
# eval $(minikube -p minikube docker-env)

有了提示,直接操作:

eval $(minikube -p minikube docker-env)

现在再构建的时候就很可以看到正常的 pod 状态啦。

# 查看服务

还是使用端口转发来调试下部署的应用, 访问端口就能看到能正常访问了。

kubectl port-forward deployment/flask 5000:5000

image-20220601165704472

本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。

上次更新: 2022/06/01, 08:59:38
最近更新
01
02-Cypress如何在写代码时获取提示
08-27
02
02-Cypress安装
08-27
03
0-Python怎么才能快速学好
08-27
更多文章>