镜像仓库与 K8s 集成
Kubernetes 需要从镜像仓库拉取镜像,下面介绍集成方法。
ImagePullSecret
创建 Secret
Bash
# 从 Docker 配置创建
kubectl create secret generic regcred \
--from-file=.dockerconfigjson=/home/user/.docker/config.json \
--type=kubernetes.io/dockerconfigjson
# 或手动创建
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password=password \
--docker-email=user@example.com
使用 Secret
YAML
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-app
image: registry.example.com/my-app:v1.0
imagePullSecrets:
- name: regcred
认证问题排查
查看拉取状态
Bash
# 查看 Pod 事件
kubectl describe pod my-pod
# 常见错误
# ErrImagePull: 认证失败
# ImagePullBackOff: 重试中
查看日志
Bash
# 查看 kubelet 日志
journalctl -u kubelet
# 过滤镜像拉取错误
journalctl -u kubelet | grep "Failed to pull image"
限流问题
Docker Hub 限流
YAML
Docker Hub 限流:
- 匿名用户:100 次/6 小时
- 认证用户:200 次/6 小时
- 付费用户:无限
解决方案
YAML
# 使用镜像缓存代理
# registry-mirror 配置
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: my-app
image: mirror.gcr.io/my-app:v1.0 # 使用镜像
自建镜像代理
YAML
# Harbor 作为 K8s 镜像代理
# 配置代理缓存
# 减少直接访问 Docker Hub
镜像拉取策略
YAML
spec:
containers:
- name: my-app
image: my-app:v1.0
imagePullPolicy: Always # 总是拉取
# imagePullPolicy: IfNotPresent # 本地无则拉
# imagePullPolicy: Never # 仅使用本地
私有仓库集成
Harbor 集成
Bash
# Harbor 配置项目权限
# K8s 使用 ServiceAccount 拉取
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
secrets:
- name: harbor-secret
AWS ECR 集成
text
# 获取 ECR 认证
aws ecr get-login-password --region us-east-1 | \
kubectl create secret docker-registry ecr-secret \
--docker-server=<account>.dkr.ecr.us-east-1.amazonaws.com \
--username=AWS \
--password-stdin
要点总结
- ImagePullSecret 配置 K8s 拉取私有镜像认证
- kubectl create secret docker-registry 创建认证密钥
- ErrImagePull/ImagePullBackOff 是常见拉取失败错误
- Docker Hub 限流可通过镜像代理或付费账号解决
- imagePullPolicy 控制拉取策略:Always/IfNotPresent/Never
📝 发现内容有误?点击此处直接编辑