【问题标题】:Is there some ways to manage Kubernetes image offline?有一些方法可以离线管理 Kubernetes 镜像吗?
【发布时间】:2020-01-28 11:20:40
【问题描述】:

我是 Kubernetes 新手。最近,我成功地用在线服务器管理了 kubernetes。但是,当我移动到隔离区域(离线服务器)时,我无法部署 kubectl 映像。但是我所有的环境都运行良好,我陷入了困境。不同的只是互联网连接。

目前,我无法在离线服务器中部署 kubernetes 仪表板和一些图像。我在离线服务器中的 kubectl 命令示例(我在在线服务器中下载了 tar 文件):

# docker load < nginx.tar

# kubectl create deployment test-nginx --image=nginx

# kubectl get pods --all-namespaces
NAMESPACE     NAME                                   READY   STATUS             RESTARTS   AGE
default       test-nginx-7d97ffc85d-2s4lh            0/1     ImagePullBackOff   0          50s
kube-system   coredns-6955765f44-2s54f               1/1     Running            1          26h
kube-system   coredns-6955765f44-wmtq9               1/1     Running            1          26h
kube-system   etcd-devkubeapp01                      1/1     Running            1          26h
kube-system   kube-apiserver-devkubeapp01            1/1     Running            1          26h
kube-system   kube-controller-manager-devkubeapp01   1/1     Running            1          26h
kube-system   kube-flannel-ds-amd64-czn8z            1/1     Running            0          26h
kube-system   kube-flannel-ds-amd64-d58x4            1/1     Running            0          26h
kube-system   kube-flannel-ds-amd64-z9w9x            1/1     Running            0          26h
kube-system   kube-proxy-9wxj2                       1/1     Running            0          26h
kube-system   kube-proxy-mr76b                       1/1     Running            1          26h
kube-system   kube-proxy-w5pvm                       1/1     Running            0          26h
kube-system   kube-scheduler-devkubeapp01            1/1     Running            1          26h

# kubectl get nodes
NAME           STATUS   ROLES     AGE   VERSION
devkubeapp01   Ready    master    26h   v1.17.2
devkubeapp02   Ready    minion1   26h   v1.17.2
devkubeapp03   Ready    minion2   25h   v1.17.2 

# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
nginx                                latest              5ad3bd0e67a9        6 days ago          127MB
k8s.gcr.io/kube-proxy                v1.17.2             cba2a99699bd        10 days ago         116MB
k8s.gcr.io/kube-apiserver            v1.17.2             41ef50a5f06a        10 days ago         171MB
k8s.gcr.io/kube-controller-manager   v1.17.2             da5fd66c4068        10 days ago         161MB
k8s.gcr.io/kube-scheduler            v1.17.2             f52d4c527ef2        10 days ago         94.4MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae1        2 months ago        41.6MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        3 months ago        288MB
quay.io/coreos/flannel               v0.11.0-amd64       ff281650a721        12 months ago       52.6MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        2 years ago         742kB

我的 Pod 无法正常运行,因此 CreatingContainer 状态变为 ImagePullBackOff(我在断开 Internet 时尝试在线服务器,状态相同 => ImagePullBackOff)。任何人都可以帮助解决这个问题? kubernetes 是否支持离线环境部署镜像?

谢谢。

【问题讨论】:

  • 能否请您提供故障 pod 的日志?我怀疑您的imagePullPolicy 可能配置错误。
  • 抱歉延迟响应,这是失败 pod 的日志:# kubectl logs test-nginx-7d97ffc85d-2s4lh 服务器错误 (BadRequest): container "nginx" in pod "test-nginx-7d97ffc85d -2s4lh" 正在等待开始:尝试拉取图像但失败

标签: docker kubernetes offline


【解决方案1】:

正如我之前的评论中所述:

我怀疑您的imagePullPolicy 可能配置错误。

并通过您提供的日志进一步证明:

来自服务器的错误(BadRequest):容器中的容器“nginx” “test-nginx-7d97ffc85d-2s4lh”正在等待开始:尝试和失败 拉图片

问题在于imagePullPolicy configuration

official documentation中所述:

预拉图像

默认情况下,kubelet 会尝试从指定的 注册表。但是,如果容器的 imagePullPolicy 属性 设置为IfNotPresentNever,则使用本地图像 (分别优先或排他)。

如果您想依靠预拉图像来替代注册表 身份验证,您必须确保集群中的所有节点都具有相同的 预拉图像。

所以基本上正如@Eduardo 已经提到的,您需要确保所有节点上的图像都相同,并且您的imagePullPolicy 配置正确。

但是,请确保容器始终使用相同版本的映像,您可以指定其digest,例如sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2。摘要唯一标识了映像的特定版本,因此除非您更改摘要值,否则 Kubernetes 永远不会更新它。

这样您可以避免将来出现类似问题,因为在这种情况下,保持完全相同版本的图像集群是最大的陷阱。

我希望这有助于并扩展上一个答案(这是正确的),并从一开始就证明我的观点。

【讨论】:

    【解决方案2】:

    使用离线环境,您需要在所有节点上预加载 docker 镜像,并确保使用正确的imagePullPolicy 以防止 Kubernetes 下载容器镜像。

    你需要:

    1. docker load &lt; nginx.tar 在所有节点中
    2. 确保部署使用imagePullPolicy,其值为IfNotPresentNever(默认值为Always,这可能是您的问题)。

    【讨论】:

    • 对于那些投反对票的人,欢迎解释和批评(也许是更好的答案)。谢谢!
    • 抱歉回复晚了,我已经在所有节点部署了docker load &lt; nginx.tar,但状态还是一样。如果我使用找不到配置文件位置的 docker 图像。我还能部署映像吗?
    • @EduardoBaitello 也不要投反对票 - 你的答案是正确的选择之一 - 另一个是在专用网络中部署注册表并从那里提取图像。
    • @amsalmaestro 您的 Kuberentes 集群是否使用 Docker(或其他类似 CRI-O)?如果是这样,您必须将图像加载到该技术。当您使用 Docker 时,请确保您使用的 exaxt 映像在所有节点上,并且您不使用 imagePullPolicy:始终
    • @koe 我正在使用 Docker :)。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2014-12-02
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    相关资源
    最近更新 更多