离线场景的使用

提醒事项

  • 针对 RHEL 8.4 系列,由于包依赖问题,执行过程中会卸载系统预装的 fuse 包

准备事项

  1. 需要预先部署的服务:

  2. 需要安装的必要工具:

    • 用于导入镜像文件的工具: skopeo,需要 >=1.9.2; podman, Required >= 4.4.4
    • 用于导入二进制文件的工具: minio client
  3. 通过Helm部署kubean

下载离线资源

通过 Github Releases 页面可以下载我们想要版本的离线资源。

离线资源的基本说明:

  1. ├── files.list # 文件内容的列表
  2. ├── files-${tag}.tar.gz # 文件压缩包, 内含导入脚本
  3. ├── images.list # 镜像内容的列表
  4. ├── images-${tag}.tar.gz # 镜像压缩包, 内含导入脚本
  5. └── os-pkgs-${linux_distribution}-${tag}.tar.gz # 各系统压缩包, 内含导入脚本

将离线资源导入对应服务

1. Binaries 资源的导入

请先解压 files-${tag}.tar.gz 文件, 其内部包含:

  1. files/
  2. ├── import_files.sh # 该脚本用于导入二进制文件到 minio 文件服务
  3. └── offline-files.tar.gz # 二进制文件的压缩包

执行如下命令, 将二进制文件导入到 minio 服务中:

  1. $ MINIO_USER=${username} MINIO_PASS=${password} ./import_files.sh ${minio_address}
  • minio_addressminio API Server地址,端口一般为9000,比如 http://1.2.3.4:9000

2. Images 资源的导入

需要解压 images-${tag}.tar.gz 文件, 其内部包含:

  1. images/
  2. ├── import_images.sh # 该脚本用于导入镜像文件到 docker registry 或 harbor 镜像仓库服务, 可用于合并不同平台镜像
  3. └── offline-images.tar.gz # 镜像文件的压缩包

执行如下命令, 将镜像文件导入到 docker registry 或 harbor 镜像仓库服务中:

  1. # 1. 免密模式
  2. $ REGISTRY_SCHEME=http REGISTRY_ADDR=${registry_address} ./import_images.sh
  3. # 2. 用户名口令模式
  4. $ REGISTRY_SCHEME=https REGISTRY_ADDR=${registry_address} REGISTRY_USER=${username} REGISTRY_PASS=${password} ./import_images.sh
  • REGISTRY_ADDR 是镜像仓库的地址,比如1.2.3.4:5000
  • 当镜像仓库存在用户名密码验证时,需要设置 REGISTRY_USERREGISTRY_PASS

3. OS packages 资源的导入

注意:

  • 目前支持 Centos / Redhat / Kylin / Ubuntu 等发行版的 OS Packages 资源
  • 统信 UnionTech V20 系列的 OS Package 需要手动构建,构建方法见 README

需要解压 os-pkgs-${linux_distribution}-${tag}.tar.gz 文件, 其内部包含:

  1. os-pkgs
  2. ├── import_ospkgs.sh # 该脚本用于导入 os packages 到 minio 文件服务
  3. ├── os-pkgs-amd64.tar.gz # amd64 架构的 os packages 包
  4. ├── os-pkgs-arm64.tar.gz # arm64 架构的 os packages 包
  5. └── os-pkgs.sha256sum.txt # os packages 包的 sha256sum 效验文件

执行如下命令, 将 os packages 包到 minio 文件服务中:

  1. $ MINIO_USER=${username} MINIO_PASS=${password} ./import_ospkgs.sh ${minio_address} os-pkgs-${arch}.tar.gz

建立离线源

下面的【建立本地ISO镜像源】与【建立在线ISO镜像源】只需要执行其中一个即可。

1. 建立ISO镜像源

1.1 建立本地 ISO 镜像源

OS Packages 主要用于解决 docker-ce 的安装依赖, 但在实际的离线部署过程中, 可能还需要使用到发行版系统的其他包, 此时需要建立本地 ISO 镜像源.

注: 我们需要提前下载主机对应的 ISO 系统发行版镜像, 当前支持 Centos、Redhat、Ubuntu 发行版的 ISO 镜像源创建; 注:需要在每个创建kubernetes的集群上都执行本操作;

