K8S部署步骤:5-harbor使用

学习完本章教程后,小伙伴可以将一些需要用的的镜像上传到本地私有仓库,后续应用部署均可以使用本地仓库镜像来完成,极大的提高部署效率。另外,企业的私有应用也同样可以上传到自己的私有仓库,提高安全性。

创建项目

点击+项目创建一个kubernetes镜像仓库
K8S部署步骤:5-harbor使用_第1张图片

docker客户端登陆

将签署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个对象。

  1. 创建secret:

有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还有很多很好的功能,有兴趣的小伙伴可以自行学习。

你可能感兴趣的:(k8s,kubernetes)