1. 程式人生 > >kubernetes叢集搭建harbor倉庫,單機搭建harbor以及docker registry倉庫搭建,內附踩坑細節

kubernetes叢集搭建harbor倉庫,單機搭建harbor以及docker registry倉庫搭建,內附踩坑細節

Kubnernetes叢集搭建(Harbor)私服倉庫

搭建Kubernetes叢集倉庫之前最好先從Docker私服倉庫循序漸進開始。本文件會從Docker私服安裝開始一步一步走向叢集私服倉庫(Harbor)搭建。

1.Docker私服倉庫搭建

Docker提供了Docker-registry用於搭建私服倉庫,Docker-registry是基於Python的開源專案,既可以執行在真正的主機上,也可以執行在docker容器中,docker官方已經提供了Docker-registry映象。我們將介紹這兩種搭建方式。

注意:作業系統是基於centos7進行講解。

1.基於容器方式搭建

安裝docker-ce

yum install docker-ce進行安裝,不再進行講解。

下載倉庫映象

docker pull registry通過docker將倉庫下載下來。

啟動倉庫映象

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 注意前面的埠對映,因為映象倉庫會將上傳的映象存放在容器的/tmp/registry裡面,如果容器一旦被刪除,相關映象會被刪除,所以需要將容器中的位置掛載到宿主機上面,通過-v引數 -v /opt/data/registry:/tmp/registry ,可以將映象路徑對映到宿主機/opt/data/registry裡面,這樣刪除了容器,但是上傳的映象任然存在。

修改docker配置檔案

因為Docker從1.3.X之後,與docker registry互動預設使用的是https,然而此處搭建的私有倉庫只提供http服務,所以當與私有倉庫互動時就會報上面的錯誤。為了解決這個問題需要在啟動docker server時增加啟動引數為預設使用http訪問。修改docker啟動配置檔案:

vim  /usr/lib/systemd/system/docker.service 

找到 ExecStart

ExecStart=/usr/bin/dockerd  --insecure-registry 192.168.0.153:5000

新增--insecure-registry 10.0.81.36:5000,

注意將ip地址修改成自己的。然後重啟docker。

測試

可以隨便下載一個映象,docker pull mysql,將下載下來的映象進行修改一下,例如:docker tag mysql localhots:mysql,將mysql映象修改成localhost:mysql映象。docker push localhost:mysql將自己的映象進行上傳。然後將映象刪除,通過docker pull 映象名稱,如果能下載下來,代表私服建立成功。curl http:// 10.0.81.36:5000/v2/_catalog

2.基於宿主機方式搭建倉庫

安裝依賴庫

安裝下面外掛:

yum install -y python-devel;

yum install -y libevent-devel;

yum install -y python-pip;特別注意,現在這種方式已經無法安裝,安裝步驟如下:

安裝步驟:
第一步:下載tar包
wget --no-check-certificate  https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
第二步:解壓tar包
tar -zxvf pip-8.0.2.tar.gz
第三步:進入安裝檔案
cd pip-8.0.2
第四步:安裝
python setup.py build
第五步:安裝
python setup.py install
如果沒有意外的話,pip安裝完成,如果出了意外我他媽也不知道,自己百度。老子java程式設計師,不是python程式設計師,反正我一步安裝成功。

yum install -y gcc;

yum install -y xz-devel;

安裝Python相關的模組

安裝必要工具 yum-utils ,它的功能是管理repository及擴充套件包的工具 (主要是針對repository)

$ sudo yum install yum-utils

使用yum-builddep為Python3構建環境,安裝缺失的軟體依賴,使用下面的命令會自動處理.

$ sudo yum-builddep python

完成後下載Python3的原始碼包(筆者以Python3.5為例),Python原始碼包目錄: https://www.python.org/ftp/python/ ,截至發博當日Python3的最新版本為 3.7.0

$ curl -O https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz

最後一步,編譯安裝Python3,預設的安裝目錄是 /usr/local 如果你要改成其他目錄可以在編譯(make)前使用 configure 命令後面追加引數 “–prefix=/alternative/path” 來完成修改。

$ tar xf Python-3.5.0.tgz
$ cd Python-3.5.0
$ ./configure
$ make
$ sudo make install

至此你已經在你的CentOS系統中成功安裝了python3、pip3、setuptools,檢視python版本

$ python3 -V

如果你要使用Python3作為python的預設版本,你需要修改一下 bashrc 檔案,增加一行alias引數

alias python='/usr/local/bin/python3.5'

由於CentOS 7建議不要動/etc/bashrc檔案,而是把使用者自定義的配置放入/etc/profile.d/目錄中,具體方法為

vi /etc/profile.d/python.sh

