有没有一些方法可以离线管理 Kubernetes 镜像?
Is there some ways to manage Kubernetes image offline?
我是 kubernetes 的新手。最近成功用在线服务器管理kubernetes。但是,当我移动到隔离区域(离线服务器)时,我无法部署 kubectl 图像。但是我的所有环境都 运行 很好,我陷入了困境。不同的只是互联网连接。
目前无法在离线服务器部署kubernetes dashboard和部分镜像。我在离线服务器中的 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是否支持离线环境部署镜像?
谢谢。
使用离线环境,您需要在所有节点上预加载 docker 图像,并确保使用正确的 imagePullPolicy
以防止 Kubernetes 下载容器图像。
您需要:
docker load < nginx.tar
在所有节点
- 确保部署使用的
imagePullPolicy
值为 IfNotPresent
或 Never
(默认值为 Always
,这可能是您的问题)。
正如我之前评论中所述:
I suspect that your imagePullPolicy
might be misconfigured.
并由您提供的日志进一步证明:
Error from server (BadRequest): container "nginx" in pod
"test-nginx-7d97ffc85d-2s4lh" is waiting to start: trying and failing
to pull image
问题出在 imagePullPolicy
configuration。
如 official documentation 中所述:
Pre-pulled Images
By default, the kubelet will try to pull each image from the specified
registry. However, if the imagePullPolicy
property of the container
is set to IfNotPresent
or Never
, then a local image is used
(preferentially or exclusively, respectively).
If you want to rely on pre-pulled images as a substitute for registry
authentication, you must ensure all nodes in the cluster have the same
pre-pulled images.
所以基本上正如@Eduardo 已经提到的那样,您需要确保所有节点上都有相同的图像并且您的 imagePullPolicy
已正确配置。
但是,请确保容器始终使用相同版本的图像,您可以指定其 digest,例如 sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
。摘要唯一标识图像的特定版本,因此除非您更改摘要值,否则 Kubernetes 永远不会更新它。
通过这种方式,您可以类似地避免将来出现问题,因为在这种情况下,保持完全相同版本的图像集群范围是最大的陷阱。
我希望这对之前的答案(正确的)有所帮助和扩展,并从一开始就证明了我的观点。
我是 kubernetes 的新手。最近成功用在线服务器管理kubernetes。但是,当我移动到隔离区域(离线服务器)时,我无法部署 kubectl 图像。但是我的所有环境都 运行 很好,我陷入了困境。不同的只是互联网连接。
目前无法在离线服务器部署kubernetes dashboard和部分镜像。我在离线服务器中的 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是否支持离线环境部署镜像?
谢谢。
使用离线环境,您需要在所有节点上预加载 docker 图像,并确保使用正确的 imagePullPolicy
以防止 Kubernetes 下载容器图像。
您需要:
docker load < nginx.tar
在所有节点- 确保部署使用的
imagePullPolicy
值为IfNotPresent
或Never
(默认值为Always
,这可能是您的问题)。
正如我之前评论中所述:
I suspect that your
imagePullPolicy
might be misconfigured.
并由您提供的日志进一步证明:
Error from server (BadRequest): container "nginx" in pod "test-nginx-7d97ffc85d-2s4lh" is waiting to start: trying and failing to pull image
问题出在 imagePullPolicy
configuration。
如 official documentation 中所述:
Pre-pulled Images
By default, the kubelet will try to pull each image from the specified registry. However, if the
imagePullPolicy
property of the container is set toIfNotPresent
orNever
, then a local image is used (preferentially or exclusively, respectively).If you want to rely on pre-pulled images as a substitute for registry authentication, you must ensure all nodes in the cluster have the same pre-pulled images.
所以基本上正如@Eduardo 已经提到的那样,您需要确保所有节点上都有相同的图像并且您的 imagePullPolicy
已正确配置。
但是,请确保容器始终使用相同版本的图像,您可以指定其 digest,例如 sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2
。摘要唯一标识图像的特定版本,因此除非您更改摘要值,否则 Kubernetes 永远不会更新它。
通过这种方式,您可以类似地避免将来出现问题,因为在这种情况下,保持完全相同版本的图像集群范围是最大的陷阱。
我希望这对之前的答案(正确的)有所帮助和扩展,并从一开始就证明了我的观点。