[转帖]k8s containerd私有仓库配置及常用命令

k8s,containerd,私有,仓库,配置,常用命令 · 浏览次数 : 0

小编点评

**ctr私有仓库配置以及使用** **1. 下载docker私有仓库镜像** ```bash docker.io/library/registry:latest ctr images import registry.tarmkdir /home/registry/certs/domain.crt ``` **2. 创建deployment** ```bash kubectl create deployment registry -n registry --image=harbor.test.in/iamge/registry-server:v1.0 ``` **3. 配置使用私有仓库** ```bash mkdir /etc/rancher/k3s/touch /etc/rancher/k3s/registries.yamlcat >> /etc/rancher/k3s/registries.yaml ``` **4. 添加harbor域名映射** ```bash vi /etc/hosts192.168.1.10 harbor.test.in10.67.240.91 registry-1.docker.io访问: ``` **5. 测试(默认push到443端口,以ctr部署为例)** ```bash 修改镜像tag ctr i tag docker.io/rancher/pause:3.1 harbor.test.in:5000/library/pause:3.1 push到本地私有仓库 ctr i push harbor.test.in:5000/library/pause:3.1 ``` **6. 查看containerd运行时某个pod对应的主机虚拟网卡信息** ```bash brctl show ``` **7. 进入容器netns,24739为进程idethtool -S eth0 ``` **8. 查看容器对应的主机网卡id NIC statistics ```bash crictl ps ``` **9. 获取容器在主机上的工作目录nsenter -n -t 24739 ``` **10. 进入容器netns,24739为进程idethtool -S eth0 ``` **11. 查看容器对应的主机网卡id NIC statistics ```bash crictl inspect f3a1d5beb595c | grep -i pid ```

正文

containerd相关

一、修改containerd配置文件,添加私有仓库配置

 查看containerd的默认配置
 containerd config default  

    k3s集群配置文件位置:
    /etc/rancher/k3s/registries.yaml
    /var/lib/rancher/k3s/agent/etc/containerd/config.toml

    (1)修改配置文件,内容如下:
    cat >> /etc/rancher/k3s/registries.yaml <<EOF
    mirrors:
      "harbor.test.in":
        endpoint:
          - "https://harbor.test.in"
      "docker.io":
        endpoint:
          - "https://registry-1.docker.io"
    configs:
      "harbor.test.in":
        auth:
          username: admin # this is the registry username
          password: 123456 # this is the registry password
        tls:
          ca_file: /etc/ssl/harbor.test.in.crt
    EOF
    

    (2)配置信任私有证书(k8s同样操作):
    cp /etc/ssl/harbor.test.in.crt /etc/pki/ca-trust/source/anchors/
    update-ca-trust extract

    (3)重启k3s:
    (经确认:不重启k3s,/var/lib/rancher/k3s/agent/etc/containerd/config.toml文件内容不会更新)
    systemctl restart k3s #master
    systemctl restart k3s-agent #work
    注意:work节点需要先创建目录/etc/rancher/k3s/

    (4)查看containerd的配置:
    cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml

      参考:https://www.infoq.cn/article/jizyup2sl30kkfqjfbl
      ​ https://rancher.com/docs/k3s/latest/en/installation/private-registry/

      二、containerd常用命令行工具

      安装k3s集群时默认安装以下两个工具:

      ctr:是containerd本身的CLI (对镜像相关操作,推荐ctr)
      crictl :是Kubernetes社区定义的专门CLI工具(推荐使用)

      containerd命令docker命令注解其他
      crictl pulldocker pull拉取镜像
      crictl imagesdocker images查看镜像crictl images -q 只打印镜像id
      crictl inspectidocker inspect查看镜像详情
      crictl rmidocker rmi删除镜像
      docker push推送镜像可使用ctr image push
      docker load/save -i导入/导出镜像可使用ctr images import/export
      crictl psdocker ps查看容器
      crictl inspectdocker inspect查看容器详情
      crictl logsdocker logs查看容器日志
      crictl execdocker exec容器内执行命令
      crictl statsdocker stats查看容器资源使用情况
      crictl createdocker create创建容器
      crictl start/stopdocker start/stop启动/停止容器
      crictl rmdocker rm删除容器
      crictl pods查看Pod列表
      crictl inspectp查看Pod详情
      crictl runp启动Pod
      crictl stopp停止Pod

      crictl工具缺点:
      (1)无法给镜像打tag,需要使用docker或ctr打好镜像标签
      (2)无法导入/导出镜像

      三、使用ctr导入/导出镜像

      docker save -o stmp.tar 1a93cf297986    //1a93cf297986为镜像id
      ctr image import stmp.tar  //导入镜像。docker save -o 时,不能使用镜像id,要使用镜像名:tag,避免导入报错
      ctr image ls     //查看镜像列表
      ctr images export  stmp.tar <image-name>  //ctr工具导出镜像命令
      

        导出镜像遇到报错:

        ctr: failed to dial “/run/containerd/containerd.sock”: context deadline exceeded

        参考解决:https://github.com/containerd/containerd/issues/2758

        常用命令:

        ctr命令示例说明
        ctr image lsctr -n k8s.io i ls查看本地镜像
        ctr image pullctr image pull docker.io/library/nginx:alpine拉取镜像
        ctr image pushctr image push --plain-http --user admin:123456 192.168.20.11/test/coredns:1.2.0 或者
        ctr -n=k8s.io image push --user admin:Harbor12345 harbor.test.in/security/sonarqube:8.9.2-community
        推送镜像
        ctr image importctr image import coredns.tar 或者 ctr --namespace default image import pg_dump.tar - docker.v1.1导入镜像
        ctr image exportctr image export coredns.tar 192.168.20.11/source/coredns:1.2.0导出镜像
        ctr image tagctr -n=k8s.io image tag docker.io/library/sonarqube:8.9.2-community harbor.test.in/security/sonarqube:8.9.2-community打镜像标签
        ctr image rmctr image rm docker.io/rancher/pause:3.1 或 ctr i rm docker.io/rancher/pause:3.1删除镜像
        ctr namespaces lsctr namespaces ls查看命名空间
        ctr task ls查看运行的容器

        注意

        有的环境使用ctr导入镜像后,启动容器无法识别导入的镜像!

        此时:ctr image ls 可以查看到镜像列表,但使用crictl images ls 无法查看到导入的镜像。

        原因:镜像导入需在特定目录(/var/lib/rancher/k3s/agent/images/)执行导入命令,必要时导入镜像后,需要重启k3s

        相关命令:
        ctr -n=k8s.io image import xxx.tar    (-n=k8s.io必不可少,否则导入的镜像无法用于集群)
        crictl image list   <==>   ctr -n=k8s.io image list
        

          四、ctr私有仓库配置以及使用

          1、运行私有仓库
          1.1 下载docker私有仓库镜像
          镜像:docker.io/library/registry:latest
          ctr images import registry.tar
          mkdir /home/registry
          
            1.2 生成证书

            生成证书(需使用最新版的openssl:https://blog.csdn.net/jugtba/article/details/115484589):

            mkdir /home/registry/certs
            cd /home/registry/
            openssl req \
              -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
              -addext "subjectAltName = DNS:registry-1.docker.io" \
              -x509 -days 365 -out certs/domain.crt
            

              查看证书有效期

              openssl x509 -in domain.crt -noout -dates
              
                1.3 创建registry配置文件

                配置私有仓库config.yml,内容如下:

                version: 0.1
                log:
                  fields:
                    service: registry
                storage:
                  cache:
                    blobdescriptor: inmemory
                  filesystem:
                    rootdirectory: /var/lib/registry
                http:
                  addr: :5000      #运行到虚拟机上面不能使用443端口,运行到k8s环境中可以使用443端口
                  tls:
                    certificate: /home/registry/certs/domain.crt
                    key: /home/registry/certs/domain.key
                health:
                  storagedriver:
                    enabled: true
                    interval: 10s
                    threshold: 3
                
                  1.4 运行私有仓库

                  方法一:运行容器(ctr命令)

                  ctr run --null-io --net-host  -d --mount type=bind,src=/home/registry,dst=/var/lib/registry,options=rbind:rw   --mount type=bind,src=/home/registry/certs,dst=/certs,options=rbind:rw --mount type=bind,src=/home/registry/config.yml,dst=/etc/docker/registry/config.yml,options=rbind:rw   docker.io/library/registry:latest   v2
                  ##src=/home/registry  表示设置改目录为存放镜像路径
                  

                    查看容器创建是否成功

                    ctr c list
                    netstat -tulnp|grep 5000
                    

                      方法二:deployment运行私有仓库

                      镜像名: harbor.test.in/image/registry-server:v1.0 创建deployment:

                      kubectl create deployment registry -n registry --image=harbor.test.in/iamge/registry-server:v1.0
                      

                        创建service

                        kubectl expose deployment registry -n registry --type=NodePort --port=443 --target-port=443
                        
                          2、配置使用私有仓库(所有节点)
                          mkdir /etc/rancher/k3s/
                          touch /etc/rancher/k3s/registries.yaml
                          cat >> /etc/rancher/k3s/registries.yaml  <<EOF
                          mirrors:
                            "harbor.test.in":
                              endpoint:
                                - "https://harbor.test.in:5000" 
                          configs:
                            "harbor.test.in:5000":
                              tls:
                                ca_file: /home/registry/certs/domain.crt
                          EOF
                          

                          重启k3s服务
                          systemctl restart k3s 或 systemctl restart k3s-agent

                            查看配置 cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml

                            配置主机信任自签名证书

                            cp /home/registry/certs/* /etc/pki/ca-trust/source/anchors/
                            update-ca-trust extract
                            
                            • 1
                            • 2
                            3、添加harbor域名映射:
                            vi /etc/hosts
                            192.168.1.10 harbor.test.in
                            

                            10.67.240.91 registry-1.docker.io

                            访问:https://192.168.1.10:5000/v2/_catalog
                            或https://harbor.test.in:5000/v2/_catalog

                              4、测试(默认push到443端口,以ctr部署为例):

                              修改镜像tag

                              ctr i tag docker.io/rancher/pause:3.1 harbor.test.in:5000/library/pause:3.1
                              

                                push到本地私有仓库

                                ctr i push harbor.test.in:5000/library/pause:3.1
                                

                                  五、查看containerd运行时某个pod对应的主机虚拟网卡信息

                                  brctl show           //查看虚拟化网络设备列表
                                  crictl ps            //找到运行的pod对应的containerd id,如:f3a1d5beb595c
                                  

                                    crictl inspect f3a1d5beb595c | grep -i pid //查看该containerd对应的进程id

                                    "pid": 24739,
                                            "pid": 1
                                            "type": "pid"
                                    
                                      crictl inspect f3a1d5beb595c | grep proc        //获取容器在主机上的工作目录
                                      nsenter -n -t 24739                             //进入容器netns,24739为进程id
                                      ethtool -S  eth0                             //查看容器对应的主机网卡id
                                      
                                        NIC statistics:
                                             peer_ifindex: 52
                                        

                                          主机上输入:ip a

                                          找到52对应的网卡名:vetha0e21ec6

                                          手动设置网络该网卡延迟时间:tc qdisc add dev vetha0e21ec6 root netem delay 100ms

                                          此时ping该pod ip:

                                          [root@node1 ~]# ping 10.50.13.36
                                          PING 10.50.13.36 (10.50.13.36) 56(84) bytes of data.
                                          64 bytes from 10.50.13.36: icmp_seq=1 ttl=63 time=100 ms
                                          64 bytes from 10.50.13.36: icmp_seq=2 ttl=63 time=100 ms
                                          64 bytes from 10.50.13.36: icmp_seq=3 ttl=63 time=100 ms
                                          64 bytes from 10.50.13.36: icmp_seq=4 ttl=63 time=100 ms
                                          

                                            与[转帖]k8s containerd私有仓库配置及常用命令相似的内容:

                                            [转帖]k8s containerd私有仓库配置及常用命令

                                            containerd相关 一、修改containerd配置文件,添加私有仓库配置 查看containerd的默认配置 containerd config default k3s集群配置文件位置: /etc/rancher/k3s/registries.yaml /var/lib/rancher/k3

                                            [转帖]【k8s】二、containerd的安装

                                            目录 前言 安装containerd 解压安装 配置成systemd任务 安装runc ​编辑 安装cni 配置containerd镜像源 containerd基本使用 拓展阅读 nerdctl工具安装及使用 整体脚本 总结 写在后面 前言 上一篇文章,我们介绍了虚拟机的基础环境以及基础的网络配置,

                                            [转帖]k8s学习-containerd命令行工具crictl使用

                                            在最新k8s的版本中,containerdruntime已经不在使用docker,而是使用containerd了。​containerd是什么?containerd的自我介绍中说它是一个开放、可靠的容器运行时,实际上它包含了单机运行一个容器运行时的功能。 containerd为了支持多种OCI Ru

                                            [转帖]k8s系列-06-containerd的基本操作

                                            https://www.jianshu.com/p/52a2884594f5 上一篇我们介绍了containerd的安装,本篇我们来简单介绍下如何进行使用。 环境 linux服务器 前置安装 躺过的坑,需要安装下面内容,否则执行ctr run的时候会报错如下: ctr: failed to crea

                                            [转帖]用buildkit和containerd构建镜像

                                            https://zhuanlan.zhihu.com/p/366671300 最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://gith

                                            [转帖]用buildkit和containerd构建镜像

                                            https://zhuanlan.zhihu.com/p/366671300 最近因为K8s抛弃Docker了,所以就只装了个containerd,这样就需要一个单独的镜像构建工具了,就用了buildkit,这也是Docker公司扶持的,他们公司的人出来搞的开源工具,官网在 https://gith

                                            [转帖]k8s镜像拉取策略 - imagePullPolicy

                                            镜像拉取方式选择k8s-imagePullPolicy containers: - name: uses-private-image image: $PRIVATE_IMAGE_NAME imagePullPolicy: Always command: [ "echo", "SUCCESS" ] k

                                            [转帖]如何使用Calico实现跨主机Docker网络通信

                                            https://blog.csdn.net/sanhewuyang/article/details/122004156 写在前面 学习K8s,学到这里,整理记忆,本文用于理解K8s网络中Calico网路方案的原理优缺点内容包括:常见的容器跨主机通信方案简介Caliao实现Container跨主机通信

                                            [转帖]k8s发布Spring cloud+eureka架构服务优雅启动停止方案

                                            本文转载自昆仑枫的简书https://www.jianshu.com/p/6d393cbb694a Spring cloud+eureka是目前微服务主流解决方案之一,kubernetes则是广泛应用的发布工具,两者结合使用很常见。而两者结合时如何优雅启停从而实现无感发布很关键。下面将从不做特殊处理

                                            [转帖]K8S部署Redis Cluster集群(三主三从模式) - 部署笔记

                                            https://www.cnblogs.com/cheyunhua/p/15619317.html 一、Redis 介绍 Redis代表REmote DIctionary Server是一种开源的内存中数据存储,通常用作数据库,缓存或消息代理。它可以存储和操作高级数据类型,例如列表,地图,集合和排序