輸入alias引數 alias python=’/usr/local/bin/python3.5’,儲存退出

如果非root使用者建立的檔案需要注意設定許可權

chmod 755 /etc/profile.d/python.sh

重啟會話使配置生效

source /etc/profile.d/python.sh

安裝docker-registry

docker-registry安裝有兩種方式:一種直接通過python3 -m pip install docker-registry安裝,一種使用原始碼安裝;這邊直接通過第一種方式進行安裝了。

python3 -m install docker-registry

2.Docker搭建harbor 私有倉庫

Docker容器應用的開發和執行離不開可靠的映象管理,雖然Docker官方也提供了公共的映象倉庫,但是從安全和效率等方面考慮,部署我們私有環境內的Registry也是非常必要的。Harbor是由VMware公司開源的企業級的Docker Registry管理專案,它包括許可權管理(RBAC)、LDAP、日誌稽核、管理介面、自我註冊、映象複製和中文支援等功能。

本次演示環境,我是在虛擬機器Linux Centos7上操作,以下是安裝的軟體及版本:

  1. Docker:version 18.06

  2. Docker-compose: version 1.22

  3. Harbor: version 1.5.2

注意:Harbor的所有服務元件都是在Docker中部署的,所以官方安裝使用Docker-compose快速部署,所以我們需要安裝Docker、Docker-compose。由於Harbor是基於Docker Registry V2版本,所以就要求Docker版本不小於1.10.0,Docker-compose版本不小於1.6.0。

安裝docker

安裝docker-compose

安裝docker-compose 有兩種方式,一種通過python pip安裝,一種直接下載二進位制進行安裝,本章以二進位制安裝展開。

將下載的檔案重新命名為docker-compose,放在/usr/local/bin目錄下面,在檔案進行賦權,

chmod +x /usr/local/bin/docker-compose

測試下docker-compose是否安裝成功 docker-compose --version

docker-compose version 1.22.0, build 1719ceb

總步驟:
1、下載指定版本的docker-compose
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
2、對二進位制檔案賦可執行許可權
    $ sudo chmod +x /usr/local/bin/docker-compose
3、測試下docker-compose是否安裝成功
    $ docker-compose --version
    docker-compose version 1.13.0, build 1719ceb

Harbor 服務搭建

下載Harbor二進位制,可從github上直接下載,或者線上下載安裝包。

Harbor提供兩部分:一部分是離線包,一部分是線上包,選擇下載一個。

下載安裝包

1、線上安裝包
    $ wget https://github.com/vmware/harbor/releases/download/v1.5.2/harbor-online-installer-v1.5.2.tgz
    $ tar xvf harbor-online-installer-v1.5.2.tgz
2、離線安裝包
    $ wget https://github.com/vmware/harbor/releases/download/v1.5.2/harbor-offline-installer-v1.5.2.tgz
    $ tar xvf harbor-offline-installer-v1.5.2.tgz

修改配置檔案

解壓縮之後,目錄下回生成harbor.cfg檔案,該檔案就是Harbor的配置檔案。

