You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
7.3 KiB

  1. # Offline environment
  2. In case your servers don't have access to the internet directly (for example
  3. when deploying on premises with security constraints), you need to get the
  4. following artifacts in advance from another environment where has access to the internet.
  5. * Some static files (zips and binaries)
  6. * OS packages (rpm/deb files)
  7. * Container images used by Kubespray. Exhaustive list depends on your setup
  8. * [Optional] Python packages used by Kubespray (only required if your OS doesn't provide all python packages/versions
  9. listed in `requirements.txt`)
  10. * [Optional] Helm chart files (only required if `helm_enabled=true`)
  11. Then you need to setup the following services on your offline environment:
  12. * an HTTP reverse proxy/cache/mirror to serve some static files (zips and binaries)
  13. * an internal Yum/Deb repository for OS packages
  14. * an internal container image registry that need to be populated with all container images used by Kubespray
  15. * [Optional] an internal PyPi server for python packages used by Kubespray
  16. * [Optional] an internal Helm registry for Helm chart files
  17. You can get artifact lists with [generate_list.sh](/contrib/offline/generate_list.sh) script.
  18. In addition, you can find some tools for offline deployment under [contrib/offline](/contrib/offline/README.md).
  19. ## Configure Inventory
  20. Once all artifacts are accessible from your internal network, **adjust** the following variables
  21. in [your inventory](/inventory/sample/group_vars/all/offline.yml) to match your environment:
  22. ```yaml
  23. # Registry overrides
  24. kube_image_repo: "{{ registry_host }}"
  25. gcr_image_repo: "{{ registry_host }}"
  26. docker_image_repo: "{{ registry_host }}"
  27. quay_image_repo: "{{ registry_host }}"
  28. github_image_repo: "{{ registry_host }}"
  29. kubeadm_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubeadm"
  30. kubectl_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubectl"
  31. kubelet_download_url: "{{ files_repo }}/kubernetes/{{ kube_version }}/kubelet"
  32. # etcd is optional if you **DON'T** use etcd_deployment=host
  33. etcd_download_url: "{{ files_repo }}/kubernetes/etcd/etcd-{{ etcd_version }}-linux-{{ image_arch }}.tar.gz"
  34. cni_download_url: "{{ files_repo }}/kubernetes/cni/cni-plugins-linux-{{ image_arch }}-{{ cni_version }}.tgz"
  35. crictl_download_url: "{{ files_repo }}/kubernetes/cri-tools/crictl-{{ crictl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
  36. # If using Calico
  37. calicoctl_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_ctl_version }}/calicoctl-linux-{{ image_arch }}"
  38. # If using Calico with kdd
  39. calico_crds_download_url: "{{ files_repo }}/kubernetes/calico/{{ calico_version }}.tar.gz"
  40. # Containerd
  41. containerd_download_url: "{{ files_repo }}/containerd-{{ containerd_version }}-linux-{{ image_arch }}.tar.gz"
  42. runc_download_url: "{{ files_repo }}/runc.{{ image_arch }}"
  43. nerdctl_download_url: "{{ files_repo }}/nerdctl-{{ nerdctl_version }}-{{ ansible_system | lower }}-{{ image_arch }}.tar.gz"
  44. # Insecure registries for containerd
  45. containerd_registries_mirrors:
  46. - prefix: "{{ registry_addr }}"
  47. mirrors:
  48. - host: "{{ registry_host }}"
  49. capabilities: ["pull", "resolve"]
  50. skip_verify: true
  51. # CentOS/Redhat/AlmaLinux/Rocky Linux
  52. ## Docker / Containerd
  53. docker_rh_repo_base_url: "{{ yum_repo }}/docker-ce/$releasever/$basearch"
  54. docker_rh_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"
  55. # Fedora
  56. ## Docker
  57. docker_fedora_repo_base_url: "{{ yum_repo }}/docker-ce/{{ ansible_distribution_major_version }}/{{ ansible_architecture }}"
  58. docker_fedora_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"
  59. ## Containerd
  60. containerd_fedora_repo_base_url: "{{ yum_repo }}/containerd"
  61. containerd_fedora_repo_gpgkey: "{{ yum_repo }}/docker-ce/gpg"
  62. # Debian
  63. ## Docker
  64. docker_debian_repo_base_url: "{{ debian_repo }}/docker-ce"
  65. docker_debian_repo_gpgkey: "{{ debian_repo }}/docker-ce/gpg"
  66. ## Containerd
  67. containerd_debian_repo_base_url: "{{ ubuntu_repo }}/containerd"
  68. containerd_debian_repo_gpgkey: "{{ ubuntu_repo }}/containerd/gpg"
  69. containerd_debian_repo_repokey: 'YOURREPOKEY'
  70. # Ubuntu
  71. ## Docker
  72. docker_ubuntu_repo_base_url: "{{ ubuntu_repo }}/docker-ce"
  73. docker_ubuntu_repo_gpgkey: "{{ ubuntu_repo }}/docker-ce/gpg"
  74. ## Containerd
  75. containerd_ubuntu_repo_base_url: "{{ ubuntu_repo }}/containerd"
  76. containerd_ubuntu_repo_gpgkey: "{{ ubuntu_repo }}/containerd/gpg"
  77. containerd_ubuntu_repo_repokey: 'YOURREPOKEY'
  78. ```
  79. For the OS specific settings, just define the one matching your OS.
  80. If you use the settings like the one above, you'll need to define in your inventory the following variables:
  81. * `registry_host`: Container image registry. If you _don't_ use the same repository path for the container images that
  82. the ones defined
  83. in [kubesprays-defaults's role defaults](https://github.com/kubernetes-sigs/kubespray/blob/master/roles/kubespray-defaults/defaults/main/download.yml)
  84. , you need to override the `*_image_repo` for these container images. If you want to make your life easier, use the
  85. same repository path, you won't have to override anything else.
  86. * `registry_addr`: Container image registry, but only have [domain or ip]:[port].
  87. * `files_repo`: HTTP webserver or reverse proxy that is able to serve the files listed above. Path is not important, you
  88. can store them anywhere as long as it's accessible by kubespray. It's recommended to use `*_version` in the path so
  89. that you don't need to modify this setting everytime kubespray upgrades one of these components.
  90. * `yum_repo`/`debian_repo`/`ubuntu_repo`: OS package repository depending on your OS, should point to your internal
  91. repository. Adjust the path accordingly. Used only for Docker/Containerd packages (if needed); other packages might
  92. be installed from other repositories. You might disable installing packages from other repositories by skipping
  93. the `system-packages` tag
  94. ## Install Kubespray Python Packages
  95. ### Recommended way: Kubespray Container Image
  96. The easiest way is to use [kubespray container image](https://quay.io/kubespray/kubespray) as all the required packages
  97. are baked in the image.
  98. Just copy the container image in your private container image registry and you are all set!
  99. ### Manual installation
  100. Look at the `requirements.txt` file and check if your OS provides all packages out-of-the-box (Using the OS package
  101. manager). For those missing, you need to either use a proxy that has Internet access (typically from a DMZ) or setup a
  102. PyPi server in your network that will host these packages.
  103. If you're using an HTTP(S) proxy to download your python packages:
  104. ```bash
  105. sudo pip install --proxy=https://[username:password@]proxyserver:port -r requirements.txt
  106. ```
  107. When using an internal PyPi server:
  108. ```bash
  109. # If you host all required packages
  110. pip install -i https://pypiserver/pypi -r requirements.txt
  111. # If you only need the ones missing from the OS package manager
  112. pip install -i https://pypiserver/pypi package_you_miss
  113. ```
  114. ## Run Kubespray as usual
  115. Once all artifacts are in place and your inventory properly set up, you can run kubespray with the
  116. regular `cluster.yaml` command:
  117. ```bash
  118. ansible-playbook -i inventory/my_airgap_cluster/hosts.yaml -b cluster.yml
  119. ```
  120. If you use [Kubespray Container Image](#recommended-way:-kubespray-container-image), you can mount your inventory inside
  121. the container:
  122. ```bash
  123. docker run --rm -it -v path_to_inventory/my_airgap_cluster:inventory/my_airgap_cluster myprivateregisry.com/kubespray/kubespray:v2.14.0 ansible-playbook -i inventory/my_airgap_cluster/hosts.yaml -b cluster.yml
  124. ```