Harbor鏡像倉庫(含clair鏡像掃描) - 完整部署記錄


 

 Harbor環境部署的要求:系統版本在Centos7.5以上、內核版本在4.4X以上、ip_forward路由轉發功能要打開。

一、環境准備

[root@k8s-harbor01 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
 
[root@k8s-harbor01 ~]# uname -r
4.4.232-1.el7.elrepo.x86_64
 
[root@k8s-harbor01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@k8s-harbor01 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@k8s-harbor01 ~]# sysctl -p
 
[root@k8s-harbor01 ~]# systemctl stop firewalld && systemctl disable firewalld && firewall-cmd --state
 
[root@k8s-harbor01 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@k8s-harbor01 ~]# getenforce
Disabled
 
[root@k8s-harbor01 ~]# python --version
Python 2.7.5

  

二、安裝Docker

提前下載二進制安裝包docker-18.09.6.tgz到/usr/local/src路徑下,解壓安裝
[root@k8s-harbor01 ~]# cd /usr/local/src/
[root@k8s-harbor01 src]# ll docker-18.09.6.tgz
-rw-r--r-- 1 root root 48047231 Oct 19  2019 docker-18.09.6.tgz
[root@k8s-harbor01 src]# tar -zvxf docker-18.09.6.tgz
 
[root@k8s-harbor01 src]# cp docker/* /usr/local/bin/
[root@k8s-harbor01 src]# chmod 755 /usr/local/bin/*
 
/usr/local/bin默認已經加到系統環境變量中
[root@k8s-harbor01 src]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
 
編輯docker啟動文件
注意"WorkingDirectory"路徑要和/etc/docker/daemon.json文件中的data-root、exec-root路徑一致
[root@k8s-harbor01 src]# cat > /etc/systemd/system/docker.service << EOF
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.io
 
[Service]
WorkingDirectory=/data/docker
Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/local/bin/dockerd
ExecReload=/bin/kill -s HUP
Restart=on-failure
RestartSec=5
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
Delegate=yes
KillMode=process
 
[Install]
WantedBy=multi-user.target
 
EOF
 
授執行權限
[root@k8s-harbor01 src]# chmod 755 /etc/systemd/system/docker.service
 
編輯docker 配置文件
編輯docker 配置文件
[root@k8s-harbor01 src]# mkdir -p /etc/docker && mkdir -p /data/docker/data && mkdir -p /data/docker/exec
[root@k8s-harbor01 src]# cat > /etc/docker/daemon.json << EOF
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"],
    "insecure-registries": ["docker02:35000"],
    "max-concurrent-downloads": 20,
    "live-restore": true,
    "max-concurrent-uploads": 10,
    "debug": true,
    "data-root": "/data/docker/data",
    "exec-root": "/data/docker/exec",
    "log-opts": {
      "max-size": "100m",
      "max-file": "5"
    }
}
 
EOF
 
啟動 docker 服務
[root@k8s-harbor01 src]# systemctl daemon-reload && systemctl enable docker && systemctl restart docker
[root@k8s-harbor01 src]# systemctl status docker|grep Active
   Active: active (running) since Wed 2020-08-12 13:41:07 CST; 28s ago
 
查看 Docker 版本號
[root@k8s-harbor01 src]# docker --version
Docker version 18.09.6, build 481bc77

  

三、安裝Docker-Compose

下載docker-compose二進制執行文件
百度網盤下載地址:https://pan.baidu.com/s/1er0rM0vxEubYOLHx7LI62A
提取密碼:eer9
[root@k8s-harbor01 ~]# cd /usr/local/src/
[root@k8s-harbor01 src]# curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@k8s-harbor01 src]# cp docker-compose /usr/local/bin/
[root@k8s-harbor01 src]# chmod 755 /usr/local/bin/*
 
查看 docker-compose 版本號
[root@k8s-harbor01 ~]# docker-compose --version
docker-compose version 1.26.0, build d4451659

  

四、部署Harbor鏡像倉庫

1)HTTPS證書自簽
如果線上環境有已購買好的HTTPS證書可以直接拿過來用,如果沒有,就在Harbor本機進行HTTPS證書自簽。這里Harbor本機ip地址是172.16.60.238