## Configuration file of Harbor
​
#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version = 1.5.0
#The IP address or hostname to access admin UI and registry service.
#DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname = 10.0.81.36
​
#The protocol for accessing the UI and token/notification service, by default it is http.
#It can be set to https if ssl is enabled on nginx.
ui_url_protocol = http
​
#Maximum number of job workers in job service  
max_job_workers = 50 
​
#Determine whether or not to generate certificate for the registry's token.
#If the value is on, the prepare script creates new root cert and private key 
#for generating token to access the registry. If the value is off the default key/cert will be used.
#This flag also controls the creation of the notary signer's cert.
customize_crt = on
​
#The path of cert and key files for nginx, they are applied only the protocol is set to https
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
​
#The path of secretkey storage
secretkey_path = /data
​
#Admiral's url, comment this attribute, or set its value to NA when Harbor is standalone
admiral_url = NA
​
#Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
log_rotate_count = 50
#Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes. 
#If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G 
#are all valid.
log_rotate_size = 200M
​
#Config http proxy for Clair, e.g. http://my.proxy.com:3128
#Clair doesn't need to connect to harbor ui container via http proxy.
http_proxy =
https_proxy =
no_proxy = 127.0.0.1,localhost,ui
​
#NOTES: The properties between BEGIN INITIAL PROPERTIES and END INITIAL PROPERTIES
#only take effect in the first boot, the subsequent changes of these properties 
#should be performed on web ui
​
#************************BEGIN INITIAL PROPERTIES************************
​
#Email account settings for sending out password resetting emails.
​
#Email server uses the given username and password to authenticate on TLS connections to host and act as identity.
#Identity left blank to act as username.
email_identity = 
​
email_server = smtp.mydomain.com
email_server_port = 25
email_username = [email protected]
email_password = abc
email_from = admin <[email protected]>
email_ssl = false
email_insecure = false
​
##The initial password of Harbor admin, only works for the first time when Harbor starts. 
#It has no effect after the first launch of Harbor.
#Change the admin password from UI after launching Harbor.
harbor_admin_password = Harbor12345
​
##By default the auth mode is db_auth, i.e. the credentials are stored in a local database.
#Set it to ldap_auth if you want to verify a user's credentials against an LDAP server.
auth_mode = db_auth
​
#The url for an ldap endpoint.
ldap_url = ldaps://ldap.mydomain.com
​
#A user's DN who has the permission to search the LDAP/AD server. 
#If your LDAP/AD server does not support anonymous search, you should configure this DN and ldap_search_pwd.
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
​
#the password of the ldap_searchdn
#ldap_search_pwd = password
​
#The base DN from which to look up a user in LDAP/AD
ldap_basedn = ou=people,dc=mydomain,dc=com
​
#Search filter for LDAP/AD, make sure the syntax of the filter is correct.
#ldap_filter = (objectClass=person)
​
# The attribute used in a search to match a user, it could be uid, cn, email, sAMAccountName or other attributes depending on your LDAP/AD  
ldap_uid = uid 
​
#the scope to search for users, 0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE
ldap_scope = 2 
​
#Timeout (in seconds)  when connecting to an LDAP Server. The default value (and most reasonable) is 5 seconds.
ldap_timeout = 5
​
#Verify certificate from LDAP server
ldap_verify_cert = true
​
#The base dn from which to lookup a group in LDAP/AD
ldap_group_basedn = ou=group,dc=mydomain,dc=com
​
#filter to search LDAP/AD group
ldap_group_filter = objectclass=group
​
#The attribute used to name a LDAP/AD group, it could be cn, name
ldap_group_gid = cn
​
#The scope to search for ldap groups. 0-LDAP_SCOPE_BASE, 1-LDAP_SCOPE_ONELEVEL, 2-LDAP_SCOPE_SUBTREE
ldap_group_scope = 2
​
#Turn on or off the self-registration feature
self_registration = on
​
#The expiration time (in minute) of token created by token service, default is 30 minutes
token_expiration = 30
​
#The flag to control what users have permission to create projects
#The default value "everyone" allows everyone to creates a project. 
#Set to "adminonly" so that only admin user can create project.
project_creation_restriction = everyone
​
#************************END INITIAL PROPERTIES************************
​
#######Harbor DB configuration section#######
​
#The address of the Harbor database. Only need to change when using external db.
db_host = mysql
​
#The password for the root user of Harbor DB. Change this before any production use.
db_password = root123
​
#The port of Harbor database host
db_port = 3306
​
#The user name of Harbor database
db_user = root
​
##### End of Harbor DB configuration#######
​
#The redis server address. Only needed in HA installation.
#address:port[,weight,password,db_index]
redis_url = redis:6379
​
##########Clair DB configuration############
​
#Clair DB host address. Only change it when using an exteral DB.
clair_db_host = postgres
​
#The password of the Clair's postgres database. Only effective when Harbor is deployed with Clair.
#Please update it before deployment. Subsequent update will cause Clair's API server and Harbor unable to access Clair's database.
clair_db_password = password
​
#Clair DB connect port
clair_db_port = 5432
​
#Clair DB username
clair_db_username = postgres
​
#Clair default database
clair_db = postgres
​
##########End of Clair DB configuration############
​
#The following attributes only need to be set when auth mode is uaa_auth
uaa_endpoint = uaa.mydomain.org
uaa_clientid = id
uaa_clientsecret = secret
uaa_verify_cert = true
uaa_ca_cert = /path/to/ca.pem
​
​
### Docker Registry setting ###
#registry_storage_provider can be: filesystem, s3, gcs, azure, etc.
registry_storage_provider_name = filesystem
#registry_storage_provider_config is a comma separated "key: value" pairs, e.g. "key1: value, key2: value2".
#Refer to https://docs.docker.com/registry/configuration/#storage for all available configuration.
registry_storage_provider_config =
​
#If reload_config=true, all settings which present in harbor.cfg take effect after prepare and restart harbor, it overwrites exsiting settings.
#reload_config=true
#Regular expression to match skipped environment variables
#skip_reload_env_pattern=(^EMAIL.*)|(^LDAP.*)

需要注意:配置檔案中hostname設定訪問地址,可以使用ip、域名,不可以設定為127.0.0.1或localhost。

docker.service中增加 --insecure-registry rgs.unixfbi.com 即可。重啟docker:

