自己本地搭建了个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