这里可以使用脚本 artifacts/gen_repo_conf.sh, 执行如下命令即可挂载 ISO 镜像文件, 并创建 Repo 配置文件:

  1. # 基本格式
  2. $ ./gen_repo_conf.sh --iso-mode ${linux_distribution} ${iso_image_file}
  3. # linux_distribution 的值是 centos、redhat、debian 或者 ubuntu
  4. # 执行脚本创建 ISO 镜像源
  5. $ ./gen_repo_conf.sh --iso-mode centos CentOS-7-x86_64-Everything-2207-02.iso
  6. # 查看 ISO 镜像挂载情况
  7. $ df -h | grep mnt
  8. /dev/loop0 9.6G 9.6G 0 100% /mnt/centos-iso
  9. # 查看 ISO 镜像源配置
  10. $ cat /etc/yum.repos.d/Kubean-ISO.repo
  11. [kubean-iso]
  12. name=Kubean ISO Repo
  13. baseurl=file:///mnt/centos-iso
  14. enabled=1
  15. gpgcheck=0
  16. sslverify=0

1.2 建立在线 ISO 镜像源

导入至Minio

将 ISO 中的镜像源导入到minio server中,需要使用到脚本 artifacts/import_iso.sh ,执行如下面命令即可将 ISO 镜像中软件源导入到 minio server 中

  1. MINIO_USER=${username} MINIO_PASS=${password} ./import_iso.sh ${minio_address} Centos-XXXX.ISO

为主机新建如下文件 /etc/yum.repos.d/centos-iso-online.repo 即可使用在线 ISO 镜像源:

  1. [kubean-iso-online]
  2. name=Kubean ISO Repo Online
  3. baseurl=${minio_address}/kubean/centos-iso/$releasever/os/$basearch
  4. enabled=1
  5. gpgcheck=0
  6. sslverify=0

此外,如果导入的是 RHEL ISO,需注意此 ISO 提供两个源:

  1. [kubean-iso-online-BaseOS]
  2. name=Kubean ISO Repo Online BaseOS
  3. baseurl=${minio_address}/kubean/redhat-iso/$releasever/os/$basearch/BaseOS
  4. enabled=1
  5. gpgcheck=0
  6. sslverify=0
  7. [kubean-iso-online-AppStream]
  8. name=Kubean ISO Repo Online AppStream
  9. baseurl=${minio_address}/kubean/redhat-iso/$releasever/os/$basearch/AppStream
  10. enabled=1
  11. gpgcheck=0
  12. sslverify=0
  • 需要将 ${minio_address} 替换为 minio API Server 地址

这一步也可以通过设置 ClusterOperation 文件中 enable-repo.yml 的 extraArgs 的值来实现, 将 extraArgs 的值添加为 '{minio_url}/kubean/centos-iso/$releasever/os/$basearch' 这种格式, 参阅 ClusterOperation 结合 playbook 创建源配置文件了解更多信息。

导入至本地目录

将 ISO 中的镜像源导入到本地目录中,需要使用到脚本 artifacts/import_iso.sh ,执行如下面命令即可将 ISO 镜像中软件源导入到指定的本地目录中

  1. ./import_iso.sh ${you_local_path} Centos-XXXX.ISO

repo配置方式类似上方 导入至Minio

  1. [kubean-iso-online]
  2. name=Kubean ISO Repo Online
  3. baseurl=${your_local_path}/centos-iso/$releasever/os/$basearch
  4. enabled=1
  5. gpgcheck=0
  6. sslverify=0

2. 建立 extras 软件源

当前支持 Red Hat Linux 系列

在安装 K8S 集群时, 还会依赖一些 extras 软件, 比如 container-selinux, 这些软件往往在 ISO 镜像源中并不提供. 对此 OS packages 离线包已对其进行了补充, 其在导入 minio 之后, 我们还需要向各个节点创建 extra repo 配置文件.

同样可以使用脚本 artifacts/gen_repo_conf.sh, 执行如下命令即可创建 Extra Repo:

  1. $ ./gen_repo_conf.sh --url-mode ${linux_distribution} ${repo_base_url}
  2. # 执行脚本创建 URL 源配置文件
  3. $ ./gen_repo_conf.sh --url-mode centos ${minio_address}/kubean/centos/\$releasever/os/\$basearch
  4. # 查看 URL 源配置文件
  5. $ cat /etc/yum.repos.d/Kubean-URL.repo
  6. [kubean-extra]
  7. name=Kubean Extra Repo
  8. baseurl=http://10.20.30.40:9000/kubean/centos/$releasever/os/$basearch
  9. enabled=1
  10. gpgcheck=0
  11. sslverify=0