# systemctl daemon-reload
# systemctl  restart docker

或者

建立/etc/docker/daemon.json檔案,在檔案中指定倉庫地址
# cat > /etc/docker/daemon.json << EOF
{ "insecure-registries":["rgs.unixfbi.com"] }
EOF
然後重啟docker就可以。
​
# systemctl  restart docker

啟動Harbor

修改完配置檔案後,在的當前目錄執行./install.sh。Harbor服務就會根據當期目錄下的docker-compose.yml開始下載依賴的映象,檢測並按照順序依次啟動各個服務,Harbor依賴的映象及啟動服務如下:

執行harbor安裝:

$ cd /harbor
$ ./install.sh

install.sh包含四步:

  • loading Harbor images

  • preparing environment

  • checking existing instance of Harbor

  • starting Harbor 完成安裝後提示:

✔ ----Harbor has been installed and started successfully.----1

通過docker ps 命令可以檢視容器資訊,通過docker-compose ps 可以檢視編排資訊:

$ sudo docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                              NAMES
3095a5bb81e4        vmware/harbor-jobservice:v1.2.0    "/harbor/harbor_jobse"   13 hours ago        Up 13 hours                                                                            harbor-jobservice
ef7f8400663e        vmware/nginx-photon:1.11.13        "nginx -g 'daemon off"   13 hours ago        Up 13 hours         0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp   nginx
3c89da45d3f0        vmware/harbor-ui:v1.2.0            "/harbor/harbor_ui"      13 hours ago        Up 13 hours                                                                            harbor-ui
d46ac994f6f7        vmware/harbor-adminserver:v1.2.0   "/harbor/harbor_admin"   13 hours ago        Up 13 hours                                                                            harbor-adminserver
bde94644c2ce        vmware/harbor-db:v1.2.0            "docker-entrypoint.sh"   13 hours ago        Up 13 hours         3306/tcp                                                           harbor-db
8dc825c41d6f        vmware/registry:2.6.2-photon       "/entrypoint.sh serve"   13 hours ago        Up 13 hours         5000/tcp                                                           registry
00033d665654        vmware/harbor-log:v1.2.0           "/bin/sh -c 'crond &&"   13 hours ago        Up 13 hours         127.0.0.1:1514->514/tcp                                            harbor-log
​
$ sudo docker-compose ps
       Name                     Command               State                            Ports
----------------------------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/harbor_adminserver       Up
harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp
harbor-jobservice    /harbor/harbor_jobservice        Up
harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp
harbor-ui            /harbor/harbor_ui                Up
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp,
                                                              0.0.0.0:80->80/tcp
registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp

登入Harbor

啟動完成後,我們訪問剛設定的hostname即可 http://10.0.81.36/,預設是80埠,如果端口占用,我們可以去修改docker-compose.yml檔案中,對應服務的埠對映。

賬號:admin 密碼為預設:Harbor12345。密碼在harbor.cfg檔案中可以找到。

登入之後進入下面介面。

上傳映象到Harbor

# 檢視當前的centos映象  
[[email protected] ~]# docker images|grep centos  
centos                      6.7                 000c5746fa52        6 months ago        191MB  
  
# 對現有的centos打tag,就tag成v1吧,這裡的倉庫地址在web介面專案裡面的右側的推送映象即可知道。  
[[email protected] ~]# docker tag centos:6.7 172.16.83.203/library/centos:v1  
  
# 檢視新tag的centos映象  
[[email protected] ~]# docker images|grep centos  
centos                         6.7                 000c5746fa52        6 months ago        191MB  
10.0.81.36/library/centos   v1                  000c5746fa52        6 months ago        191MB  
[[email protected] ~]# docker login 10.0.81.36   
Username: admin   #輸入使用者ing  
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  
   
Are you sure you want to proceed? y/N] y   
Login Succeeded    #登入成功  

3.Kubernetes叢集上部署Harbor

1.環境說明

Kubernetes v1.10.0

Harbor v1.2.0

建議Kubernetes至少要準備v1.6.5及以後版本

伺服器地址:

master:192.168.72.2

node:192.168.72.6

master或者node機器上至少保證一臺機器安裝了nfs、rpc,因為叢集上pv掛載使用的nfs。

harbor的目錄結構