生成CA證書私鑰
[root@k8s-harbor01 ~]# openssl genrsa -out ca.key 4096
 
生成CA證書
[root@k8s-harbor01 ~]# openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=172.16.60.238" \
 -key ca.key \
 -out ca.crt
 
生成服務器證書
1)生成私鑰
[root@k8s-harbor01 ~]# openssl genrsa -out 172.16.60.238.key 4096
 
2)生成證書簽名請求(CSR)
[root@k8s-harbor01 ~]# openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=172.16.60.238" \
    -key 172.16.60.238.key \
    -out 172.16.60.238.csr
 
3)生成一個x509 v3擴展文件(兩種方式根據情況二選一)
####################################################################################
第一種方式:域名
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
 
[alt_names]
DNS.1=172.16.60.238
DNS.2=yourdomain
DNS.3=hostname
EOF
####################################################################################
第二種方式:IP
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:172.16.60.238
EOF
####################################################################################
 
這里選擇第二種的IP方式
[root@k8s-harbor01 ~]# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = IP:172.16.60.238
EOF
 
4)使用該v3.ext文件為您的Harbor主機生成證書
[root@k8s-harbor01 ~]# openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in 172.16.60.238.csr \
    -out 172.16.60.238.crt

  

2)提供證書給Harbor和Docker

1)將服務器證書和密鑰復制到Harbor主機上的certficates文件夾中
根據自己實際環境需求創建Harbor的certficates文件夾
[root@k8s-harbor01 ~]# mkdir -p /data/cert/
[root@k8s-harbor01 ~]# cp 172.16.60.238.crt /data/cert/
[root@k8s-harbor01 ~]# cp 172.16.60.238.key /data/cert/
 
2)轉換 172.16.60.238.crt 為172.16.60.238.cert,供Docker使用。
Docker守護程序將.crt文件解釋為CA證書,並將.cert文件解釋為客戶端證書。
[root@k8s-harbor01 ~]# openssl x509 -inform PEM -in 172.16.60.238.crt -out 172.16.60.238.cert
 
3)將服務器證書,密鑰和CA文件復制到Harbor主機上的Docker certificate文件夾中。
記住必須首先創建適當的文件夾
[root@k8s-harbor01 ~]# mkdir -p /etc/docker/certs.d/172.16.60.238/
[root@k8s-harbor01 ~]# cp 172.16.60.238.cert /etc/docker/certs.d/172.16.60.238/
[root@k8s-harbor01 ~]# cp 172.16.60.238.key /etc/docker/certs.d/172.16.60.238/
[root@k8s-harbor01 ~]# cp ca.crt /etc/docker/certs.d/172.16.60.238/
 
4)重新啟動Docker
[root@k8s-harbor01 ~]# systemctl restart docker
[root@k8s-harbor01 ~]# systemctl status docker
 
5)將名為"ca.crt"的CA證書下載到本地電腦,然后安裝證書。
這樣就可以在本地電腦的瀏覽器里正常訪問https地址的Harbor了(證書可被信任)

  

3)安裝Harbor
到 Harbor的GitHub倉庫的Release頁面 , 下載最新的在線安裝包

這里下載Harbor V2.0.2版本的安裝包
[root@k8s-harbor01 ~]# cd /usr/local/src/
[root@k8s-harbor01 src]# wget https://github.com/goharbor/harbor/releases/download/v2.0.2/harbor-online-installer-v2.0.2.tgz
[root@k8s-harbor01 src]# tar -zvxf harbor-online-installer-v2.0.2.tgz
[root@k8s-harbor01 src]# mv harbor /opt/
 
修改harbor配置信息
[root@k8s-harbor01 src]# cd /opt/harbor/
[root@k8s-harbor01 harbor]# cp harbor.yml.tmpl harbor.yml
.........
........
hostname: 172.16.60.238
 
# http related config
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 80
 
# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /data/cert/172.16.60.238.crt
  private_key: /data/cert/172.16.60.238.key
........
........
harbor_admin_password: Harbor@123456
........
........
data_volume: /data
 
 
運行install.sh, 注意運行時加上--with-clair 選項,啟動clair鏡像掃描功能
[root@k8s-harbor01 harbor]# ./install.sh --with-clair
........
........
✔ ----Harbor has been installed and started successfully.----
 
