k8s 结合docker搭建私有仓库
准备了两台虚拟机
环境安装参考 https://www.cnblogs.com/spll/p/10033316.html
安装好之后需要搭建自己的私有docker仓库,以后拉取、推送镜像就走自己的仓库。
以下操作在master上面操作
1.先拉取仓库镜像
docker pull registry
2.创建一个文件夹用来放用户名密码,然后在新创建一个账户
mkdir /var/auth docker run --entrypoint htpasswd registry:latest -Bbn lijinlong 123456 >/var/auth/htpasswd
cat /var/auth/htpasswd
3.Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。然后将宿主机的/var/auth目录挂载到镜像的/auth目录下,然后指定这个目录下的htpasswd文件来进行认证
docker run -d -v /opt/registry:/var/lib/registry -v /var/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 5000:5000 --restart=always --name registry registry:latest
参数解析:
-p 5000:5000,指定registry的端口是5000并映射成主机的5000端口。
-v /opt/registry:/var/lib/registry,将本地的/opt/registry挂载到镜像默认存储路径 /var/lib/registry。
-v /var/auth:/auth 将第二步生成auth文件夹挂在到镜像auth目录。
-e REGISTRY_AUTH=htpasswd, -e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm,这两个参数组合启动基本身份验证。
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd,指定使用的密码认证文件是/auth/htpasswd。(注意,使用的是容器里面的路径,前面我们已经将/var/auth挂在到/auth)
如果有https证书,可以加上以下参数:
-v /usr/local/nginx/conf/cert:/certs,如果有https认证,将宿主机保存的认证文件挂到容器里。
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.pem,-e REGISTRY_HTTP_TLS_KEY=/certs/server.key 指定https证书和key。
–restart=always,重启方式为always。
–name registry,指定容器名称。
registry,镜像名称。
4.登陆
5.接下来就是push镜像到仓库,然后其他node拉取镜像并运行。
1 #给镜像打标签 2 docker tag web1image 192.168.183.130:5000/dotnetcoretest3 #推送镜像 4 docker push 192.168.183.130:5000/dotnetcoretest5 #查看镜像 6 ls /opt/registry/docker/registry/v2/repositories/ 7 curl -u lijinlong:123456 192.168.183.130:5000/v2/_catalog 8 #拉取镜像 9 docker pull 192.168.183.130:5000/dotnetcoretest:latest
出现http: server gave HTTP response to HTTPS client错误(node节点也需要加入)
vim /etc/docker/daemon.json #加入信任名单 { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries":["192.168.183.130:5000"] }
出现认证未通过的问题
检查登陆docker仓库的ip是否和推送的一致,我这里push使用的是ip,如果用本机127.0.0.1是不行的,需要先在192.168.183.128登陆docker仓库
6.接下来就是kubernetes使用我们搭建的私有仓库了。
首先,在我们使用的namespace创建一个secrets用于保存我们登陆仓库使用的用户名和密码(注意namespace要和你应用程序使用的namespace一致)
kubectl create secret docker-registry registry-secret-name --docker-server=192.168.183.130:5000 --docker-username=lijinlong --docker-password=123456 -n aspnetcore
创建成功后,使用以下命令查看
kubectl get secrets -n aspnetcore
也可以在我们之前搭建的dashboard查看
7.接下来就是在我们的yaml文件里面使用(注意标红的)
apiVersion: apps/v1 kind: Deployment # 定义Kubernetes资源的类型为Deployment metadata: name: demo-webtest-deployment # 定义资源的名称 namespace: aspnetcore #命名空间 labels: app: demo-webtest-deployment spec: # 定义资源的状态。 replicas: 2 # 定义我们想运行多少个Pod,在这里我们希望运行2个 selector: matchLabels: # 定义该部署匹配哪些Pod app: demo-webtest minReadySeconds: 5 # 可选,指定Pod可以变成可用状态的最小秒数,默认是0 strategy: # 指定更新版本时,部署使用的策略 type: RollingUpdate # 策略类型,使用RollingUpdate可以保证部署期间服务不间断 rollingUpdate: maxUnavailable: 1 # 部署时最大允许停止的Pod数量(与replicas相比) maxSurge: 1 # 部署时最大允许创建的Pod数量(与replicas相比) template: # 用来指定Pod的模板,与Pod的定义类似 metadata: labels: # 根据模板创建的Pod会被贴上该标签,与上面的matchLabels对应 app: demo-webtest spec: imagePullSecrets: #指定访问仓库使用的密码 - name: registry-secret-name containers: - name: webtest image: 192.168.183.130:5000/dotnetcoretest #镜像修改为自己的私有仓库地址 imagePullPolicy: IfNotPresent # 默认是IfNotPresent,如果设置成Always,则每一次部署都会重新拉取容器映像(否则,如果本地存在指定的镜像版本,就不会再去拉取) ports: - containerPort: 80 --- apiVersion: v1 kind: Service # 定义Kubernetes资源的类型为Service metadata: name: demo-webtest-service # 定义资源的名称 namespace: aspnetcore #命名空间 spec: selector: # 指定对应的Pod app: demo-webtest # 指定Pod的标签为demo-webtest ports: - protocol: TCP # 协议类型 port: 80 # 指定Service访问的端口 targetPort: 80 # 指定Service转发请求的端口 nodePort: 30100 type: NodePort # 指定Service的类型,在这里使用NodePort来对外访问
8.成功