Kubernetes使用Harbor私有镜像仓库

  • 1 安装说明
  • 1.1 安装要求说明
  • 1.2 安装版本说明
  • 1.3 集群效果说明
  • 2 安装步骤
  • 2.1 安装Docker
  • 2.2 安装Docker-Compose
  • 2.3 安装Harbor
  • 2.4 配置Docker客户端
  • 3 测试
  • 3.1 创建Harbor项目
  • 3.2 上传镜像到Harbor
  • 3.2.1 登录Harbor
  • 3.2.2 推送Docker镜像
  • 3.2.3 拉取Docker镜像
  • 3.3 部署K8S服务
  • 3.3.1 不添加登录信息的情况
  • 3.3.2 添加登录信息的情况
  • 3.4 测试总结


1 安装说明

1.1 安装要求说明

  • 集群要求说明:在安装 Harbor 私有镜像仓库之前,需要先有一个K8S集群,本文中使用的集群的搭建过程请见 基于CentOS 7.6安装Kubernetes 1.18.0单Master节点集群 这篇博文。
  • 硬件要求说明:安装 Harbor 私有镜像仓库的主机或虚拟机要求至少2核4G且内存不低于40GB,本文中使用的是 CentOS7.6 虚拟机来安装Harbor私有镜像仓库。
  • 软件要求说明:安装 Harbor 私有镜像仓库之前需要先安装 docker 和 docker-compose。
  • 特别说明:本文中安装的Harbor私有镜像仓库是使用HTTP协议来访问,而不是使用使用HTTPS协议来访问。

1.2 安装版本说明

  • 软件版本说明:

软件

版本

docker

19.03.12

docker-compose

1.26.2

harbor

1.8.0

kubernates

1.18.0

1.3 集群效果说明

  • 集群效果说明:安装后的K8S集群由1个 master 节点、2个 worker 节点和1个harbor镜像仓库节点组成,如处图所示。

2 安装步骤

2.1 安装Docker

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
  • 安装工具:安装docker之前,需要先安装yum-utils工具,并设置仓库,在要安装Harobr私有镜像仓库的虚拟机中执行以下命令以安装yum-utils及设置仓库。
sudo yum install -y yum-utils

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker:在要安装Harbor私有镜像仓库的虚拟机中执行以下命令以安装docker。
# 这里安装的是docker的最新版本(最新版本是19.03.12)
sudo yum install docker-ce docker-ce-cli containerd.io

# 或者使用以下命令安装指定版本的docker
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
  • 查看版本:在要安装Harbor私有镜像仓库的虚拟机中执行以下命令即可查看安装的docker的版本。
docker -v
  • 设置开机启动:在要安装Harbor私有镜像仓库的虚拟机中执行以下命令设置docker开机自动启动,并且立即启动docker。
# 设置开机启动docker
systemctl enable docker

# 启动docker
sudo systemctl start docker

2.2 安装Docker-Compose

  • 官方文档:安装docker-compose的官方说明文档
  • 下载软件:docker-compose软件是一个可执行的二进制文件,在要安装Harbor私有镜像仓库的虚拟机中执行以下命令即可从官网中下载docker-compose软件,下载速度很比较慢,如果失败,则需要多试几次。
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 设置权限:docker-compose可执行文件默认下载到了/usr/local/bin目录下,但是并不具有可执行的权限,所以要设置可执行的权限。在要安装Harbor私有镜像仓库的虚拟机中执行以下命令即可设置可执行权限。
sudo chmod +x /usr/local/bin/docker-compose
  • 查看版本:给docker-compose可执行文件设置了可执行权限之后,即可执行以下命令以查看安装的docker-compose的版本。
docker-compose --version

2.3 安装Harbor

  • 官方文档:Harbor的GitHub官方仓库Harbor的官方下载地址Harbor的官方安装文档
  • 下载软件:从Harbor的官方下载地址下载harobr的1.8.0版本的离线安装版本,下载后的文件名称为 harbor-offline-installer-v1.8.0.tgz,下载好了之后,将该文件放到要安装Harbor私有镜像仓库的虚拟机的/data目录中。
  • 解压文件:先在要安装Harbor私有镜像仓库的虚拟机中执行以下命令解压Harbor的安装包,解压后会在当前目录中生成一个名称为harbor的目录,解压后的目录结构如下图所示。
tar -zxvf harbor-offline-installer-v1.8.0.tgz

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_kubernates

  • 修改配置:解压生成的目录下名称为 harbor.yml 的文件即是 harbor 的配置文件,install.sh文件即为harbor的安装文件,docker-compose.yml文件即是harbor启动和停止的文件。在安装harbor之前,需要先修改 harbor.yml 配置文件中的配置,主要是设置Harobr 镜像仓库的域名、admin账号的登录密码、存储目录等。本文中设置的域名为 registry.k8s.com。
  • 安装Harbor:harbor的配置文件修改并保存之后,即可执行以下命令以安装Harbor,命令执行结果如下图所示,当harbor安装成功之后,会出现下图底部的提示信息。