出現上面的信息,說明Harbor已經安裝完成了。
 
查看harbor啟動情況。
docker-compose 命令必須要在harbor安裝目錄 (這里就是/opt/harbor)路徑下才能執行。
[root@k8s-harbor01 harbor]# docker-compose ps
      Name                     Command                  State                          Ports
---------------------------------------------------------------------------------------------------------------
clair               ./docker-entrypoint.sh           Up (healthy)   6060/tcp, 6061/tcp
clair-adapter       /home/clair-adapter/entryp ...   Up (healthy)   8080/tcp
harbor-core         /harbor/entrypoint.sh            Up (healthy)
harbor-db           /docker-entrypoint.sh            Up (healthy)   5432/tcp
harbor-jobservice   /harbor/entrypoint.sh            Up (healthy)
harbor-log          /bin/sh -c /usr/local/bin/ ...   Up (healthy)   127.0.0.1:1514->10514/tcp
harbor-portal       nginx -g daemon off;             Up (healthy)   8080/tcp
nginx               nginx -g daemon off;             Up (healthy)   0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp
redis               redis-server /etc/redis.conf     Up (healthy)   6379/tcp
registry            /home/harbor/entrypoint.sh       Up (healthy)   5000/tcp
registryctl         /home/harbor/start.sh            Up (healthy)
 
查看harbor鏡像
[root@k8s-harbor01 ~]# docker images
REPOSITORY                      TAG                 IMAGE ID            CREATED             SIZE
goharbor/redis-photon           v2.0.2              e547529bb6a1        3 weeks ago         72.3MB
goharbor/clair-adapter-photon   v2.0.2              9ec8853dc3cb        3 weeks ago         62MB
goharbor/clair-photon           v2.0.2              73885002dda7        3 weeks ago         171MB
goharbor/harbor-registryctl     v2.0.2              9f8b7bb0f1ff        3 weeks ago         101MB
goharbor/registry-photon        v2.0.2              eac8c5fc9ca8        3 weeks ago         83.6MB
goharbor/nginx-photon           v2.0.2              eee4771b916c        3 weeks ago         43.6MB
goharbor/harbor-log             v2.0.2              b2db762a6c3a        3 weeks ago         82.1MB
goharbor/harbor-jobservice      v2.0.2              3960e027ccb9        3 weeks ago         164MB
goharbor/harbor-core            v2.0.2              de2495b944cf        3 weeks ago         145MB
goharbor/harbor-portal          v2.0.2              90088a0e64a9        3 weeks ago         52.5MB
goharbor/harbor-db              v2.0.2              81e98a7af097        3 weeks ago         161MB
goharbor/prepare                v2.0.2              7e804db05454        3 weeks ago         160MB
 
確保harbpr啟動后的80和443端口都起來了
[root@k8s-harbor01 harbor]# lsof -i:80
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 3095 root    4u  IPv6  26027      0t0  TCP *:http (LISTEN)
[root@k8s-harbor01 harbor]# lsof -i:443
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 3082 root    4u  IPv6  26015      0t0  TCP *:https (LISTEN)
 
到這里就可以訪問harbor了,訪問地址為:https://172.16.60.238
用戶名為admin,密碼為配置文件中定義的"Harbor@123456"

查看clair鏡像掃描器

 

Habor 服務啟停
注意:如果harbor.yml配置修改了,要先執行"./prepare"命令進行配置載入,然后再重啟harbor服務。

查看Habror
docker-compose ps
 
啟動Harbor
docker-compose start
 
停止Harbor
docker-compose stop
 
重啟Harbor
docker-compose restart
 
另外:
Harbor還可以通過down和up命令去停止和啟動,
只不過這種方式是刪除、創建的關停和啟動。
docker-compose down -v
docker-compose up -d

  

五、客戶端登錄Harbor

在Habror客戶端機器(如k8s的node節點、harbor節點)配置登錄:
 
默認情況下,在客戶端登錄Habor是會報錯的:
[root@k8s-node01 ~]# docker login 172.16.60.238
Authenticating with existing credentials...
Login did not succeed, error: Error response from daemon: Get https://172.16.60.238/v2/: x509: certificate signed by unknown authority
 
