自己本地搭建了個k8s集群后,因為沒有設置本地倉庫,以至於每次打包好的鏡像服務都需要每個節點傳一遍,很不方便,於是自己搭建了一個本地倉庫供k8s集群使用。
1.拉取倉庫容器鏡像
docker pull registry
2.修改/etc/docker/daemon.json
{ "exec-opts": ["native.cgroupdriver=systemd"], "insecure-registries":["192.168.1.188:9876"], "registry-mirrors":["http://192.168.1.188:9876"] }
3.重啟docker以及容器
systemctl daemon-reload && systemctl restart docker && docker start $(docker ps -aq)
4.啟動倉庫容器
docker run -d -p 9876:5000 -v /opt/data/registry:/var/lib/registry docker.io/registry
因為倉庫容器會將上傳的鏡像存儲在/var/lib/registry,所以最好掛一個稍微大一點的盤放這用以存放鏡像。
5.上傳鏡像
因為現在已經無法修改默認倉庫了,所以上傳時候必須先打tag,再按tag上傳
docker tag mysql:base 192.168.1.188:9876/mysql:latest
docker push 192.168.1.188:9876/mysql:latest
6.下載鏡像
同理,也需要指定本地倉庫的IP與端口
docker pull 192.168.1.188:9876/mysql:latest
這個時候就可以體驗嗖嗖嗖一般的鏡像下載速度了,來個deployment
apiVersion: apps/v1 #指定api版本,此值必須在kubectl apiversion中 kind: Deployment #指定創建資源的角色/類型 metadata: #資源的元數據/屬性 name: redis #資源的名字,在同一個namespace中必須唯一 labels: #設定資源的標簽 k8s-app: redis version: v1 kubernetes.io/cluster-service: "true" annotations: #自定義注解列表 name: String #自定義注解名字 spec: #specification of the resource content 指定該資源的內容 replicas: 1 selector: matchLabels: redis: master #節點選擇,先給主機打標簽kubectl label nodes kube-node1 zone=node1 template: metadata: labels: redis: master #模板名稱必填 # restartPolicy: Always #表明該容器一直運行,默認k8s的策略,在此容器退出后,會立即創建一個相同的容器 spec: containers: - name: redis #容器的名字 image: 192.168.1.188:9876/redis:base #容器使用的鏡像地址 imagePullPolicy: IfNotPresent #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略, # Always,每次都檢查 # Never,每次都不檢查(不管本地是否有) # IfNotPresent,如果本地有就不檢查,如果沒有就拉取 command: ['/opt/start.sh'] #啟動容器的運行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT args: [""] #啟動容器的命令參數,對應Dockerfile中CMD參數 resources: #資源管理 requests: #容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行 cpu: 0.2 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m) memory: 32Mi #內存使用量 limits: #資源限制 cpu: 1 memory: 1000Mi ports: - containerPort: 6379 #容器開發對外的端口 name: httpd #名稱 protocol: TCP lifecycle: #生命周期管理 postStart: #容器運行之前運行的任務 exec: command: ["bash"] preStop: #容器關閉之前運行的任務 exec: command: ["bash"] volumeMounts: #掛載持久存儲卷 - name: redis-data #掛載設備的名字,與volumes[*].name 需要對應 mountPath: /opt/redis/data #掛載到容器的某個路徑下 readOnly: False volumes: #定義一組掛載設備 - name: redis-data #定義一個掛載設備的名字 hostPath: path: /opt/redis/data #掛載設備類型為hostPath,路徑為宿主機下的/opt,這里設備類型支持很多種
kubectl create -f deployment.yaml -n kube-system #非常迅速的就可以拉起pod,當然前提是已經打好標簽 kubectl label nodes centos02 redis=master
如果需要端口被本地的調試服務訪問,還可以再部署個service暴露服務。
apiVersion: v1 kind: Service metadata: name: redis-service spec: type: NodePort selector: redis: master ports: - protocol: TCP port: 6379 nodePort: 30001