kubernetes實戰篇之nexus oss伺服器部署及基於nexus的docker映象倉庫搭建

周國通發表於2019-06-28

系列目錄

Nexus oss倉庫管理平臺搭建

Nexus是一款倉庫管理工具,支援Npm,bower,maven,nuget,apt,yum甚至docker,helm等各種倉庫,說的通俗以下,就是私服映象倉庫.並且有免費版,OSS版即為免費版,下載的時候請注意版本的選擇.

下載地址

往下面滾動頁面,可以看到Choose your Nexus,有osx,windows和unix版本可供選擇.這裡我選擇的是windows版本.

下載的內容是一個壓縮包,下載完成後把壓縮包解壓.解壓後有兩個資料夾,我們進入nexus-3.x.x資料夾下的bin目錄,我們在當前目錄下開啟cmd或者從任意位置開啟cmd,然後cd到上述目錄.執行nexus.exe /run來安裝nexus

註冊服務

安裝完成以後,執行nexus.exe /install Nexus Service來註冊服務

啟動服務

執行命令nexus.exe /start Nexus Service來啟動服務

通過以上操作,實際上是往windows服務裡面新增了一個名字叫作nexus service的服務,我們可以通過powerhsell命令Get-Service "nexus service"來找到這個服務,通過Restart-Service "nexus service"來重啟它.

以上執行完成以後,就可以通過開啟瀏覽器,輸入localhost:8081來訪問它,也可以通過其它區域網主機使用IP:8081方式來訪問它.

img

通過首頁,我們可以看到Nexus羅列出來的支援的倉庫型別,非常豐富.

注意,大家可能看到我訪問的埠號並不是8081而是8443,這是因為我設定的http自動跳轉到https,並且指定的https埠為8443,這裡之所以要啟用https是因為下面即將講到的docker映象上傳需要使用https.這部分內容將在下一節講解.

登陸

注意,如果沒有登陸,Nexus並不是以顯著的方式提示你登陸,但是非登陸使用者功能受限.要想實現一些管理功能,必須登陸.登陸需要點選右上角sign in按鈕.預設登陸使用者名稱為admin密碼為admin123.

Nexus搭建docker映象倉庫

上一節我們講了如何在windows下安裝nexus,本節我們講解如何來搭建nexus來搭建docker映象倉庫.

我們進入web管理介面,點選齒輪圖示,然後點選Repositories.如下圖示

img

注意,以上操作需要登陸.登陸方式為點選右上角sign in,然後用預設admin,admin123登陸.詳細請見上一節內容

然後點選create repository按鈕.如下圖操作

img

頁面出來了非常多的倉庫型別供選擇,由於我們要建立的是docker倉庫,這裡選擇的是docker hosted

img

點選後出現如下介面

img

配置上面填寫的內容,填寫完成後我們點選左下角create repository來建立倉庫

nexus伺服器支援https配置

由於我們使用的是https方式通訊,因此我們需要對nexus伺服器進行配置,以支援https.由於我們的證照是自己生成的,因此docker客戶端也需新增對自己生成key的信任.

服務端開啟監聽ssl協議埠

進到nexus-xxx-xxx目錄下(前面一節提到的從官網下載的nexus壓縮包解壓後的一個目錄),進到ect目錄下,裡面有一個nexus-default.properties檔案,用文字編輯器開啟它

# Jetty section註釋下面新增一行,內容為application-port-ssl=8443

nexus-args一行尾部新增,${jetty.etc}/jetty-http-redirect-to-https.xml,以指示伺服器自動將http跳轉到https

生成證照祕鑰

網上有很多生成密碼證照的部落格文章,使用的工具也不盡相同.這裡,我們使用java jkd自帶的keytool.exe來生成ssl證照.

進入到nexus-xxx-xxx目錄下的ect/ssl目錄下,執行以下命令:

keytool -genkeypair -keystore keystore.jks -storepass nexus3 -keypass nexus3 -alias jetty -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=${NEXUS_DOMAIN}, OU=Example, O=Sonatype, L=Unspecified, ST=Unspecified, C=US" -ext "SAN=DNS:${NEXUS_DOMAIN},IP:${NEXUS_IP_ADDRESS}" -ext "BC=ca:true"

其中${NEXUS_IP_ADDRESS}替換為你的實際ip地址,${NEXUS_DOMAIN}如果沒有域名可以隨便填寫

需要注意的是,如果由於環境變數配置問題導致keytool命令找不到,則需要顯式指定keytool.exe完整路徑,然後後面帶上要執行的命令.

修改jetty-https.xml

進入到nexus-xxx-xxx目錄下的etc/jetty目錄下,用文字編輯器開啟jetty-https.xml檔案

把裡面對應的內容修改為如下配置:

    <Set name="KeyStorePath"><Property name="karaf.etc"/>/ssl/keystore.jks</Set>
    <Set name="KeyStorePassword">nexus3</Set>
    <Set name="KeyManagerPassword">nexus3</Set>
    <Set name="TrustStorePath"><Property name="karaf.etc"/>/ssl/keystore.jks</Set>
    <Set name="TrustStorePassword">nexus3</Set>

