kubernetes實戰篇之nexus oss服務器部署及基於nexus的docker鏡像倉庫搭建


系列目錄

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


免責聲明!

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



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