解壓harbor的壓縮包,直接計入harbor/make
# cd harbor/make
# tree kubernetes
kubernetes
├── adminserver
│   ├── adminserver.rc.yaml
│   └── adminserver.svc.yaml
├── jobservice
│   ├── jobservice.rc.yaml
│   └── jobservice.svc.yaml
├── k8s-prepare
├── mysql
│   ├── mysql.rc.yaml
│   └── mysql.svc.yaml
├── pv
│   ├── log.pvc.yaml
│   ├── log.pv.yaml
│   ├── registry.pvc.yaml
│   ├── registry.pv.yaml
├── registry
│   ├── registry.rc.yaml
│   └── registry.svc.yaml
├── templates
│   ├── adminserver.cm.yaml
│   ├── jobservice.cm.yaml
│   ├── mysql.cm.yaml
│   ├── nginx.cm.yaml
│   ├── registry.cm.yaml
│   └── ui.cm.yaml
└── ui
    ├── ui.rc.yaml
    └── ui.svc.yaml
​

2.安裝nfs、rpc

具體可看分享的nfs安裝記錄。

3.建立pv、pvc

從剛剛的目錄中可以看到,harbor已經提供了log和registry的pv,但是pv的掛載並不是nfs,所以用不上,log用於掛載harbor執行的日誌資訊,registry用於掛載上傳的映象,因為映象上傳到容器中,但是如果一旦容器被摧毀,存放在容器中的映象都將無法恢復,所有需要通過pv掛載。

建立目錄/home/pv,分別建立一下四個檔案,具體示例如下:

log-pv.yaml
​
apiVersion: v1
kind: PersistentVolume
metadata:
  name: log-pv
  labels:
    type: log
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.72.6
    path: "/home/suzhan/nfs/data/zhou/log"
  persistentVolumeReclaimPolicy: Delete
  
  
log-pvc.yaml
​
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: log-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  selector:
    matchLabels:
      type: log
​
      
registry-pv.yaml      
      
apiVersion: v1
kind: PersistentVolume
metadata:
  name: registry-pv
  labels:
    type: registry
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.72.6
    path: "/home/suzhan/nfs/data/zhou/reg"
  persistentVolumeReclaimPolicy: Delete
  
​
registry-pvc.yaml
  
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: registry-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      type: registry
      
      
  說明:
  nfs服務搭建在72.6伺服器上面,在72.6伺服器上建立兩個目錄,一個存放日誌資訊,一個存放映象資訊
  /home/suzhan/nfs/data/zhou/log
  /home/suzhan/nfs/data/zhou/reg

建立pv和pvc,如下:

# kubectl create -f log.pv.yaml
persistentvolume "log-pv" created
# kubectl create -f log.pvc.yaml
persistentvolumeclaim "log-pvc" created
# kubectl create -f registry.pv.yaml
persistentvolume "registry-pv" created
# kubectl create -f registry.pvc.yaml
persistentvolumeclaim "registry-pvc" created
# kubectl get pvc
NAME           STATUS    VOLUME        CAPACITY   ACCESSMODES   STORAGECLASS   AGE
log-pvc        Bound     log-pv        1Gi        RWX                          31s
registry-pvc   Bound     registry-pv   5Gi        RWX                          2s
# kubectl get pv
NAME          CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                  STORAGECLASS   REASON    AGE
log-pv        1Gi        RWX           Retain          Bound     default/log-pvc                                 36s
registry-pv   5Gi        RWX           Retain          Bound     default/registry-pvc                            6s

4.建立harbor資料庫

由於目前Harbor的kubernetes版本還不支援自動init資料庫,因此我們需要為新建的registry_k8s資料庫做初始化,目前使用的方法就是使用docker-compose工具在本地啟動一個單機版harbor,然後獲取harbor-db容器的id,進入容器之中將資料庫dump出來,因為單機班的harbor會通過docker-compose.yaml建立資料庫,然後需要將其中的資料資訊匯出到本地,建一個kubernetes中harbor能訪問的資料庫,具體操作如下:

注意:如何安裝單機版harbor請看上文
​
找到harbor_db的container id: 77fde71390e7,進入容器,並將資料庫registry dump出來:
​
# docker exec -i -t  77fde71390e7 bash
# mysqldump -u root -p --databases registry > registry.dump
# 將資料庫新建表和資訊檔案匯出到容器的tmp/下面
離開容器,將容器內匯出的registry.dump copy到本地home下面:
# docker cp 77fde71390e7:/tmp/registry.dump ./
​
然後自己啟動一個數據庫服務將資訊匯入到資料庫中,但是要確保kubernetes中pod能訪問,建議使用kubectl建立一個mysql容器。

這裡有許多大坑需要注意:

這裡需要注意的是:要確保單機版的harbor和叢集中harbor中ui服務的版本必須一致,比如ui服務1.2.2,那麼db服務的也是1.2.2,因為不同版本的harbor(目前v1.6.0)對db資料庫的要求不一樣,表結構和表都不一樣。那修改各個映象的版本只需要在/harbor/make/kubernetes/中各個服務的deployment檔案中修改映象版本。

