Kubernetes Pods指定镜像仓库

Foreward

在创建pod时,image是从哪个仓库下载?应该如何指定公司的Regitry?最佳实践是什么?带着这些问题,记录自己的爬坑经历.

镜像建议

  • 对每个镜像都指定明确的版本号(不要使用latest这样的版本号),减少去镜像仓库拉取的消耗.(可以学习kube的api,版本为X.Y.Z. X is the major version, Y is the minor version, and Z is the patch version)

使用镜像私仓

  • 使用私仓时,需要配置认证信息.

  • pod中指定私仓优先级高于node指定私仓.

在node节点中配置(推荐)

  • 与在每个pod中使用ImagePullSecrets相比,少了重复的配置代码.

配置认证信息

  • docker添加私仓认证信息,可参考这里

一般使用docker时,默认都是从docker hub上拉取镜像.正常拉取是不需要认证信息的,但在上传时需要认证信息.

在每个节点上配置登录认证信息.

1
2
3
# 默认docker hub的地址是:https://index.docker.io/v1
$ echo [密码] | docker login --username [用户名] --password-stdin [私仓服务器地址]
# 认证后,会在$HOME/.docker/下生成config.json文件.如果指定退出则会删除该文件.

认证信息优先级

  • {–root-dir:-/var/lib/kubelet}/config.json

默认config.json不存在

  • {cwd of kubelet}/config.json

指定kubelet的工作空间路径,这种方式暂不考虑.

  • ${HOME}/.docker/config.json

默认config.json是不存在的

  • /.docker/config.json

默认该目录不存在

在pod中指定ImagePullSecrets

创建secret

1
2
# 实际上在pull镜像时创建一个虚拟的.docker/config.json文件.
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL

pod中使用imagePulSecrets

1
2
3
4
5
6
7
8
9
10
11
12

apiVersion: apps/v1 # 可以使用kubectl api-versions确定指定的版本
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistryke

以上两种方式,可以结合使用,建议每台node上都先配置认证信息,有需要再使用第二种方式.

Reference

Images

坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub