• 一文搞定全场景K3s离线安装


    作者简介

    王海龙,Rancher中国社区技术经理,负责Rancher中国技术社区的维护和运营。拥有6年的云计算领域经验,经历了OpenStack到Kubernetes的技术变革,无论底层操作系统Linux,还是虚拟化KVM或是Docker容器技术都有丰富的运维和实践经验。

    前 言

    K3s 是一个轻量级的 Kubernetes 发行版,在 2020 年统计的 K3s 下载量中,K3s 的全球下载量已经超过 100 万次,每周平均被安装超过 2 万次,其中 30%的下载量来自于中国。在国内已经有许多用户将 K3s 应用到了各种边缘计算和物联网设备中,同时也被广泛应用于智能工厂部署的生产线机器人和一些世界上最大型的风力发电厂当中。

    针对生产环境下的 K3s,一个不可逾越的问题就是离线安装。在你的离线环境需要准备以下 3 个组件:

    • K3s 的安装脚本

    • K3s 的二进制文件

    • K3s 依赖的镜像

    以上三个组件都可以通过K3s Release页面(https://github.com/k3s-io/k3s/releases )下载,如果在国内使用,推荐从 http://mirror.cnrancher.com 获得这些组件。

    笔者认为离线安装的重点在于K3s 依赖的镜像部分,因为 K3s 的"安装脚本"和"二进制文件"只需要下载到对应目录,然后赋予相应的权限即可,非常简单。但K3s 依赖的镜像的安装方式取决于你使用的是手动部署镜像还是私有镜像仓库,也取决于容器运行时使用的是containerd还是docker。

    针对不同的组合形式,可以分为以下几种形式来实现离线安装:

    • Containerd + 手动部署镜像方式

    • Docker + 手动部署镜像方式

    • Containerd + 私有镜像仓库方式

    • Docker + 私有镜像仓库方式

    Containerd + 手动部署镜像方式

    假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)、K3s 依赖的镜像(k3s-airgap-images-amd64.tar)下载到了/root目录下。

    如果你使用的容器运行时为containerd,在启动 K3s 时,它会检查/var/lib/rancher/k3s/agent/images/是否存在可用的镜像压缩包,如果存在,就将该镜像导入到containerd 镜像列表中。所以我们只需要下载 K3s 依赖的镜像到/var/lib/rancher/k3s/agent/images/目录,然后启动 K3s 即可。

    1、导入镜像到 containerd 镜像列表

    sudo mkdir -p /var/lib/rancher/k3s/agent/images/
    sudo cp /root/k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
    

    2、将 K3s 安装脚本和 K3s 二进制文件移动到对应目录并授予可执行权限

    sudo chmod a+x /root/k3s /root/k3s-install.sh
    sudo cp /root/k3s /usr/local/bin/
    

    3、安装 K3s

    INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
    

    稍等片刻,即可查看到 K3s 已经成功启动:

    root@k3s-docker:~# crictl images
    IMAGE                                      TAG                 IMAGE ID            SIZE
    docker.io/rancher/coredns-coredns          1.8.0               296a6d5035e2d       42.6MB
    docker.io/rancher/klipper-helm             v0.3.2              4be09ab862d40       146MB
    docker.io/rancher/klipper-lb               v0.1.2              897ce3c5fc8ff       6.46MB
    docker.io/rancher/library-busybox          1.31.1              1c35c44120825       1.44MB
    docker.io/rancher/library-traefik          1.7.19              aa764f7db3051       86.6MB
    docker.io/rancher/local-path-provisioner   v0.0.14             e422121c9c5f9       42MB
    docker.io/rancher/metrics-server           v0.3.6              9dd718864ce61       41.2MB
    docker.io/rancher/pause                    3.1                 da86e6ba6ca19       746kB
    
    root@k3s-docker:~# kubectl get pods -A
    NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
    kube-system   local-path-provisioner-7c458769fb-zdg9z   1/1     Running     0          38s
    kube-system   coredns-854c77959c-696gk                  1/1     Running     0          38s
    kube-system   metrics-server-86cbb8457f-hs6vw           1/1     Running     0          38s
    kube-system   helm-install-traefik-4pgcr                0/1     Completed   0          38s
    kube-system   svclb-traefik-bq7wl                       2/2     Running     0          17s
    kube-system   traefik-6f9cbd9bd4-jccd7                  1/1     Running     0          17s
    

    Docker + 手动部署镜像方式

    假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)、K3s 依赖的镜像(k3s-airgap-images-amd64.tar)下载到了/root目录下。

    与 containerd 不同,使用 docker 作为容器运行时,启动 K3s 不会导入/var/lib/rancher/k3s/agent/images/目录下的镜像。所以在启动 K3s 之前我们需要将 K3s 依赖的镜像手动导入到 docker 镜像列表中。

    1、导入镜像到 docker 镜像列表

    sudo docker load -i /root/k3s-airgap-images-amd64.tar
    

    2、将 K3s 安装脚本和 K3s 二进制文件移动到对应目录并授予可执行权限

    sudo chmod a+x /root/k3s /root/k3s-install.sh
    sudo cp /root/k3s /usr/local/bin/
    

    3、安装 K3s

    INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
    

    稍等片刻,即可查看到 K3s 已经成功启动:

    root@k3s-docker:~# docker images
    REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
    rancher/klipper-helm             v0.3.2              4be09ab862d4        7 weeks ago         145MB
    rancher/coredns-coredns          1.8.0               296a6d5035e2        2 months ago        42.5MB
    rancher/library-busybox          1.31.1              1c35c4412082        7 months ago        1.22MB
    rancher/local-path-provisioner   v0.0.14             e422121c9c5f        7 months ago        41.7MB
    rancher/library-traefik          1.7.19              aa764f7db305        14 months ago       85.7MB
    rancher/metrics-server           v0.3.6              9dd718864ce6        14 months ago       39.9MB
    rancher/klipper-lb               v0.1.2              897ce3c5fc8f        19 months ago       6.1MB
    rancher/pause                    3.1                 da86e6ba6ca1        3 years ago         742kB
    
    root@k3s-docker:~# kubectl get pods -A
    NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
    kube-system   metrics-server-86cbb8457f-8ckr6           1/1     Running     0          30s
    kube-system   local-path-provisioner-7c458769fb-vhkjr   1/1     Running     0          30s
    kube-system   helm-install-traefik-4b46c                0/1     Completed   0          31s
    kube-system   coredns-854c77959c-4ql8t                  1/1     Running     0          30s
    kube-system   svclb-traefik-kbtbx                       2/2     Running     0          27s
    kube-system   traefik-6f9cbd9bd4-rbm6k                  1/1     Running     0          27s
    

    Containerd + 私有镜像仓库方式

    假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)下载到了/root目录下。并且 K3s 所需要的镜像已经上传到了镜像仓库(本例的镜像仓库地址为:http://192.168.64.44:5000)。K3s 所需的镜像列表可以从 K3s Release页面的k3s-images.txt获得。

    1、配置 K3s 镜像仓库

    启动 K3s 默认会从docker.io拉取镜像。使用containerd容器运行时在离线安装时,我们只需要将镜像仓库地址配置到docker.io下的endpoint即可,更多配置说明请参考配置 containerd 镜像仓库完全攻略或K3s 官方文档:

    https://docs.rancher.cn/docs/k3s/installation/private-registry/_index/

    sudo mkdir -p /etc/rancher/k3s
    sudo cat >> /etc/rancher/k3s/registries.yaml <<EOF
    mirrors:
      "docker.io":
        endpoint:
          - "http://192.168.64.44:5000"
          - "https://registry-1.docker.io"
    EOF
    

    2、将 K3s 安装脚本和 K3s 二进制文件移动到对应目录并授予可执行权限

    sudo chmod a+x /root/k3s /root/k3s-install.sh
    sudo cp /root/k3s /usr/local/bin/
    

    3、安装 K3s

    INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
    

    稍等片刻,即可查看到 K3s 已经成功启动:

    root@k3s-containerd:~# crictl images
    IMAGE                                      TAG                 IMAGE ID            SIZE
    docker.io/rancher/coredns-coredns          1.8.0               296a6d5035e2d       12.9MB
    docker.io/rancher/klipper-helm             v0.3.2              4be09ab862d40       50.7MB
    docker.io/rancher/klipper-lb               v0.1.2              897ce3c5fc8ff       2.71MB
    docker.io/rancher/library-traefik          1.7.19              aa764f7db3051       24MB
    docker.io/rancher/local-path-provisioner   v0.0.14             e422121c9c5f9       13.4MB
    docker.io/rancher/metrics-server           v0.3.6              9dd718864ce61       10.5MB
    docker.io/rancher/pause                    3.1                 da86e6ba6ca19       326kB
    
    root@k3s-containerd:~# kubectl get pods -A
    NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
    kube-system   local-path-provisioner-7c458769fb-7w8hb   1/1     Running     0          37s
    kube-system   coredns-854c77959c-f8m2n                  1/1     Running     0          37s
    kube-system   helm-install-traefik-9lbrx                0/1     Completed   0          38s
    kube-system   svclb-traefik-x8f6f                       2/2     Running     0          29s
    kube-system   metrics-server-86cbb8457f-f7lb7           1/1     Running     0          37s
    kube-system   traefik-6f9cbd9bd4-4s66r                  1/1     Running     0          29s
    

    Docker + 私有镜像仓库方式

    假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)下载到了/root目录下。并且 K3s 所需要的镜像已经上传到了镜像仓库(本例的镜像仓库地址为:http://192.168.64.44:5000)。K3s 所需的镜像列表可以从 K3s Release页面的k3s-images.txt获得。

    1、配置 K3s 镜像仓库

    Docker 不支持像 containerd 那样可以通过修改 docker.io 对应的 endpoint(默认为 https://registry-1.docker.io)来间接修改默认镜像仓库的地址。但在Docker中可以通过配置registry-mirrors来实现从其他镜像仓库中获取K3s镜像。这样配置之后,会先从registry-mirrors配置的地址拉取镜像,如果获取不到才会从默认的docker.io获取镜像,从而满足了我们的需求。

    cat >> /etc/docker/daemon.json <<EOF
    {
        "registry-mirrors": ["http://192.168.64.44:5000"]
    }
    EOF
    
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

    2、将 K3s 安装脚本和 K3s 二进制文件移动到对应目录并授予可执行权限

    sudo chmod a+x /root/k3s /root/k3s-install.sh
    sudo cp /root/k3s /usr/local/bin/
    

    3、安装 K3s

    INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
    

    稍等片刻,即可查看到 K3s 已经成功启动:

    root@k3s-docker:~# docker images
    REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
    rancher/klipper-helm             v0.3.2              4be09ab862d4        7 weeks ago         145MB
    rancher/coredns-coredns          1.8.0               296a6d5035e2        2 months ago        42.5MB
    rancher/local-path-provisioner   v0.0.14             e422121c9c5f        7 months ago        41.7MB
    rancher/library-traefik          1.7.19              aa764f7db305        14 months ago       85.7MB
    rancher/metrics-server           v0.3.6              9dd718864ce6        14 months ago       39.9MB
    rancher/klipper-lb               v0.1.2              897ce3c5fc8f        19 months ago       6.1MB
    rancher/pause                    3.1                 da86e6ba6ca1        3 years ago         742kB
    
    root@k3s-docker:~# kubectl get pods -A
    NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
    kube-system   helm-install-traefik-bcclh                0/1     Completed   0          33s
    kube-system   coredns-854c77959c-kp85f                  1/1     Running     0          33s
    kube-system   metrics-server-86cbb8457f-85fpd           1/1     Running     0          33s
    kube-system   local-path-provisioner-7c458769fb-r5nkw   1/1     Running     0          33s
    kube-system   svclb-traefik-rbmhk                       2/2     Running     0          24s
    kube-system   traefik-6f9cbd9bd4-k6t9n                  1/1     Running     0          24s
    

    后 记

    手动部署镜像方式比较适合小规模安装、节点数量不多的场景。私有镜像仓库比较适合规模比较大节点数比较多的集群。本文的docker registry采用的是最简单的搭建方式docker run -d -p 5000:5000 --restart=always --name registry registry:2,可能在你的环境中由于镜像仓库的搭建方式不同,你可能需要修改一些关于registry的参数。

    参考资料

    K3s离线安装文档:

    https://docs.rancher.cn/docs/k3s/installation/airgap/_index/

  • 相关阅读:
    学习
    2018年看书计划(40本)
    java快排(两种方法)
    max-points-on-a-line
    Angular不同版本对应的Bootstrap组件
    AngularCLI介绍及配置文件主要参数含义解析
    D3——Updates, Transitions, and Motion
    SVG中的元素属性
    D3——Axes
    Angular2.0知识架构图
  • 原文地址:https://www.cnblogs.com/k3s2019/p/14339547.html
Copyright © 2020-2023  润新知