有一些方法可以离线管理Kubernetes映像吗?

时间:2020-01-28 11:20:40

标签: docker kubernetes offline

我是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无法正常运行,因此状态CreationContainer变为ImagePullBackOff(当我断开Internet连接时尝试在联机服务器中,状态是相同的=> ImagePullBackOff)。任何人都可以帮助解决这个问题? kubernetes是否支持离线环境来部署映像?

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

,并由您提供的日志进一步证明:

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

问题出在imagePullPolicy configuration之内。

official documentation中所述:

预拉图像

默认情况下,kubelet将尝试从指定的列表中提取每个图像 注册表。但是,如果容器的imagePullPolicy属性 设置为IfNotPresentNever,然后使用本地图像 (分别为首选或专有)。

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

因此,基本上,如@Eduardo所述,您需要确保所有节点上的映像都相同,并且imagePullPolicy已正确配置。

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

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

我希望这会有所帮助并扩展先前的答案(正确),并从一开始就证明我的观点。

答案 1 :(得分:-2)

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

您需要:

  1. docker load < nginx.tar在所有节点中
  2. 确保部署使用的值为imagePullPolicyIfNotPresent(默认值为Never的{​​{1}},这可能是您的问题)。