./prepare
./install.sh

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_02


如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_03

  • 查看harbor服务:harbor安装成功之后,默认会自动启动harbor服务,通过执行以下命令即可查看harbor服务的启动状态,如果所有的服务的状态都是UP,则表示harbor启动成功。
docker ps

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_04

  • 访问harbor管理页面:harobr启动成功了之后,就可以在宿主机的浏览器中访问 harbor 的管理页面了,访问之前需要先在宿主机的 hosts 域名映射文件中添加以下域名映射,添加并保存了之后,就可以在宿主机的浏览器中访问 http://registry.k8s.com ,首先会出现Harobr的登录页面,需要使用在 harbor.yml中配置的登录名(admin)和密码(Harbor12345)进行登录。
# windows中hosts文件的路径为 C:\Windows\System32\drivers\etc
192.168.1.18  registry.k8s.com

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_k8s_05


如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_如何从k8s拉取镜像文件_06

2.4 配置Docker客户端

  • 特别说明:任何要访问Harbor私有镜像仓库的Docker客户端,无论是属于K8S集群中的节点,还是不属于K8S集群中的节点,都需要在Docker客户端中配置docker的仓库地址为Harbor私有镜像仓库的地址。由于本文要在K8S集群中使用Harbor私有镜像仓库,因此,需要在K8S集群中的所有master节点和worker节点中完成下述配置。
  • 设置docker仓库:在K8S集群的所有节点的docker配置文件(该配置文件为 /etc/docker/deamon.json)中添加以下内容,添加后的效果如下图所示。
"insecure-registries": ["registry.k8s.com"]

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_07

  • 重启docker:修改了docker配置文件之后,需要重启 docker服务才能应用修改后的配置,执行以下命令即可重启docker服务。
systemctl restart docker
  • 配置域名映射:由于本文的K8S集群中没有DNS域名映射服务器,所以本文的K8S集群中的节点无法解析域名 registry.k8s.com,所以需要在K8S集群的所有节点的域名映射文件中添加以下域名映射(本文中的Harbor私有镜像仓库所在的虚拟机的ip地址为 192.168.1.18),该域名映射文件为 /etc/hosts,添加后的效果如下图所示。
192.168.1.18   registry.k8s.com

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_08

3 测试

3.1 创建Harbor项目

  • 项目说明:在Harbor的管理页面中可以看到,Harbor的项目是分为私有和公共的两种类型,而公共类型的项目是无法被K8S集群使用,所以需要先在Harbor的管理页面中创建一个私有的项目,以被本文中的K8S集群使用。
  • 创建私有项目:在Harbor管理页面中的 “项目” 页面中点击 “创建项目” 按钮,然后创建一个名称为 “k8s” 的私有镜像仓库,创建成功之后,进入名称为 “k8s” 的项目,可以看到创建的是一个空的镜像仓库,结果如下图所示。

3.2 上传镜像到Harbor

  • 特别说明:K8S集群要想使用Harbor私有镜像仓库中的镜像来部署服务,就需要Harbor私有镜像仓库中有镜像,我们可以通过使用Docker客户端来把本地的镜像推送到Harbor私有镜像仓库中,而Docker客户端必须要先登录到Harbor私有镜像仓库,才能把本地的镜像推送到Harobr私有镜像仓库中,以及从Harbor私有镜像仓库中拉取镜像到本地。

3.2.1 登录Harbor

  • 登录harbor:本文中以K8S集群中的k8s-worker-1节点作为Docker客户端来登录Harobr私有镜像仓库,实际上不要求Docker客户端所在节点必须是K8S集群中的节点。在Docker客户端所在的节点中执行以下命令即可登录到Harbor镜像仓库了,登录的用户名和密码为在 harbor.yml中配置的登录名(admin)和密码(Harbor12345),如果登录结果如下图所示则表示登录成功。
docker login registry.k8s.com

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_如何从k8s拉取镜像文件_09

3.2.2 推送Docker镜像

  • 推送本地镜像:在Docker客户端中要把本地的名称为 busybox:latest 的镜像推送到Harbor私有镜像仓库的名称中 k8s 的项目中,需要先在Docker客户端本地给镜像打标签,然后再把打好标签的镜像推送到Harbor私有镜像仓库中,执行命令和结果如下所示:
# 打标签
docker tag busybox:latest registry.k8s.com/k8s/busybox:latest

# 推送镜像
docker push registry.k8s.com/k8s/busybox:latest

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_10

  • 查看Harbor仓库:镜像推送完成之后,即可在Harbor的管理页面中查看镜像仓库,结果如下图所示。

3.2.3 拉取Docker镜像

  • 拉取镜像:在Docker客户端中要把Harbor私有镜像仓库中名称为 k8s 项目中的名称为 busybox:latest 的镜像拉取到本地,需要执行以下命令,执行命令和结果如下所示:
