从 kubernetes 拉取本地仓库 docker 镜像

THe*_*ath 1 kubernetes

尝试在本地环境中使用 Pod 安装示例容器应用程序,我使用的是 docker 桌面附带的 kubernates 集群。

我正在使用 bellow 命令和 YML 文件 kubectl create -f test_image_pull.yml 创建 Pod

apiVersion: v1
kind: Pod
metadata:
# value must be lower case
  name: sample-python-web-app
spec:
  containers:
    - name: sample-hello-world
      image: local/sample:latest
      imagePullPolicy: Always
      command: ["echo", "SUCCESS"]

Run Code Online (Sandbox Code Playgroud)

docker 文件用于构建映像,如果您使用 docker run 运行,则此容器运行没有任何问题

# Use official runtime python
FROM python:2.7-slim

# set work directory to app

WORKDIR /app
# Copy current directory
COPY . /app

# install needed packages
RUN pip install --trusted-host pypi.python.org -r requirement.txt

# Make port 80 available to outside container

EXPOSE 80

# Define environment variable

ENV NAME World

# Run app.py when the container launches

CMD ["python" , "app.py"]


Run Code Online (Sandbox Code Playgroud)
from flask import Flask
from redis import Redis, RedisError
import os
import socket


#connect to redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)
app = Flask(__name__)

@app.route("/")

def hello():
    try:
       visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
            "<b>Hostname:</b> {hostname}<br/>"  \
            "<b>Visits:</b> {visits}"


    return html.format (
              name=os.getenv("NAME", "world"),
              hostname=socket.gethostname(),
              visits=visits  
            )

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=80)            

Run Code Online (Sandbox Code Playgroud)
Flask
Redis


Run Code Online (Sandbox Code Playgroud)

一旦我描述了吊舱,它就会显示以下错误

kubectl 描述 pod sample-python-web-app

Events:
  Type     Reason     Age                  From                     Message
  ----     ------     ----                 ----                     -------
  Normal   Scheduled  3m25s                default-scheduler        Successfully assigned default/sample-python-web-app to docker-desktop
  Normal   Pulling    97s (x4 over 3m22s)  kubelet, docker-desktop  Pulling image "local/sample:latest"
  Warning  Failed     94s (x4 over 3m17s)  kubelet, docker-desktop  Failed to pull image "local/sample:latest": rpc error: code = Unknown desc = Error response from daemon: pull access denied for local/sample, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     94s (x4 over 3m17s)  kubelet, docker-desktop  Error: ErrImagePull
  Normal   BackOff    78s (x6 over 3m16s)  kubelet, docker-desktop  Back-off pulling image "local/sample:latest"
  Warning  Failed     66s (x7 over 3m16s)  kubelet, docker-desktop  Error: ImagePullBackOff
Run Code Online (Sandbox Code Playgroud)

api*_*sim 5

Kubernetes 从 Docker Registry 中拉取容器镜像。根据文档

您创建 Docker 映像并将其推送到注册表,然后再在 Kubernetes pod 中引用它。

而且:

image容器的属性支持与 docker 命令相同的语法,包括私有注册表和标签。

因此,在 pod 的规范中引用映像的方式 - “image: local/sample:latest” - Kubernetes 在 Docker Hub 上查找名为“local”的存储库中的映像。

你可以将镜像推送到 Docker Hub 或其他一些外部 Docker Registry,公共的或私有的;您可以在 Kubernetes 集群上托管 Docker Registry;或者,您可以在容器中本地运行 Docker Registry。

在本地运行 Docker 注册表

docker run -d -p 5000:5000 --restart=always --name registry registry:2
Run Code Online (Sandbox Code Playgroud)

接下来,找出主机的 IP 地址是什么——下面我将10.0.2.1以此为例。

然后,假设图像名称为“local/sample:latest”,标记图像:

docker tag local/sample:latest 10.0.2.1:5000/local/sample:latest
Run Code Online (Sandbox Code Playgroud)

...并将图像推送到本地注册表:

docker push 10.0.2.1:5000/local/sample:latest
Run Code Online (Sandbox Code Playgroud)

接下来,在 pod 的配置 YAML 中更改图像的引用方式 - 从

    image: local/sample:latest
Run Code Online (Sandbox Code Playgroud)

    image: 10.0.2.1:5000/local/sample:latest
Run Code Online (Sandbox Code Playgroud)

重新启动吊舱。

编辑:很可能必须配置本地 Docker 守护程序以将本地 Docker 注册表视为不安全此处描述的一种配置方法- 只需将“myregistrydomain.com”替换为主机的 IP(例如10.0.2.1)。Docker Desktop 还允许通过 GUI编辑守护进程的配置文件。