版本問題

在github上下載的harbor各服務的映象版本資訊如下:

adminserver服務:vmware/harbor-adminserver:v1.2.0

jobserver服務:vmware/harbor-jobservice:v1.2.0

registry服務:vmware/registry:2.6.2-photon

ui服務:vmware/harbor-ui:v1.2.0

但是事實上github上給出的映象版本(除了registry)和各個服務的映象搭配是有問題的,啟動時肯定會有問題的,從docker hub上查詢發現除了registry映象的版本是最新的,其他的版本都不是最新的,最新的目前已經更新到了v1.5.2,而且v1.5.2的版本相對1.2.0的區別非常大,具體的區別如下(只是根據我部署踩過的坑,不代表權威):

第一,如果使用registry:2.6.2版本搭配其他的1.2.0的映象啟動,regitstry會啟動失敗,需要將registry版本進行降級,使用2.6.1版本即可執行;

第二,ui:v1.5.2版本連線adminserver服務的時候預設是使用8080埠,但是1.2.0預設使用的80埠;

第三,ui:v1.2.0與ui:v1.5.2映象,需要的資料庫表數量和表結構不一樣,例如:v1.5.2的ui需要的資料庫一共有20張表,但是v1.2.0中只需要表15張表,而且表的結構也有差異,v1.5.2庫中project表只要7個欄位,而v1.2.0中project表有八個欄位,多了一個public欄位。

所以在複製資料庫的時候必須保證各個服務的一致性。

資料庫匯入問題

第一:project project_metadata這兩個表有外來鍵,需要在最後匯入。

第二:harbor_resource_label需要將resource_name欄位長度改成200,不然會報錯:specified key was too long

可以下載兩個版本的資料庫指令碼,但是個人建議全部使用v1.5.2的資料指令碼,然後再project中插入public欄位,欄位型別TINYINT,長度:1,預設:0。

但是,當我們從github上下載了低版本的harbor,例如harbor1.5.2(看好是harbor的版本),所有的映象都是最新的,這裡就有點操蛋了。

5.配置harbor.cfg檔案

harbor.cfg是整個配置生成的重要輸入,我們在k8s-prepare執行之前,先要根據我們的需要和環境對harbor.cfg進行配置,配置如下:

// 進入harbor/make/harbor.cfg
​
​
hostname = 192.168.72.2      //輸入自己安裝的宿主機ip地址
​
db_host = mysql              //域名
db_password = password       //資料庫密碼
db_port = 8000               //記住,這是pod對內暴露的埠,不是對外
db_user = root               //資料庫使用者名稱
​

6.configmap配置模板

在/harbor/make/kubernetes/templates下面會有harbor所有需要啟動的服務的configmap模板檔案。

首先配置adminserver.cm.yaml檔案,示例如下:

對於adminservier服務來說,具體還是配置資料庫資訊
​
​
MYSQL_HOST: 192.168.72.2          //資料庫訪問地址
MYSQL_USR: root                   //資料庫使用者
MYSQL_DATABASE: registry_k8s      //資料庫名稱
RESET: "true"
​

其他的暫時可以無需調整。

7.執行k8s-prepare指令碼

上面設定完畢之後需要執行指令碼,進入/harbor/make/kubernetes目錄,執行./k8s-prepare,就會根據tmplates中的模板生成各個服務的configmap指令碼資訊,具體操作:

./k8s-prepare

執行完畢,可以在各自的資料夾下面看到相應的configmap指令碼資訊,例如,在harbor/make/kubernetes/adminserver資料夾中可以看到adminserver.cm.yaml檔案


8.啟動Harbor元件

第一步啟動configmap指令碼,如下:

# kubectl apply -f jobservice/jobservice.cm.yaml
configmap "harbor-jobservice-config" created
# kubectl apply -f registry/registry.cm.yaml
configmap "harbor-registry-config" created
# kubectl apply -f ui/ui.cm.yaml
configmap "harbor-ui-config" created
# kubectl apply -f adminserver/adminserver.cm.yaml
configmap "harbor-adminserver-config" created

# kubectl get cm
NAME                        DATA      AGE
harbor-adminserver-config   42        14s
harbor-jobservice-config    8         16s
harbor-registry-config      2         15s
harbor-ui-config            9         15s



第二步啟動server服務,如下:

# kubectl apply -f jobservice/jobservice.svc.yaml
service "jobservice" created
# kubectl apply -f registry/registry.svc.yaml
service "registry" created
# kubectl apply -f ui/ui.svc.yaml
service "ui" created
# kubectl apply -f adminserver/adminserver.svc.yaml
service "adminserver" created

