Kunbernetes-基於Nexus構建私有映象倉庫

店家小二發表於2018-12-14

1、 安裝Nexus

Nexus是Sonatype提供的倉庫管理平臺,Nuexus Repository OSS3能夠支援Maven、npm、Docker、YUM、Helm等格式資料的儲存和釋出;並且能夠與Jekins、SonaQube和Eclipse等工具進行整合。Nexus支援作為宿主和代理儲存庫的Docker儲存庫,可以直接將這些儲存庫暴露給客戶端工具;也可以以儲存庫組的方式暴露給客戶端工具,儲存庫組是合併了多個儲存庫的內容的儲存庫,能夠通過一個URL將多個儲存庫暴露給客戶端工具,從而便於使用者的使用。通過nexus自建能夠有效減少訪問獲取映象的時間和對頻寬使用,並能夠通過自有的映象倉庫共享企業自己的映象。在本文中,採用Docker模式安裝部署Nexus。

首先,通過mkdir建立一個目錄,用於為Nexus提供儲存的空間。

$ mkdir {path}/nexus-data && chown -R 200 {path}/nexus-data

接著,就可以通過sonatype/nexus3映象啟動nexus3的容器化應用了。通過如下命令啟動的nexus將對外暴露8081埠,並容器的持久化資料通過會儲存在上述建立的空間中。在容器執行後,使用者將可以通過http://{host_ip}:8081訪問nexus應用,其中{host_ip}為容器所部署的宿主機的IP地址。

$ docker run -d -p 8081:8081 --name nexus -v {path}/nexus-data:/nexus-data sonatype/nexus3

2、構建私有映象倉庫

在nexus部署成功後,在瀏覽器中通過http://{host_ip}:8081地址訪問nexus應用。

1)通過管理員帳戶登入nexus,並進入建立為docker的映象倉庫的主頁:

2)在建立映象倉庫的頁面中,設定映象倉庫的相關資訊,包括名稱、HTTP埠、是否允許匿名拉取映象等資訊。這裡需要注意的是,此處的HTTP埠(此處的值為1008)很重要,後續拉取和推送進行是使用此埠進行的,而不是nexus本身對外暴露的埠。另外,如果允許設定通過匿名的方式拉取映象。

這需要在Realms主頁啟用Docker Bearer Token Reamlm,如下圖所示:

並對匿名方式進行設定,允許通過匿名方式訪問伺服器,如下圖進行設定:

3)在客戶端的/etc/docker/daemon.json檔案中新增下面的內容:

在完成私有映象倉庫的設定後,由於使用的是HTTP協議,因此需要在客戶端對docker進行配置。通過編譯工具開啟daemon.json:

$ vi /etc/docker/daemon.json

在檔案中新增如下的內容,告訴客戶端私有映象倉庫是一個安全的倉庫:

{ "insecure-registries":["<nexus-hostname>:<repository-port>"] }

3、基本操作

3.1 登入認證

在通過nexus完成私有映象倉庫的構建後,首先需要進行登入認證才能進行後續的操作,私有映象倉庫登入認證的語法和格式:docker login <nexus-hostname>:<repository-port>。假設上述的nexus部署在IP地址為10.8.32.148主機上,私有映象的埠為1008,則通過執行如下的命令登入私有映象倉庫:

$ docker login 10.8.32.148:1008

登入時,需要提供使用者名稱和密碼。認證的資訊會被儲存在~/.docker/config.json檔案,在後續與私有映象倉庫互動時就可以被重用,而不需要每次都進行登入認證。

3.2 推送映象

要共享一個映象,可以通過將其釋出到託管儲存庫,然後其它人員就可以通過儲存庫獲取自己需要的映象。在將映象推送到儲存庫之前,需要對映象進行標記。當標記影像時,可以使用映象識別符號(imageId)或者映象名稱(imageName)。標識映象的語法和格式:docker tag <imageId or imageName> <nexus-hostname>:<repository-port>/<image>:<tag>。假設這裡將mysql:5.7映象標識為私有映象倉庫(10.8.32.148:1008)中的映象,標識的執行命令如下:

$ docker tag mysql:5.7 10.8.32.148:1008/mysql:5.7

一旦映象標識完成後,就可以通過的docker push命令將映象推送到私有倉庫中。推送映象到私有映象倉庫的語法和格式為docker push <nexus-hostname>:<repository-port>/<image>:<tag>,通過下面的命令,將上述打完標籤的映象上傳至私有映象倉庫:

$ docker push 10.8.32.148:1008/mysql:5.7

3.3 拉取映象

Kunbernetes將會根據需要從私有映象倉庫中拉取映象,在客戶端可以通過手動拉取映象,拉取的語法和格式:docker pull <nexus-hostname>:<repository-port>/<image>:<tag>。假設從本文構建的私有映象倉庫中拉取mysql:5.7,執行命令如下所示:

$ docker pull 10.8.32.148:1008/mysql:5.7

4、Kubernetes從私有映象拉取映象

4.1 生成金鑰

在使用私有映象拉取映象時,需要為私有映象倉庫建立一個映象倉庫的金鑰,並在建立容器中進行引用。建立映象倉庫的語法和格式:kubectl create secret dockerregistry <regsecret-name> dockerserver=<yourregistryserver> dockerusername=<yourname> dockerpassword=<yourpword> dockeremail=<youremail>。

  • <regsecret-name>:所建立的私有映象倉庫金鑰的名稱;
  • <your-registry-server>:為映象倉庫的伺服器地址;
  • <your-name>:登入映象倉庫的使用者名稱;
  • <your-pword>:登入映象倉庫的密碼;
  • <your-email>:使用者的郵箱地址。

假設登入私有映象倉庫的使用者命名為admin、密碼為admin、郵箱地址為admin@aliyun.com。則可以通過執行下面的命令建立私有映象倉庫的金鑰:

$ kubectl create secret docker-registry myregsecret --docker-server=10.8.32.148:1008 
--docker-username=admin --docker-password=admin --docker-email=admin@aliyun.com

4.2 定義拉取映象的部署

在這裡定義是一個名為nginx的YAML部署示例檔案,此檔案通過從私有映象倉庫拉取nginx,並使用imagePullSecrets欄位來指定拉取映象所使用的金鑰:

apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
 name: nginx
spec:
 replicas: 3
 selector:
 matchLabels:
 app: nginx
 revisionHistoryLimit: 2 template:
 metadata:
 labels:
 app: nginx
 spec: # 指定從私有映象倉庫拉取映象的金鑰  imagePullSecrets: - name: myregsecret
 containers: # 所要拉取的映象 - image: 10.8.32.1481008/nginx:1.7.9
 name: nginx
 imagePullPolicy: IfNotPresent
 ports: - containerPort: 80
 name: nginx80
 volumeMounts: - mountPath: /usr/share/nginx/html
 name: nginx-data
 - mountPath: /etc/nginx
 name: nginx-conf
 volumes: - name: nginx-data
 nfs:
 path: /k8s-nfs/nginx
 server: 192.168.8.150 - name: nginx-conf
 nfs:
 path: /k8s-nfs/nginx/conf
 server: 192.168.8.150

通過執行kubectl create -f命令,在Kubernetes中基於所定義的YAML建立部署:

$ kubectl create -f {path}/nginx-deployment.yaml

執行上述命令後,Kubernetes將會從私有映象倉庫拉取nginx:1.7.9映象,並基於此映象啟動容器。

本文轉自中文社群-Kunbernetes-基於Nexus構建私有映象倉庫


相關文章