之前做过使用docker来启动registry私库,在使用了Kubernetes之后,容器的形式都变成了Pod,也不会去想只有一个registry还是去使用docker来去启动,所以本文是作者本人自己去写的一些内容来做的registry以及验证。版权纯属于本博主
创建私库的本地存放目录,会将Pod内的存储目录映射到该目录
[root@node1 ~]# mkdir /opt/data/registry -p
编写启动registry的yaml文件
[root@node1 ~]# vim registry.yaml
---
# 先创建一个用于测试的namespace
apiVersion: v1
kind: Namespace
metadata:
name: test
labels:
name: test
---
# 创建Deployment来启动registry的pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: registry-deployment # Deployment的名字
namespace: test # 部署到指定的namespace
spec:
replicas: 1 # 副本数量为1
selector:
matchLabels:
app: registry # label标签
template:
metadata:
labels:
app: registry
spec:
nodeSelector: # 运行到指定节点,这里是指定到master节点
node-role.kubernetes.io/master: ""
restartPolicy: Always # pod重启策略,无论遇到什么错误都重启pod
hostNetwork: true # 使用宿主机网络
containers: # 编写容器信息
- name: registry
image: registry:2 # 指定pod使用的镜像
imagePullPolicy: IfNotPresent # 镜像下载策略,本地没有则下载
ports:
- name: registry-port
containerPort: 5000 # 容器内的端口号
hostPort: 5000 # 宿主机中的端口号
protocol: TCP # 使用TCP协议
volumeMounts: # 指定容器内的存储目录,name不能使用下划线
- name: registry-save
mountPath: /var/lib/registry
volumes:
- name: registry-save
hostPath:
path: /opt/data/registry # 将指定的容器内目录映射到宿主机的此目录
运行registry
如果要将registry部署在master节点,节点中的taint需要取消
[root@node1 ~]# kubectl taint node {master_node_name} node-role.kubernetes.io/master-
node/node1 untainted
开始部署
[root@node1 ~]# kubectl apply -f registry.yaml
namespace/test created
deployment.apps/registry-deployment created
查看宿主机的5000端口是否启用
[root@node1 ~]# netstat -anput | grep 5000
tcp6 0 0 :::5000 :::* LISTEN 127044/registry
访问docker私库
因为使用了hostnetwork,所以可以直接访问宿主机的端口
[root@node1 ~]# curl http://192.168.1.11:5000/v2/_catalog
{"repositories":[]}
设置集群节点的默认仓库为创建的registry
三台节点都要更改
vim /usr/lib/systemd/system/docker.service
# 14行的末尾添加--insecure-registry 192.168.1.11:5000
# 14行也就是以ExecStart开头的一行
重新加载docker配置文件,并重启服务
systemctl daemon-reload
systemctl restart docker
测试使用一个image上传到registry
在master上进行操作
# 先下载两个镜像httpd/nginx
[root@node1 ~]# docker pull httpd
[root@node1 ~]# docker pull niginx
将下载的镜像更改标签
使用tag为镜像改个名字
注意:改名字要按照格式来私库ip:5000/镜像名
[root@node1 ~]# docker tag httpd:latest 192.168.1.11:5000/httpd
[root@node1 ~]# docker tag nginx:latest 192.168.1.11:5000/nginx
此时镜像名的作用:push到私库中(私库ip:5000)
上传到私库
[root@node1 ~]# docker push 192.168.1.11:5000/httpd
[root@node1 ~]# docker push 192.168.1.11:5000/nginx
在node节点查看下载
[root@node2 ~]# curl 192.168.1.11:5000/v2/_catalog
{"repositories":["httpd","nginx"]}
[root@node2 ~]# docker pull 192.168.1.11:5000/nginx
OK,Successful!~