# kubectl get svc
NAME               CLUSTER-IP      EXTERNAL-IP   PORT(S)
adminserver        10.103.7.8      <none>        80/TCP
jobservice         10.104.14.178   <none>        80/TCP
registry           10.101.185.42   <none>        5000/TCP,5001/TCP
ui                 10.96.29.187    <none>        80/TCP



第三步啟動deployment服務,如下:

# kubectl apply -f registry/registry.deploy.yaml
replicationcontroller "registry-rc" created
# kubectl apply -f jobservice/jobservice.deploy.yaml
replicationcontroller "jobservice-deploy" created
# kubectl apply -f ui/ui.deploy.yaml
replicationcontroller "ui-deploy" created
# kubectl apply -f adminserver/adminserver.deploy.yaml
replicationcontroller "adminserver-deploy" created




啟動後檢查各個pod,可能會存在通過hostname連個某個服務無法連線的問題,比如說:ui服務連線adminserver:80連線不上,這個原因是因為dns問題,正常的kubernetes叢集都安裝了coredns或者flannel服務用於hostname對映,如果沒有安裝也可以解決這個問題,因為kubernetes1.7版本以後提供了hostnames這個屬性。

k8s上不同服務之間可以通過service的域名來互相訪問。域名的解析是一般是通過在叢集中的kube-dns(主要是dnsmasq)或者coredns完成的。k8s的dns也可以向上級聯dns伺服器。有的時候,我們希望給執行在k8s上的Pod增加一些域名的解析(例如宿主機的主機名),但又不想對dns模組動太多,有沒有什麼比較方便的辦法呢?容易想到的是,將域名記錄到容器映象的/etc/hosts檔案,這樣容器執行時就可以正確解析了。然而這樣是不行的。k8s會管理這個檔案,打到映象裡的檔案實際並不會起作用。可以通過yaml檔案中hostnames進行設定,可用於deploy、sc、pod,示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox
    command:
    - cat
    args:
    - "/etc/hosts"
    
    
    
restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
    通過restartPolicy屬性進行設定,這是在1.7版本開始,k8s支援了 HostAliases 特性: .spec.hostAliases。


啟動後,如果需要訪問harbor的影象介面,需要設定ui的server,對ui對外暴露一個介面,需要設定ui.svc.yaml,通過nodeport設定一個對外暴露的埠,就可以通過http://ip:埠映象訪問埠了。

還有一個埠需要設定,docker連線倉庫服務也需要對registry服務設定一個對外暴露的埠,也是使用nodeport進行設定。

9.harbor校驗

由於harbor預設使用了http訪問,因此在docker login前先要將我們的倉庫地址加到/etc/docker/daemon.json的insecure-registries中: 這裡對registry服務設定對外暴露的埠是31277

///etc/docker/daemon.json
{
  "insecure-registries": ["192.168.72.2:31277"]
}



systemctl daemon-reload and restart後,我們就可以通過docker login登入新建的倉庫了(初始密碼:Harbor12345):

docker login hub.tonybai.com:31277
Username (admin): admin
Password:
Login Succeeded


在瀏覽器中開啟http://192.168.72.2:31277,用admin/Harbor12345登入也可以訪問ui介面。

相關推薦

kubernetes叢集搭建harbor倉庫單機搭建harbor以及docker registry倉庫搭建細節

Kubnernetes叢集搭建(Harbor)私服倉庫 搭建Kubernetes叢集倉庫之前最好先從Docker私服倉庫循序漸進開始。本文件會從Docker私服安裝開始一步一步走向叢集私服倉庫(Harbor)搭建。 1.Docker私服倉庫搭建 Docker提供了Doc

在 ubuntu 搭建需要簽名認證的私有 docker registry 倉庫

.com chunked required 社區 apach proto remote tps grep 前言 在前面的一篇博客《在 ubuntu 搭建 docker registry 私有倉庫》介紹了一種簡單的搭建 docker 私有倉庫了的方法。但是當時使用的是修改“-

Apache搭建虛擬主機(基於IP、端口、域名實現)源碼包

多臺 主機 enable tps alt 防火墻 -- gcc 一定的 簡介 虛擬主機是指在網絡服務器上分出一定的磁盤空間,管理員可以利用此部分空間,放置站點及應用組件,提供必要的數據存放和傳輸功能。虛擬主機,就是把一臺運行在互聯網上的物理服務器劃分成多個“虛擬”服務器。

構建 Docker registry 私有映象解決docker私有倉庫push出錯問題

適用於:Docker 1.8      環境:Centos7 每個版本的docker修改配置內容都不同,請大家看好安裝的docker版本。 1)下載 docker registry私有映象 docker pull docker.io/registry 2)修改

Docker registry倉庫歷史映象批量清理

