如何利用k8s拉取私有仓库镜像

本文介绍了在kubernetes(k8s)中遇到拉取私有仓库镜像时遇到的ImagePullBackOff问题及解决方法。包括修改daemon.json、生成Secret以及使用不同拉取策略。推荐使用通过用户信息生成Secret的方式,因为当密码变更时,只需更新secret即可。

现象

最近实战时,发现一个很奇怪的问题,在通过 k8s 创建 pod,拉取镜像时,总是显示如下信息:

Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image ..."

该现象出现的原因可能是网络问题、docker 环境问题等。但如果访问的是一个公开的镜像仓库,在 pull image 的时候,不应该会提示:ImagePullBackOff,但如果访问的是私有仓库,那就有可能出现如下的错误:

这个错误出现的原因,刚才说了,有可能的网络问题,也有可能是 docker 问题,但有时候,这些不能解决的情况下,可以采用下面三种方式来解决。



方式一


第一种方式,我们可以使用文件生成 secret,然后通过 k8s 中的 imagePullSecrets 来解决拉取镜像时的验证问题。具体方式如下:

修改 /etc/docker/daemon.json

在 k8s 集群节点上,修改 docker 的 daemon.json 配置文件:

{
"registry-mirrors": [ "https://registry.docker-cn.com"],
"insecure-registries":["私有仓库服务地址"]
}

在里面加上自己私有的仓库服务地址,然后重启 docker 服务,使其生效。


生成 ~/.docker/config.json 文件
docker login 私有服务地址

在命令行输入上面的命令,回车后,会提示输入用户名和密码。输入正确信息后,这会生成一个 /root/.docker/config.json 文件。同时会提示:

Login Succeeded

生成 Secret 串

根据上面生成的 ~/.docker/config.json 文件,我们可以生成一个密文秘钥:

base64 -w 0 ~/.docker/config.json

执行上面的命令后,会生成一个长串,即为我们所要的 Secret 串。

我们会在 source 下看见一个新的文件夹,_drafts,这个里面会装我们所有的草稿文件。

创建 Secret

通过 k8s 我们可以生成一个 Secret 资源:

apiVersion: v1
kind: Secret
metadata:
  name: docker_reg_secret
  namespace: default
data:
    .dockerconfigjson: ewoJImF1dGhjNWdlpHVnVaenB5Wld4aFFFeFdUa2xCVGtBeU1ERTMiCgkJfASEkidXJlZy5rOHMueXVud2VpLnJlbGEubWUiOiB7CgkJCSJhdXRoIjogIloyRnZaM1Z2WkdWdVSrsaaehoUUV4V1RrbEJUa0F5TURFMyIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJSetcaFTssZW50IjogIkRvY2tlci1DbGllbnQvMTguMDYuMS1jZSAobGludXgpIgoJfQp9
type: kubernetes.io/dockerconfigjson

执行这个资源的配置:

kubectl create -f secret.yml
在服务配置加上依赖

最后,可以在 我们的服务 yml 文件中加上拉取镜像时的依赖 secret,部分代码如下:

imagePullSecrets:
- name: docker_reg_secret

方式二


第二种方式,我们可以直接使用 docker 的用户信息来生成 secret:

kubectl create secret docker-registry docker_reg_secret --docker-server=XXX --docker-username=XXX --docker-password=XXX

参数含义:

  • docker_reg_secret:指定密钥的键名称,自定义

  • docker-server: 指定docker仓库地址

  • docker-username:指定docker仓库账号

  • docker-password:指定docker仓库密码

创建完 Secret 资源后,其他的如方式一,这就简单了。


方式三


第三种方式所使用的是最简单的办法,即我们利用 k8s 的拉取镜像的策略来处理,主要有如下三种:

  • Always:每次创建时都会拉取镜像

  • IfNotPresent:宿主机器不存在时拉取镜像(默认值)

  • Never:从不主动拉取镜像

使用 IfNotPresent、Never 策略来处理。


以上三种方式,我比较推荐第二种,最中意第二种,因为假如密码修改了,就更新一下 secret 就好了,k8s node 不需要改动。而第一种需要改动,第三种会导致镜像丢失,毕竟只有本地存在。

最后,欢迎大家关注个站哟:www.damon8.cn

最后介绍新号:天山六路折梅手,欢迎关注。

往期回顾

微服务自动化部署CI/CD

ArrayList、LinkedList 你真的了解吗?

微服务架构设计之解耦合

浅谈负载均衡

浅谈开发与研发之差异

大佬整理的mysql规范,分享给大家

如果张东升是个程序员

Oauth2的授权码模式《上》

Oauth2的认证实战-HA篇

浅谈 Java 集合 | 底层源码解析

基于 Sentinel 作熔断 | 文末赠资料

基础设施服务k8s快速部署之HA篇

今天被问微服务,这几点,让面试官刮目相看

Spring cloud 之多种方式限流(实战)

Spring cloud 之熔断机制(实战)

面试被问finally 和 return,到底谁先执行?

Springcloud Oauth2 HA篇

Spring Cloud Kubernetes之实战一配置管理

Spring Cloud Kubernetes之实战二服务注册与发现

Spring Cloud Kubernetes之实战三网关Gateway

关注公众号,回复入群,获取更多惊喜!公众号(程序猿Damon)里回复 ES、Flink、Java、Kafka、MQ、ML、监控、大数据、k8s 等关键字可以查看更多关键字对应的文章。

如有收获,点个在看,谢谢

Kubernetes 中使用私有镜像仓库镜像并创建 Pod 的过程主要包括以下几个关键步骤: 1. **准备私有镜像仓库的认证信息** Kubernetes 使用 `Secret` 资源来存储私有仓库的认证凭据。用户需要使用 `kubectl create secret docker-registry` 命令创建一个包含用户名、密码和镜像仓库地址的 Secret。例如: ```bash kubectl create secret docker-registry my-registry-secret \ --docker-server=DOCKER_REGISTRY_SERVER \ --docker-username=DOCKER_USER \ --docker-password=DOCKER_PASSWORD \ --docker-email=DOCKER_EMAIL ``` 这个 Secret 将用于 Kubernetes私有镜像时进行身份验证 [^2]。 2. **在 Pod 定义中引用 Secret** 创建 Pod 时,需要在 Pod 的 YAML 定义文件中通过 `imagePullSecrets` 字段引用之前创建的 Secret。例如: ```yaml apiVersion: v1 kind: Pod metadata: name: my-private-pod spec: containers: - name: my-container image: my-registry.example.com/my-image:tag imagePullSecrets: - name: my-registry-secret ``` 这样,Kubernetes 在调度该 Pod 并镜像时,会使用指定的 Secret 进行认证 [^2]。 3. **确保 Kubernetes 节点可以访问私有仓库** Kubernetes 节点上的 kubelet 必须能够访问私有镜像仓库。这可能涉及到网络配置、DNS 解析、防火墙规则以及 TLS 证书的配置。如果使用的是自签名证书的私有仓库,需要在每个节点上信任该证书 [^1]。 4. **使用 Helm 或 Operator 管理复杂部署** 对于更复杂的部署场景,可以使用 Helm Chart 或 Operator 来封装镜像的配置逻辑。这样可以在多个环境中复用配置,并简化部署流程 [^4]。 5. **Harbor 仓库的特殊配置** 如果使用 Harbor 作为私有镜像仓库,除了创建 Secret 外,还需要确保 Kubernetes 集群能够解析 Harbor 的地址,并且在使用 HTTPS 的情况下,Harbor 的证书被正确信任。创建 Secret 的方式与普通私有仓库一致 [^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值