学习完本章教程后,小伙伴可以将一些需要用的的镜像上传到本地私有仓库,后续应用部署均可以使用本地仓库镜像来完成,极大的提高部署效率。另外,企业的私有应用也同样可以上传到自己的私有仓库,提高安全性。
将签署harbor证书的CA证书拷贝到所有节点的/etc/docker/certs.d/10.61.16.39目录下,否则会导致无法拉取镜像
sudo mkdir -p /etc/docker/certs.d/10.61.16.39
sudo cp /etc/kubernetes/ssl/ca.pem /etc/docker/certs.d/10.61.16.39/ca.crt
登陆harbor
$ docker login 10.61.16.39
$ Username: admin
$ Password: Harbor12345
认证信息自动保存到~/.docker/config.json文件
push镜像到kubernetes仓库
从docker hub或google_containers拉取镜像到本地
# pull from docker hub
$ docker pull nginx
# Using default tag: latest
# latest: Pulling from library/nginx
# bc95e04b23c0: Pull complete
# 110767c6efff: Pull complete
# f081e0c4df75: Pull complete
# Digest: sha256:004ac1d5e791e705f12a17c80d7bb1e8f7f01aa7dca7deee6e65a03465392072
# Status: Downloaded newer image for nginx:latest
重命名镜像
$ docker tag nginx:latest 10.61.16.39/kubernetes/nginx:laster
$ docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# nginx latest 1e5ab59102ce 2 weeks ago 108MB
# 10.211.55.14/kubernetes/nginx laster 1e5ab59102ce 2 weeks ago 108MB
# ...
推送镜像
# 公开项目不需要docker login,私有项目必须docker login后才能推送到仓库中
$ docker push 10.61.16.39/kubernetes/nginx:laster
# The push refers to a repository [10.211.55.14/kubernetes/nginx]
# a1a53f8d99b5: Pushed
# 453fc2d51e11: Pushed
# cec7521cdf36: Pushed
# laster: digest: sha256:2e6775f4300fc79b9d7fe6bb60c83b5fefe584258d9318ed408746789af48885 size: 948
# 公开项目不需要docker login,私有项目必须docker login后才能从仓库拉取
$ docker pull 10.211.55.14/kubernetes/nginx:laster
另一种方式从私有仓库拉取镜像需要先部署好kubernetes集群
Harbor使用了基于角色的访问控制策略,当从Harbor中拉去镜像的时候,首先要进行身份认证,认证通过后才可以拉取镜像。在命令行模式下,需要先执行docker login,登陆成功后,才可以docker pull。通常情况下,在私有云环境中使用kubernetes时,我们要从docker registry拉取镜像的时候,都会给docker daemo配置–insecure-registry属性来告诉docker daemo我们所使用的docker registry是可信的,这样才能从私有的docker registry中拉取镜像,但是如果要使用Harbor作为kubernetes的镜像仓库的话,这种方式就不适用了,下面让我们看看如何来使用Harbor作为kubernetes的镜像仓库。
我们在命令行方式下,输入docker login登陆成功后,会在/root/.docker/目前下生成一个config.json文件。打开后可以看到如下的内容:
{
"auths": {
"10.61.16.39": {
"auth": "YWRtaW46SGFyYm9yMTIzNDU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/17.10.0-ce (linux)"
}
}
这里的内容就是docker daemon用来与docker registry进行认证的,其中,10.61.16.39是docker registry server的地址,auth部分是加密后的认证信息,格式为:username:password,当输入命令docker pull的时候,docker daemon会获取该文件中的信息,并将auth部分的信息携带在请求的头部向docker registry server发送请求,docker registry server对请求认证通过后,就可以开始拉取镜像了,这部分的交互细节请参阅《从源码看Docker Registry v2中的Token认证实现机制》。那么如何使kubernetes通过docker registry的认证来获取镜像呢?通过翻阅kubernetes的相关文档,我们发现,kubernetes提供了2个对象:secret和serviceAccount,我们先来看下官方给出的定义:
– secret:是一个保存少量诸如密码,token等敏感数据的对象,采用secret方式保存可以获取更好的控制力和减少敏感数据意外暴露的风险。secret对象的用途有:作为文件挂载到容器中或者是在kubelet拉取镜像时使用。
– serviceAccount:为运行在pod中的进程提供身份信息。
看到了吗,kubernetes已经告诉了我们问题的答案。没错,使用secret和serviceAccount就可以实现kubernetes在创建pod的时候通过docker registry server的认证来拉取镜像。下面我们看下如何来使用这2个对象。
有2种方式可以创建secret:
a.创建命名空间:
$ cat > namespace-hr.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: hr
EOF
$ kubectl create -f namespace-hr.yaml
b. 创建secret
$ kubectl create secret docker-registry harbor --namespace=hr \
--docker-server=10.61.16.39 --docker-username=admin \
--docker-password=Harbor12345 --docker-email=wangcheng@togeek.cn
其中,
docker-server 为通过docker login登陆时输入的地址\
docker-username 为登陆时的账号\
docker-password 为登陆时的密码\
docker-email 为注册的账号时的邮箱地址\
创建成功后,我们看一下secret的内容:
$ kubectl get secret harbor -n hr -o yaml
# apiVersion: v1
# data:
# .dockercfg: eyIxMC4yMTEuNTUuMTQiOnsidXNlcm5hbWUiOiJhZG1pbiIsInBhc3N3b3JkIjoiSGFyYm9yMTIzNDUiLCJlbWFpbCI6IndhbmdjaGVuZ0B0b2dlZWsuY24iLCJhdXRoIjoiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9In19
# kind: Secret
# metadata:
# creationTimestamp: 2017-11-06T10:30:54Z
# name: harbor
# namespace: hr
# resourceVersion: "362688"
# selfLink: /api/v1/namespaces/hr/secrets/harbor
# uid: 91b984f3-c2dd-11e7-a55e-001c42f25d0b
# type: kubernetes.io/dockercfg
使用创建好的secret
{
# "kind": "Deployment",
# "apiVersion": "extensions/v1beta1",
# "metadata": {
# ...
# },
# "spec": {
# "selector": {
# ...
# },
# "metadata": {
# ...
# },
# "spec": {
"imagePullSecrets": [
{
"name": "harobr"
}
]
}
# },
# "strategy": {
# ...
# }
# },
# "status": {
# ...
# }
# }
至此,如何搭建和使用docker私有仓库教程到这里就结束了。至于为何不直接使用docker提供的私有仓库,完全是因为harbor拥有图形用户界面,纯属笔者个人爱好。当然,harbor还有很多很好的功能,有兴趣的小伙伴可以自行学习。