前言 Docker registry在以jenkins CI/CD流水線自動打包並push映象的方式運行了一段時間之後,堆積的歷史映象數量極多,磁碟空間告急,為此,有必要定期做映象的清理,並釋放映象佔用的儲存空間 清除原理 Docker儲存使用的aufs檔案系

Python切片 :實現一個trim()函式去除字串首尾以及中間重複的空格不呼叫str的strip()方法。

# -*- coding=utf-8 -*-def trim(s):    length = len(s)    if length != 0:        if s[0] == ' ':            return trim(s[1:])        if s[

Kubernetes入門--搭建Kubernetes叢集並啟動容器服務

英文原作者:Ben Cane  翻譯作者:Miazzy 翻譯&轉載:https://blog.codeship.com/getting-started-with-kubernetes/   Kubernetes入門   Kubernetes是一個

Kubernetes叢集搭建DashboardWebsite訪問

Dashboard Dashboard是基於Web的Kubernetes使用者介面。我們可以使用Dashboard將容器化應用程式部署到Kubernetes叢集,對容器化應用程式進行故障排除,並管理叢集本身及其伴隨資源。還可以使用Dashboard來概述群集上執

基於 Harbor 和 Cephfs 搭建高可用 Docker 映象倉庫叢集

目錄 Harbor & Cephfs 介紹 環境、軟體準備 Cephfs 檔案系統建立 單節點 Harbor 服務搭建 安裝 Harbor 配置掛載路徑 配置使用外部資料庫 多節點 Harbor 叢集服務搭建 測試 Habor 叢集 1、Ha

Kubernetes集群搭建之企業級環境中基於Harbor搭建自己的私有倉庫

數據庫管理員 ffline login 外網 字段 hit 初始 nec 執行權 搭建背景 企業環境中使用Docker環境,一般出於安全考慮,業務使用的鏡像一般不會從第三方公共倉庫下載。那麽就要引出今天的主題 企業級環境中基於Harbor搭建自己的安全認證倉庫 介紹

Docker 私有倉庫 Harbor registry 安全認證搭建 [Https]

engine root sha2 create rtu r12 -i 啟動 鏡像倉庫 Harbor源碼地址:https://github.com/vmware/harborHarbort特性:基於角色控制用戶和倉庫都是基於項目進行組織的, 而用戶基於項目可以擁有不同的權限。

docker 私有倉庫Harbor搭建與使用

login rbo scope entity 支持 bogon nal hub mtp Harbor搭建 下載Harbor: wget https://github.com/vmware/harbor/releases/ 配置Harbor t

docker私有倉庫搭建harbor

1、安裝docker-compose $ yum -y install epel-release $ yum -y install python-pip   $ pip install docker-compose

Kubernetes叢集搭建

0. 概要 使用kubeadm搭建一個單節點kubernets例項,僅供學習. 執行環境和軟體概要如下: ~ 版本 備註 OS Ubuntu 18.0.4 192.168.132.152 my.servermas

Kubernetes 叢集搭建

基礎環境 系統環境# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core) 主機名設定 centos-master 192.168.59.135 centos-minion1 192.168.59.132 centos-minion2

《二》Kubernetes叢集部署(node)-搭建叢集v1.1

在Node節點部署元件 Master apiserver啟用TLS認證後,Node節點kubelet元件想要加入叢集,必須使用CA簽發的有效證書才能與apiserver通訊,當Node節點很多時,簽署證書是一件很繁瑣的事情,因此有了TLS Bootstrapping機制,kubelet會以一個低許可權使用者

《二》Kubernetes叢集部署-搭建叢集

多master叢集架構圖 時間必須同步、關閉防火牆、Firewalld、selinux 1、拷貝master01 中的kubernetes目錄到master02上[[email protected] ~]# scp -r /opt/kubernetes/ 192.168.1.16:/op

Harbor--搭建企業級私有docker映象倉庫(一)

                Harbor映象倉庫搭建 Harbor是一個用於儲存和分發Docker映象的企業級Registry伺服器,通過新增一些企業必需的功能

docker私有Registry倉庫--快速搭建--------harbor

Harbor可以通過Docker Composer的方式來部署,如果有正常執行的k8s環境,也可以使用k8s來部署Harbor,本文采用 Docker Composer的方式。  準備   Linux系統為Centos 7。 docker ,預設安裝即可 yum -y

搭建kubernetes叢集詳細步驟(包含所有映象資源)

搭建kubernetes叢集 準備工作: 搭建k8s叢集之前首先準備好≥3臺的機器 並做好免密登陸 ssh-keygen -t rsa ssh-copy-id -i ~/.ssh/id_rsa.pub <各node節點IP> 設定好主機名和時間同步