注: 若 repo_base_url 参数中带有 $ 符号, 需要对其进行转义 \$

需要将 ${minio_address} 替换为实际 minio API Server 的地址

3. ClusterOperation 结合 playbook 创建源配置文件

由于创建源的过程涉及到集群的所有节点, 手动脚本操作相对繁琐, 这里提供了一种 playbook 的解决方式.

centos yum repo 的配置示例:

  1. apiVersion: kubean.io/v1alpha1
  2. kind: ClusterOperation
  3. metadata:
  4. name: cluster-ops-01
  5. spec:
  6. cluster: sample
  7. image: ghcr.io/kubean-io/spray-job:latest
  8. actionType: playbook
  9. action: cluster.yml
  10. preHook:
  11. - actionType: playbook
  12. action: ping.yml
  13. - actionType: playbook
  14. action: enable-repo.yml # 在部署集群前, 先执行 enable-repo 的 playbook, 为每个节点创建指定 url 的源配置
  15. extraArgs: |
  16. -e "{repo_list: ['http://10.20.30.40:9000/kubean/centos/\$releasever/os/\$basearch']}"
  17. - actionType: playbook
  18. action: disable-firewalld.yml
  19. postHook:
  20. - actionType: playbook
  21. action: cluster-info.yml
  22. - actionType: playbook
  23. action: enable-repo.yml # 在部署集群后, 还原各节点 yum repo 配置. (注:此步骤, 可视情况添加.)
  24. extraArgs: |
  25. -e undo=true

ubuntu20.04 apt repo 的配置示例:

  1. apiVersion: kubean.io/v1alpha1
  2. kind: ClusterOperation
  3. metadata:
  4. name: cluster-ops-01
  5. spec:
  6. cluster: sample
  7. image: ghcr.io/kubean-io/spray-job:latest
  8. actionType: playbook
  9. action: cluster.yml
  10. preHook:
  11. - actionType: playbook
  12. action: ping.yml
  13. - actionType: playbook
  14. action: enable-repo.yml # 在部署集群前, 先执行 enable-repo 的 playbook, 为每个节点创建指定 url 的源配置 [注:ubuntu 是 os package 离线资源,ubuntu-iso 是 iso 安装包资源]
  15. extraArgs: |
  16. -e "{repo_list: ['deb [trusted=yes] http://MINIO_ADDR:9000/kubean/ubuntu/amd64 focal/', 'deb [trusted=yes] http://MINIO_ADDR:9000/kubean/ubuntu-iso focal main restricted']}"
  17. - actionType: playbook
  18. action: disable-firewalld.yml
  19. postHook:
  20. - actionType: playbook
  21. action: cluster-info.yml
  22. - actionType: playbook
  23. action: enable-repo.yml # 在部署集群后, 还原各节点 apt repo 配置. (注:此步骤, 可视情况添加.)
  24. extraArgs: |
  25. -e undo=true

部署集群前的配置

