kubernetes - 从 kubernetes 中提取本地存储库 docker 映像
问题描述
尝试在我的本地环境中使用 Pod 安装示例容器应用程序,我正在使用 docker 桌面附带的 kubernates 集群。
我正在使用带有 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"]
用于构建映像的 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"]
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)
Flask
Redis
一旦我描述了吊舱,它就会向我显示以下错误
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
解决方案
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 run -d -p 5000:5000 --restart=always --name registry registry:2
接下来,找到主机的 IP 地址 - 下面我将10.0.2.1
用作示例。
然后,假设图像名称是“local/sample:latest”,标记图像:
docker tag local/sample:latest 10.0.2.1:5000/local/sample:latest
...并将图像推送到本地注册表:
docker push 10.0.2.1:5000/local/sample:latest
接下来,更改 pod 的配置 YAML 如何引用图像 - 从
image: local/sample:latest
至
image: 10.0.2.1:5000/local/sample:latest
重新启动 pod。
编辑:很可能必须将本地 Docker 守护进程配置为将本地 Docker 注册表视为不安全。这里描述的一种配置方法- 只需将“myregistrydomain.com”替换为主机的IP(例如10.0.2.1
)。Docker Desktop 还允许通过 GUI编辑守护进程的配置文件。
推荐阅读
- jquery - DRY原则:参考jQuery选择器避免重复
- git - 尝试从 Perforce 同步到 GIt,来自不同版本的相同产品
- terminal - Gpm_Open() 连接,但在鼠标单击时打印到控制台
- python - Pywin32 - 如何访问“数据句柄”所指的数据
- sql - 在存储过程中接受永远无法工作的 SQL Server 查询
- git - 撤销 git 签名的 PGP 证书
- php - Wordpres 错误,CentOs 服务器:上传的文件超过了 php.ini 中的 upload_max_filesize 指令
- spring-mvc - spring boot 不会在页面上显示对象列表
- listview - Observablecollection 和 listview xamarin 表单的索引
- julia - 定义中的评估