這篇文章跟我上一篇《k8s搭建pip私有源devpi》過程相似:
準備知識:
須要對構建docker鏡像, k8s搭建、部署應用,對deployment (nodeSelect, node親和性等),service, ingress編寫yml文件熟悉,不熟悉的先去打一下基礎再來看node
(這裏使用node:latest鏡像,網上說用verdaccio/verdaccio鏡像,後面掛載主機共享存儲用來存放模塊包的時候啓動服務報錯,提示沒有權限寫入,由於verdaccio/verdaccio鏡像使用的是verdaccio用戶運行服務,雖然個人主機共享存儲設置了777權限,但仍是提示沒有權限寫入,因此後面我直接用node:latest鏡像root權限運行服務,問題解決了)python
FROM node:latest RUN mkdir -p /verdaccio/storage && \ npm_config_user=root npm install -g verdaccio WORKDIR /verdaccio EXPOSE 4873 CMD ["verdaccio","--config","/verdaccio/conf/config.yaml"]
開始build鏡像, 建立的鏡像名爲verdaccio, 注意"."會在當前目錄自動尋找Dockerfilenginx
(構建好鏡像以後,在本地就能看到名爲verdaccio的鏡像 : docker images 命令查看)
(
還能夠push到本身的docker鏡像倉庫(方便k8s在各個節點可以使用公有鏡像):
docker login xxx
docker push verdaccio
)web
(非必要,可用現有默認default名稱空間)docker
apiVersion: v1 kind: Namespace metadata: name: verdaccio labels: name: verdaccio
準備前:共享存儲
(1)節點直接掛載共享存儲 (在這裏使用此方法)
(2)使用PV, PVC部署共享存儲 (可選)
在要部署devpi的節點掛載共享存儲 (掛載分區爲 /data/verdaccio)用來存放服務配置文件,和存放模塊包,文章後面會提到
(必要)
開始編寫yml文件npm
apiVersion: apps/v1beta1 kind: Deployment metadata: name: verdaccio namespace: verdaccio labels: app: verdaccio spec: replicas: 1 template: metadata: labels: app: verdaccio spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node162 containers: - name: verdaccio image: verdaccio securityContext: privileged: true ports: - containerPort: 4873 volumeMounts: - name: hosts mountPath: /etc/hosts - name: storage mountPath: /verdaccio/storage - name: conf mountPath: /verdaccio/conf imagePullSecrets: - name: verdaccio volumes: - name: hosts hostPath: path: /etc/hosts - name: storage hostPath: path: /data/verdaccio/storage - name: conf hostPath: path: /data/verdaccio/conf
相關字段解釋:
nodeAffinity: values: - node162 (部署pod的節點名爲node 162, 根據自身狀況修改)
image: verdaccio (使用本身第三步構建的鏡像,根據自身狀況修改)
volumeMounts:
mountPath: /verdaccio/storage (用於存放模塊文件)
mountPath: /verdaccio/conf (用於存放服務啓動配置文件(config.yaml)和密碼文件(htpasswd), 下面提供配置文件)
volumes:
path: /data/verdaccio/storage (節點物理機路徑,用於掛載到pod /verdaccio/storage)
path: /data/verdaccio/conf (節點物理機路徑, 用於掛載到pod /verdaccio/conf )api
storage: /verdaccio/storage auth: htpasswd: file: /verdaccio/conf/htpasswd security: api: jwt: sign: expiresIn: 60d notBefore: 1 web: sign: expiresIn: 7d uplinks: # 代理官方源庫,當本地沒有查找到模塊,就會去官方下載到本地緩存 npmjs: url: https://registry.npmjs.org/ packages: '@jota/*': access: $all publish: $all '@*/*': # scoped packages access: $all publish: $all proxy: npmjs '**': access: $all # allow all known users to publish packages # (anyone can register by default, remember?) publish: $all # if package is not available locally, proxy requests to 'npmjs' registry proxy: npmjs middlewares: audit: enabled: true logs: - {type: stdout, format: pretty, level: trace} #- {type: file, path: verdaccio.log, level: info} #偵聽的端口 listen: 0.0.0.0:4873
請用(htpasswd /data/verdaccio/conf/htpasswd test)命令生成,保存到指定路徑,test這個用戶就是初始化用來默認登陸verdaccio,可自定義用戶名瀏覽器
準備前:
將verdaccio端口服務暴露出來
(1) nodePort (不採用,不能結合ingress使用)
(2) ClusterIP (這裏採用此種方式) 緩存
apiVersion: v1 kind: Service metadata: name: verdaccio namespace: verdaccio labels: app: verdaccio spec: type: ClusterIP ports: - name: http port: 80 targetPort: 4873 selector: app: verdaccio
準備前:對npm.test.local域名添加解析
添加verdaccio service的ingress域名app
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: verdaccio namespace: verdaccio spec: rules: - host: npm.test.local http: paths: - path: / backend: serviceName: verdaccio servicePort: 80
可使用test用戶登陸查看私有庫
###安裝
會發現首次會去官方庫下載,而後第二次安裝就會從本地私有庫緩存安裝
###發佈
###添加用戶