离线设置需要参考 kubespray 位于 kubespray/inventory/sample/group_vars/all/offline.yml 的配置文件:

  1. ---
  2. ## 全局的离线配置
  3. ### 配置私有容器镜像仓库服务的地址
  4. registry_host: "{{ registry_address }}"
  5. ### 配置二进制文件服务的地址
  6. files_repo: "{{ minio_address }}/kubean"
  7. ### 如果使用 CentOS / RedHat / AlmaLinux / Fedora, 需要配置 yum 源文件服务地址:
  8. yum_repo: "{{ minio_address }}"
  9. ### 如果使用 Debian, 则配置:
  10. debian_repo: "{{ minio_address }}"
  11. ### 如果使用 Ubuntu, 则配置:
  12. ubuntu_repo: "{{ minio_address }}"
  13. ### 如果 containerd 采用非安全 HTTP 免认证方式, 则需要配置:
  14. containerd_registries_mirrors:
  15. - prefix: "{{ registry_address }}"
  16. mirrors:
  17. - host: "http://{{ registry_address }}"
  18. capabilities: ["pull", "resolve"]
  19. skip_verify: true
  20. ### 如果 docker 采用非安全 HTTP 免认证方式, 则需要配置:
  21. docker_insecure_registries:
  22. - {{ registry_address }}
  23. ## Kubernetes components
  24. kubeadm_download_url: "{{ files_repo }}/dl.k8s.io/release/{{ kubeadm_version }}/bin/linux/{{ image_arch }}/kubeadm"
  25. kubectl_download_url: "{{ files_repo }}/dl.k8s.io/release/{{ kube_version }}/bin/linux/{{ image_arch }}/kubectl"
  26. kubelet_download_url: "{{ files_repo }}/dl.k8s.io/release/{{ kube_version }}/bin/linux/{{ image_arch }}/kubelet"
  27. ## CNI Plugins
  28. cni_download_url: "{{ files_repo }}/github.com/containernetworking/plugins/releases/download/{{ cni_version }}/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
  29. ## cri-tools
  30. crictl_download_url: "{{ files_repo }}/github.com/kubernetes-sigs/cri-tools/releases/download/{{ crictl_version }}/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
  31. ## [Optional] etcd: only if you **DON'T** use etcd_deployment=host
  32. etcd_download_url: "{{ files_repo }}/github.com/etcd-io/etcd/releases/download/{{ etcd_version }}/etcd-{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"
  33. # [Optional] Calico: If using Calico network plugin
  34. calicoctl_download_url: "{{ files_repo }}/github.com/projectcalico/calico/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
  35. calicoctl_alternate_download_url: "{{ files_repo }}/github.com/projectcalico/calicoctl/releases/download/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
  36. # [Optional] Calico with kdd: If using Calico network plugin with kdd datastore
  37. calico_crds_download_url: "{{ files_repo }}/github.com/projectcalico/calico/archive/{{ calico_version }}.tar.gz"
  38. # [Optional] Flannel: If using Falnnel network plugin
  39. flannel_cni_download_url: "{{ files_repo }}/kubernetes/flannel/{{ flannel_cni_version }}/flannel-{{ image_arch }}"
  40. # [Optional] helm: only if you set helm_enabled: true
  41. helm_download_url: "{{ files_repo }}/get.helm.sh/helm-{{ helm_version }}-linux-{{ image_arch }}.tar.gz"
  42. # [Optional] crun: only if you set crun_enabled: true
  43. crun_download_url: "{{ files_repo }}/github.com/containers/crun/releases/download/{{ crun_version }}/crun-{{ crun_version }}-linux-{{ image_arch }}"
  44. # [Optional] kata: only if you set kata_containers_enabled: true
  45. kata_containers_download_url: "{{ files_repo }}/github.com/kata-containers/kata-containers/releases/download/{{ kata_containers_version }}/kata-static-{{ kata_containers_version }}-{{ ansible_architecture }}.tar.xz"
  46. # [Optional] cri-dockerd: only if you set container_manager: docker
  47. cri_dockerd_download_url: "{{ files_repo }}/github.com/Mirantis/cri-dockerd/releases/download/v{{ cri_dockerd_version }}/cri-dockerd-{{ cri_dockerd_version }}.{{ image_arch }}.tgz"
  48. # [Optional] runc,containerd: only if you set container_runtime: containerd
  49. runc_download_url: "{{ files_repo }}/github.com/opencontainers/runc/releases/download/{{ runc_version }}/runc.{{ image_arch }}"
  50. containerd_download_url: "{{ files_repo }}/github.com/containerd/containerd/releases/download/v{{ containerd_version }}/containerd-{{ containerd_version }}-linux-{{ image_arch }}.tar.gz"
  51. nerdctl_download_url: "{{ files_repo }}/github.com/containerd/nerdctl/releases/download/v{{ nerdctl_version }}/nerdctl-{{ nerdctl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"

额外说明:

针对一些特殊的操作系统,在离线部署时,还需要添加一些额外参数:

操作系统 额外参数
RHEL 系列 rhel_enable_repos: false
Oracle Linux 系列 use_oracle_public_repo: false

我们以 examples/install/3.airgap 作为模板,

将如上离线配置按照具体情况进行调整, 特别需要替换<registry_address><minio_address>,

最终将配置添加更新到 examples/install/3.airgap/VarsConfCM.yml 文件中,

同时我们还需要修改 examples/install/3.airgap/HostsConfCM.yml 中的集群节点 IP 及用户名密码,

最终, 通过 kubectl apply -f examples/install/3.airgap 启动 ClusterOperation 任务来安装 k8s 集群.


增量离线包的生成和使用

详细文档见: Air gap patch usage