# 拉取镜像
docker pull registry.k8s.com/k8s/busybox:latest

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_11

3.3 部署K8S服务

  • 特别说明:在3.2节中介绍了如何使用Docker客户端登录Harbor私有镜像仓库,以及把本地的镜像推送到Harbor私有镜像仓库中,Harbor私有镜像仓库中有了镜像之后,K8S集群就可能使用Harbor私有镜像仓库中的镜像来部署K8S服务应用了。K8S集群在使用Harbor私有镜像仓库中的镜像来部署K8S服务时,需要在部署服务的yml文件中指定K8S集群到Harbor私有镜像仓库中拉取镜像的账号和密码等登录信息。下面分别介绍在yml中不添加登录信息导致镜像拉取失败的情况和添加登录信息才能镜像拉取成功的情况。

3.3.1 不添加登录信息的情况

  • 创建yml文件:在K8S集群的master节点的某个目录中创建一个名称为 test-harbor.yml 的文件,该文件中使用了在3.2节中上传到Harbor私有镜像仓库中的registry.k8s.com/k8s/busybox:latest镜像来创建一个名称为 test-harbor-pod 的Pod,但是在该文件中并没有添加K8S集群到Harbor私有镜像仓库中拉取该镜像的账号和密码等登录信息,内容如下。
apiVersion: v1
kind: Pod
metadata:
  name: test-harbor-pod
spec:
  containers:
    - name: busybox
      image: registry.k8s.com/k8s/busybox:latest
      command: [ "/bin/sh", "-c", "echo hello world" ]
  restartPolicy: Never
  • 部署yml:在K8S集群的master节点中执行以下命令以使用上面的yml文件来创建Pod。
kubectl apply -f test-harbor.yml

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_k8s_12

  • 查看部署情况:在K8S集群的master节点中执行以下命令以查看部署情况,结果如下图所示,可见K8S集群拉取镜像失败了,所以创建的名称为test-harbor-pod的Pod的状态为ImagePullBackOff。
kubectl get pods

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_harbor_13

  • 查看运行日志:在K8S集群的master节点中执行以下命令以查看该Pod的运行日志如下,从运行日志中可以查看K8S集群拉取镜像失败的原因。
kubectl logs -f test-harbor-pod

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_kubernates_14

3.3.2 添加登录信息的情况

  • 创建secret:K8S集群需要通过 docker-registry 类型的 secret 来设置拉取镜像的用户名和密码等登录信息,本文件中部署的Harbor私有镜像仓库的域名为 registry.k8s.com,登录名为 admin, 登录密码为 Harbor12345,在K8S集群的master节点中执行以下命令以使用上述登录信息创建一个名称为k8s-auth的secret,执行结果如下图所示。
kubectl create secret docker-registry k8s-auth \
--docker-server=registry.k8s.com \
--docker-username=admin \
--docker-password=Harbor12345

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_私有镜像仓库_15

  • 创建yml文件:在K8S集群的master节点的某个目录中创建一个名称为 test-harbor-2.yml 的文件,该文件中使用了在3.2节中上传到Harbor私有镜像仓库中的registry.k8s.com/k8s/busybox:latest镜像来创建一个名称为 test-harbor-pod-2 的Pod,但是在该文件中指定了K8S集群使用上述创建的名称为k8s-auth的secret登录信息到Harbor私有镜像仓库中拉取该镜像,内容如下。
apiVersion: v1
kind: Pod
metadata:
  name: test-harbor-pod-2
spec:
  containers:
    - name: busybox
      image: registry.k8s.com/k8s/busybox:latest
      command: [ "/bin/sh", "-c", "echo hello world" ]
  imagePullSecrets:
    - name: k8s-auth
  restartPolicy: Never
  • 部署yml:在K8S集群的master节点中执行以下命令以使用上面的yml文件来创建Pod。
kubectl apply -f test-harbor-2.yml

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_私有镜像仓库_16

  • 查看部署情况:在K8S集群的master节点中执行以下命令以查看部署情况,结果如下图所示,可见K8S集群创建的名称为test-harbor-pod-2的Pod成功创建成功了,且已经运行结束了。
kubectl get pods

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_如何从k8s拉取镜像文件_17

  • 查看运行日志:在K8S集群的master节点中执行以下命令以查看该Pod的运行日志如下,从运行日志中可以看出该Pod在运行时成功的打印出了 hello world 这一句话。
kubectl logs -f test-harbor-pod-2

如何从k8s拉取镜像文件 k8s拉取harbor私有镜像_k8s_18

3.4 测试总结

  • 总结:前面的测试结果表明,Harbor私有镜像仓库安装成功之后,在K8S集群中的master节点和worker节点中配置了Harbor私有镜像仓库之后,就可以通过Docker客户端登录到Harbor私有镜像仓库,并将本地的镜像上传到Harbor私有镜像仓库,然后K8S集群就可以使用Harbor私有镜像仓库中的镜像来部署K8S服务了。