注意以上內容全是修改,而不是新增,修改的時候找到相同key的修改即可.

重啟nexus伺服器

可以通過上一節介紹的powershell命令Restart-Service "nexus service來重啟服務,以使配置生效.

需要注意的是,執行以上命令需要以管理員身份啟動powershell.除了使用命令以外,也可以進入到服務管理裡面找到名為nexus service的服務,然後手動重啟它.

執行完以上配置以後,我們再開啟瀏覽器訪問https://..localhost:8443或者http://localhost:8081

注意,重啟服務以後,如果以上內容不能馬上響應,可以等一會時間再觀察看看.

配置客戶端信任ca證照

我的docker伺服器安裝在192.168.122.65上面.下面介紹centos和ubuntu下如何新增證照信任

centos下新增證照信任

#生成cert檔案
[root@localhost ~]# keytool -printcert -sslserver 192.168.124.43:8443 -rfc >nexus.crt
[root@localhost ~]# yum install ca-certificates
[root@localhost ~]# update-ca-trust force-enable
# 還可以放在/etc/docker/certs.d/192.168.124.43:8443目錄下
[root@localhost ~]# mv nexus.crt /etc/pki/ca-trust/source/anchors/nexus.crt
[root@localhost ~]# update-ca-trust
[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002
Login Succeeded

ubuntu下新增信任證照

對於Ubuntu系統來說certificate的存放路徑是 /usr/local/share/ca-certificates


### 生成cert檔案
[root@localhost ~]# keytool -printcert -sslserver 192.168.124.43:8443 -rfc >nexus.crt
# 還可以放在/etc/docker/certs.d/192.168.124.43:8443目錄下
[root@localhost ~]# mv nexus.crt /usr/local/share/ca-certificates/nexus.crt
[root@localhost ~]# update-ca-certificates
[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002

在redhat系統中,如果報Unkonw authority錯誤,修改/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,新增subjectAltName選項

[ v3_ca ]  
subjectAltName = IP:192.168.124.43

然後再執行以下命令

[root@localhost ~]# service docker restart
[root@localhost ~]# docker login -u admin -p admin123 192.168.124.43:8002
Login Succeeded

注,網上有不少介紹使用http訪問的方法,但是卻沒有執行成功,大家可以嘗試一下

[root@localhost centos]# vi /etc/docker/daemon.json
{
  "insecure-registries": [
    "192.168.124.43:8003"
  ],
  "disable-legacy-registry": true

上傳映象到docker倉庫

  • 為映象打標籤
docker tag 映象名:tag名 192.168.124.43:8002/映象名:tag名

我裡,我沒有自己建立映象,而是隨便找了一個已以存在的映象,然後打上標籤,如下

192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend

通過執行docker push命令把它推到遠端私服倉庫

[root@localhost ~]# docker push 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend
The push refers to a repository [192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend]
d62604d5d244: Pushed
1.4: digest: sha256:f63ced70bc85ca753e715c93b0adc3115510a6575129102383236c30112379e5 size: 528
[root@localhost ~]#

注意,推送前是需要先登陸的,登陸的方法上面也介紹過了

我們登陸nexus web管理介面,點選左側Broswe,可以看到已經有內容push進來了

img

我們執行docker search命令

[root@localhost ~]# docker search 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend
NAME                                                                      DESCRIPTION   STARS     OFFICIAL   AUTOMATED
192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4                 0
[root@localhost ~]#

可以看到能夠從遠端伺服器上搜尋到它.

拉取上傳的映象

實際環境中,生成docker映象和伺服器和使用docker映象的伺服器往往不是同一臺伺服器.這裡我們使用另一個伺服器192.168.124.59來拉取剛剛上傳的映象

需要注意的是,這裡基於的前提是用於拉取映象的伺服器已經安裝了docker,docker的安裝可以參考其它章節或者網路上的教程

  • 執行keytool -printcert -sslserver 192.168.59.1:8443 -rfc >nexus.crt

  • 執行yum install ca-certificates來安裝

-緊接著執行update-ca-trust force-enable

  • 執行mv nexus.crt /etc/pki/ca-trust/source/anchors/nexus.crt

  • 執行update-ca-trust
  • service docker restart
  • 執行login docker login -u admin -p admin123 192.168.124.43:8002

[root@k8s-master ~]# docker login -u admin -p admin123 192.168.124.43:8002
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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

然後我們執行docker pull


[root@k8s-master ~]# docker pull 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4
1.4: Pulling from rancher/nginx-ingress-controller-defaultbackend
5990baa43a5e: Pull complete
Digest: sha256:f63ced70bc85ca753e715c93b0adc3115510a6575129102383236c30112379e5
Status: Downloaded newer image for 192.168.124.43:8002/rancher/nginx-ingress-controller-defaultbackend:1.4
[root@k8s-master ~]#

注意pull的時候要帶上版本的tag

以上,我們從一臺伺服器(192.168.122.65)推送映象到私服,然後用另一臺伺服器拉取(192.168.124.59).需要注意的是,由於服務端使用了自已生成的https證照,因此docker映象生產端和消費端都要新增ca證照信任

參考資料1

參考資料2

相關文章