• 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.成功

  • 相关阅读:
    Atitit.js图表控件总结
    atitit.attilax的软件 架构 理念.docx
    Atitit.异常处理 嵌套  冗长的解决方案
    Atitit.异常处理 嵌套  冗长的解决方案
    Atitit.atiagent  agent分销系统 代理系统 设计文档
    Atitit.atiagent  agent分销系统 代理系统 设计文档
    Atitit ati licenseService    设计原理
    Atitit ati licenseService    设计原理
    Atitit.项目修改补丁打包工具 使用说明
    Atitit.项目修改补丁打包工具 使用说明
  • 原文地址:https://www.cnblogs.com/FateHuli/p/11836968.html
Copyright © 2020-2023  润新知