Kubernetes建立資料中心級apt映象站點
對於企業級開發團隊,搭建軟體包的映象站點(以及Docker Images Registry映象站點)是減少網路頻寬佔用、加速軟體開發過程的必備措施。
- 本文持續更新,地址 https://my.oschina.net/u/2306127/blog/2032372
- 本文程式碼倉庫,請按照自己的資源配置引數進行修改使用。
1、基本用法
對與Ubuntu(以及其他基於deb的系統)來說,一般有幾種方法:
- 建立Ubuntu apt的本地Mirror,使用apt-mirror來做,比較簡單。適合小規模團隊(<20人)。
- 使用容器技術搭建apt映象站,將映象工具和映象服務(apt-mirror-http-server)都放到了容器裡執行,更好管理。適合中等規模團隊(<50人)。
- 使用Kubernetes建立apt映象服務,將映象工具和映象服務放到K8s叢集中執行。可以滿足任何規模團隊的需要。
上面的這幾種方法都是使用apt-mirror來完成,需要配置映象引數,指定需要的版本。
2、高階用法
如果需要完整的Ubuntu Archive映象,可以編寫一個指令碼(參考:建立Ubuntu安裝包服務映象的指令碼),使用rsync全部映象Ubuntu archive倉庫,速度更快,但會佔用較大的磁碟空間(>1TB),初始同步需要較多的時間。然後,再建立一個Nginx例項提供服務。
第一步,建立CronJob
為了便於管理,我將同步指令碼建立為一個容器,然後掛載到Kubernetes中的定時任務中執行。
A、同步指令碼
- 內容如下:
#/bin/dash fatal() {
echo "$1" exit 1
}
warn() {
echo "$1"
}
# Find a source mirror near you which supports rsync on # https://launchpad.net/ubuntu/+archivemirrors # rsync://<iso-country-code>.rsync.archive.ubuntu.com/ubuntu should always work #RSYNCSOURCE=rsync://archive.ubuntu.mirror.isp.com/ubuntu # 實驗發現rsync不通了,用下面這個:
RSYNCSOURCE=archive.ubuntu.com::ubuntu
# Define where you want the mirror-data to be on your mirror #BASEDIR=/var/www/ubuntuarchive/ # 改成自己的目錄: #BASEDIR=/media/smw/Appdata/ipfs-export/mirrors/ubuntu
BASEDIR=/home/mirror-ubuntu
echo "From:" $RSYNCSOURCE echo "To:" $BASEDIR if [ ! -d ${BASEDIR} ]; then
warn "${BASEDIR} does not exist yet, trying to create it..."
mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed." fi
rsync --recursive --times --links --safe-links --hard-links
--stats
--exclude "Packages*" --exclude "Sources*"
--exclude "Release*" --exclude "InRelease"
${RSYNCSOURCE} ${BASEDIR} || fatal "First stage of sync failed."
rsync --recursive --times --links --safe-links --hard-links
--stats --delete --delete-after
${RSYNCSOURCE} ${BASEDIR} || fatal "Second stage of sync failed."
date -u > ${BASEDIR}/project/trace/$(hostname -f)
B、容器建立Dockerfile
- 內容如下:
#This Docker Mirror Ubuntu Archive to a persistent volume of kubernetes. #Created by openthings,2018-09-04. NO WARRANTS. #Please visit https://github.com/openthings/kubernetes-tools/mirror-ubuntu.
FROM ubuntu:16.04
RUN apt update &&
apt upgrade -y
RUN apt install -y rsync
COPY mirror-ubuntu.sh /home
C、定時任務CronJob
- 內容如下:
apiVersion: batch/v1beta1 kind: CronJob metadata:
name: mirror-ubuntu-cronjob
namespace: ipfs2
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: mirror-ubuntu
image: openthings/mirror-ubuntu
args:
- /bin/sh
- /home/mirror-ubuntu.sh
imagePullPolicy: "IfNotPresent"
volumeMounts:
- name: mirror-volume
mountPath: /home/mirror-ubuntu
subPath: mirror-ubuntu
volumes:
- name: mirror-volume
persistentVolumeClaim:
claimName: ipfs-storage-ipfs2-ipfs-0
將上面的內容儲存為檔案,然後執行Docker build進行容器構建和Kubectl apply安裝,即可看到Kubernetes叢集中job和pod被建立出來,然後Ubuntu Archive的資料開始同步。
- 注意,這裡的ipfs-storage-ipfs2-ipfs-0是我為了下一步的工作,與IPFS服務共用的儲存卷,你可以改成使用自己的PVC儲存卷宣告。
第二步,建立Nginx服務
建立一個Nginx服務站點,將其主目錄指向上面同步的同一個儲存目錄,然後開啟目錄瀏覽功能。
Kubernetes中的配置檔案,內容如下:
apiVersion: v1 kind: ServiceAccount metadata:
name: apt-mirror
namespace: ipfs2
---
kind: Service apiVersion: v1 metadata:
name: mirror-ubuntu-service
namespace: ipfs2
labels:
app: mirror-ubuntu-service
spec:
ports:
- name: mirror-service
port: 80
type: LoadBalancer
selector:
app: mirror-ubuntu-service
---
kind: Deployment apiVersion: apps/v1 metadata:
name: mirror-ubuntu-service
namespace: ipfs2
spec:
selector:
matchLabels:
app: mirror-ubuntu-service
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: mirror-ubuntu-service
spec:
serviceAccount: apt-mirror
containers:
- name: mirror-ubuntu-service
image: nginx
ports:
- name: mirror-service
containerPort: 80
securityContext:
capabilities:
add:
- DAC_READ_SEARCH
- SYS_RESOURCE
env:
- name: RESYNC_PERIOD
value: 2h
imagePullPolicy: "IfNotPresent"
volumeMounts:
- name: mirror-volume
mountPath: /usr/share/nginx/html
subPath: mirror-ubuntu
- name: mirror-volume
mountPath: /etc/nginx/conf.d/
subPath: mirror-ubuntu/service-config
volumes:
- name: mirror-volume
persistentVolumeClaim:
claimName: ipfs-storage-ipfs2-ipfs-0
我在其中建立了一個賬戶、一個Service和一個Nginx的Deployment。安裝後,就可以通過瀏覽器來訪問映象站點了。
- 其中,對映了兩個卷,一個為資料卷、一個為Nginx的配置檔案,都對應到主儲存PVC的子目錄中。
- Nginx為官網的映象(沒有任何定製修改),啟動時從配置子目錄讀取引數,啟用目錄瀏覽功能。
- 服務使用了LoadBalancer,本地叢集可以安裝MetalLB來實現,雲上使用廠商提供的負載均衡器。
第一次同步的時間比較長(下載將近1TB,一般要7天左右)。以後只是更新,就快多了。
因為使用了Kubernertes,需要的話可以對Nginx服務站點進行伸縮,遇到故障時系統可以自動重啟或節點漂移,可以滿足大規模資料中心級的軟體安裝和更新的需要。為了更高的可靠性,Kubernetes叢集本身應該配置Master高可用機制,儲存系統應該有備份和多拷貝。
3、極速方法
正如上面所述,這種映象機制可以對內部網的軟體安裝和更新過程大幅度加速,但是目前傳輸速度還是不夠快,而且依賴於上級的映象站點的可靠性。如果與BT和IPFS之類的p2p傳輸機制結合,將會進一步帶來速度和可靠性的大幅度提升。
目前的狀態,還存在一些障礙有待攻克,但是隨著IPFS等的改進和FileCoin的推出和完善,這一方案最終是完全可行的,留待後述。
本文轉自開源中國-Kubernetes建立資料中心級apt映象站點
相關文章
- 使用阿里巴巴開源映象站映象——Kubernetes 映象阿里
- Kubernetes Node 節點上的映象管理
- 國內開源映象站資訊盤點(建議收藏!)
- ArcGIs建立企業級資料庫資料庫
- Docker中ubuntu映象配置apt阿里源DockerUbuntuAPT阿里
- kubernetes實戰篇之建立金鑰自動拉取私服映象
- 關於SQL Server 映象資料庫快照的建立及使用SQLServer資料庫
- 怎麼建立網站連線資料庫網站資料庫
- 加速 Kubernetes 映象拉取
- 為你的Go應用建立輕量級Docker映象?GoDocker
- 映象瘦身-資料
- kubernetes實戰篇之為預設賬戶建立映象拉取金鑰
- docker建立beego映象DockerGo
- 資料庫學習優質站點資料庫
- 如何建立qcow2格式的磁碟映象並填充資料?
- Kubernetes 遷移節點 Kubelet 資料儲存目錄
- PB 級資料處理挑戰,Kubernetes如何助力基因分析?
- Hbase迎接電信TB級大資料洗禮之熱點網站功能實踐大資料網站
- docker 映象建立與使用Docker
- Spring Boot 建立 Docker 映象Spring BootDocker
- 基於Tp的千萬級資料圖片站
- 【故障公告】Kubernetes 叢集節點當機造成部落格站點故障
- 建立本地APT軟體包倉庫APT
- 如何利用 knest 構建資料中心的 Kubernetes as a Service?
- 切換阿里巴巴開源映象站映象——Kali映象阿里
- docker2-映象原理及建立新的映象Docker
- 美眾議院通過一套要求白宮建立一個APT資料庫的法案APT資料庫
- 資料庫映象 (SQL Server)資料庫SQLServer
- SL651-2014 《水文監測資料通訊規約》 中心站查詢遙測站實時資料詳解
- 國家級大資料工程研究中心落戶京東大資料
- HunggingFace的映象加速站
- echarts使用dataset資料集建立單軸散點圖Echarts
- 什麼工具可以採集獨立站點資料?如何分析資料?
- 靜默方式安裝、升級oracle(二): 建立資料庫Oracle資料庫
- Kubernetes 節點的預留資源
- 【Ubuntu】修改 apt-get 源為國內映象源的方法Ubuntuapt-get
- 傲視Kubernetes(二):Docker映象搭建與本地Kubernetes環境搭建Docker
- 阿里雲的ecs伺服器,建立ftp站點阿里伺服器FTP