原因: 客戶端登錄Harbor,https證書不被信任。
 
解決辦法:下面兩種方法選其一
1)方法一
將Harbor服務器證書,密鑰和CA文件復制到Harbor客戶主機上的Docker certificate文件夾中
[root@k8s-node01 ~]# mkdir -p /etc/docker/certs.d/172.16.60.238/
[root@k8s-node01 ~]# cd /etc/docker/certs.d/172.16.60.238/
[root@k8s-node01 172.16.60.238]# rsync -e "ssh -p22" -avpgolr 172.16.60.238:/etc/docker/certs.d/172.16.60.238/* ./
[root@k8s-node01 172.16.60.238]# ll
total 12
-rw-r--r-- 1 root root 2053 Aug 19 14:34 172.16.60.238.cert
-rw-r--r-- 1 root root 3243 Aug 19 14:34 172.16.60.238.key
-rw-r--r-- 1 root root 2033 Aug 19 14:34 ca.crt
 
重啟docker服務
[root@k8s-node01 172.16.60.238]# systemctl restart docker
[root@k8s-node01 172.16.60.238]# systemctl status docker
 
再次驗證登錄harbor
[root@k8s-node01 172.16.60.238]# docker login 172.16.60.238
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
Login Succeeded
 
2)方法二
配置docker服務的daemon.json文件,添加"insecure-registries"參數,表示忽略ssl證書認證。
[root@k8s-node01 ~]# vim /etc/docker/daemon.json
........
    "insecure-registries": ["https://172.16.60.238"],
 
重啟docker服務
[root@k8s-node01 ~]# systemctl restart docker
[root@k8s-node01 ~]# systemctl status docker
 
再次驗證登錄harbor
[root@k8s-node01 ~]# docker login 172.16.60.238
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
Login Succeeded
 
========================================================================
另外,注意客戶端機器登錄Harbor時,只要首次登錄需要輸入用戶名和密碼。
登錄成功后的信息默認保存到/root/.docker/config.json文件里。
下次登錄時就不用再輸入harbor用戶名和密碼了,直接讀取config.json文件內容
[root@k8s-node01 ~]# cat /root/.docker/config.json
{
        "auths": {
                "172.16.60.238": {
                        "auth": "YWRtaW46SGFyYm9yQDEyMzQ1Ng=="
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/18.09.6 (linux)"
        }
 
 
[root@k8s-node01 ~]# docker login 172.16.60.238
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
 
Login Succeeded

  

六、Harbor鏡像掃描

選中鏡像,進行漏洞掃描

如果掃描出漏洞,在漏洞報告了會告知漏洞當前版本和修復版本,按照修復版本修復即可。

 

修復方法:
可以依據當前基礎鏡像做Dockerfile,使用"yum update -y 漏洞所屬軟件名" 進行升級操作,然后再重新做一個基礎鏡像。

1) 編譯Dockerfile
升級原來centos7.7基礎鏡像里報出來漏洞的軟件
[root@k8s-harbor01 ~]# cat Dockerfile
FROM 172.16.60.238/kevin/centos7.7:latest
RUN yum update -y sqlite \
&& yum update -y nss-util \
&& yum update -y nss-sysinit \
&& yum update -y dbus-libs \
&& yum update -y bind-license \
&& yum update -y nss \
&& yum update -y nss-softokn \
&& yum update -y dbus \
&& yum update -y nss-softokn-freebl \
&& yum update -y nss-tools \
&& yum update -y bash \
&& yum update -y python-libs \
&& yum update -y python \
&& yum update -y bind-license \
&& yum update -y expat \
&& yum update -y libxml2-python \
&& yum update -y libxml2 \
&& yum update -y shared-mime-info \
&& yum update -y libcurl \
&& yum update -y file-libs \
&& yum update -y curl
 
2)制作新的基礎鏡像
[root@k8s-harbor01 ~]# docker build -t 172.16.60.238/kevin/centos7.7:updatev1 .
 
3)上傳到Harbor倉庫
[root@k8s-harbor01 ~]# docker push 172.16.60.238/kevin/centos7.7:updatev1

將修復好漏洞的新基礎鏡像上傳到Harbor倉庫,再掃描新鏡像,發現漏洞已修復。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM