1
2
3
4
5
作者:李晓辉

微信联系:lxh_chat

联系邮箱: 939958092@qq.com

今天我们来聊聊 Kubernetes 中一个非常实用的功能——如何通过 Secret 从私有镜像仓库拉取镜像,进而创建 Pod。如果你在 Kubernetes 环境中工作,肯定知道,很多时候你会遇到需要从私有仓库拉取镜像的情况。比如,你的公司有自己维护的私有 Docker 仓库,或者你的镜像放在一个私密的 Git 仓库里。那么,如何安全地管理这些仓库的认证信息呢?答案就是:Kubernetes Secret

为什么需要 Secret?

首先,让我们了解一下为什么需要使用 Secret。在 Kubernetes 中,Secret 是一种用于存储敏感信息(如密码、用户名等)的资源对象。与直接在配置文件中硬编码认证信息不同,使用 Secret 可以确保敏感数据不会暴露在代码中,同时还能够便捷地管理和更新这些信息。

在从私有镜像仓库拉取镜像时,我们必须提供认证信息。为了保证这些认证信息的安全性和可管理性,Kubernetes 提供了 Secret 作为一种存储方式。这不仅有助于提高安全性,还能简化管理过程,尤其是当你需要在多个 Pod 或 Deployment 中使用相同的认证信息时。

场景:私有 Docker 仓库的镜像

假设你在公司里有一个私有 Docker 仓库,所有的容器镜像都存放在这个仓库里。为了防止外部访问,仓库是私密的,这就意味着每次在 Kubernetes 集群中拉取镜像时,都需要提供一个用户名和密码进行认证。为了实现这一点,我们需要创建一个 Kubernetes Secret 来存储这些认证信息。

步骤一:创建 Secret

1. 创建 Docker Secret

你可以使用 kubectl 命令来创建一个 Docker Secret,该 Secret 将包含连接私有镜像仓库所需的用户名、密码和邮箱等信息。以下是一个创建名为 lxh-registry-secret 的 Secret 的命令:

1
2
3
4
5
kubectl create secret docker-registry lxh-registry-secret \
--docker-server=registry.myk8s.cn \
--docker-username=lixiaohui \
--docker-password=lixiaohuipassword \
--docker-email=939958092@qq.com
  • --docker-server:指定你的私有 Docker 仓库的地址。

  • --docker-username--docker-password:提供用于登录私有仓库的用户名和密码。

  • --docker-email:用于注册该仓库的电子邮件(有些仓库可能需要,尽管不一定)。

执行完这个命令后,Kubernetes 会创建一个 Secret,并将认证信息保存其中。

2. 验证 Secret 是否创建成功

创建 Secret 后,你可以使用以下命令来验证 Secret 是否成功创建:

1
kubectl get secrets lxh-registry-secret

如果一切顺利,你应该看到类似如下的输出:

1
2
NAME                  TYPE                             DATA   AGE
lxh-registry-secret kubernetes.io/dockerconfigjson 1 17s

其中,TYPEkubernetes.io/dockerconfigjson,这表明 Secret 是一个存储 Docker 配置信息的 Secret。

步骤二:在 Pod 中使用 Secret

现在 Secret 已经创建好了,接下来我们来看一下如何在 Pod 中使用它。如果你有一个 Deployment,想要拉取私有仓库中的镜像,你需要在 Pod 的 YAML 文件中指定 Secret。以下是一个示例 YAML 配置:

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: lxh-pod
spec:
containers:
- name: my-container
image: registry.myk8s.cn/library/nginx
imagePullSecrets:
- name: lxh-registry-secret

在这个 YAML 配置文件中,imagePullSecrets 字段用来告诉 Kubernetes 需要使用哪个 Secret 来拉取镜像。你只需要在此处指定刚才创建的 lxh-registry-secret 即可。

需要注意的是,imagePullSecrets 不仅可以用于 Pod,你同样可以在 Deployment、StatefulSet 或其他需要拉取镜像的资源对象中使用它。

步骤三:验证和调试

1. 验证镜像是否拉取成功

创建好 Pod 或 Deployment 后,你可以使用 kubectl get pods 命令查看 Pod 是否正常运行。如果一切顺利,Pod 会启动并拉取镜像。如果出现问题,你可以用 kubectl describe pod <pod-name> 命令查看详细信息,看看是否因为认证问题导致无法拉取镜像。

1
kubectl describe pod lxh-pod

例如,成功拉取镜像后的输出可能是这样的:

1
2
3
4
5
6
7
8
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 73s default-scheduler Successfully assigned default/lxh-pod to k8s-worker1
Normal Pulling 72s kubelet Pulling image "registry.myk8s.cn/library/nginx"
Normal Pulled 26s kubelet Successfully pulled image "registry.myk8s.cn/library/nginx" in 46.62s (46.62s including waiting). Image size: 192484923 bytes.
Normal Created 26s kubelet Created container: my-container
Normal Started 26s kubelet Started container my-container

如果遇到问题,Kubernetes 通常会提示类似“无法拉取镜像”或“认证失败”的信息。你可以根据这些信息来排查问题。

例如,如果 Secret 配置有误,你可能会看到如下错误信息:

1
2
3
4
5
6
7
8
9
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 6s default-scheduler Successfully assigned default/lxh-pod to k8s-worker1
Normal Pulling 6s kubelet Pulling image "registry.myk8s.cn/library/httpd"
Warning Failed 4s kubelet Failed to pull image "registry.myk8s.cn/library/httpd": Error response from daemon: Head "https://registry.myk8s.cn/v2/library/httpd/manifests/latest": no basic auth credentials
Warning Failed 4s kubelet Error: ErrImagePull
Normal BackOff 3s kubelet Back-off pulling image "registry.myk8s.cn/library/httpd"
Warning Failed 3s kubelet Error: ImagePullBackOff

这条信息明确表明问题出在认证上,提示 no basic auth credentials

常见错误及解决方法

  • 认证失败:检查用户名、密码或仓库 URL 是否填写正确,确认你的认证信息没有错误。

  • Secret 不存在:确保 Secret 创建在正确的命名空间中,并且在 YAML 配置文件中引用的是正确的 Secret 名称。

  • 权限问题:确保 Kubernetes 集群中的服务账户有足够的权限来访问 Secret。

总结

通过 Secret 来管理私有镜像仓库的认证信息,不仅可以让你安全地拉取镜像,还能保持 Kubernetes 配置的整洁和安全性。在生产环境中,这种方法可以帮助你避免泄露敏感数据,并且能够在多个 Pod 中方便地复用认证信息。

希望这篇文章能帮助你更好地理解 Kubernetes 中如何使用 Secret 来从私有仓库拉取镜像!下次遇到类似问题时,记得用 Secret 哦,保证安全又便捷。