Compare commits

..

25 Commits

Author SHA1 Message Date
k8s-infra-cherrypick-robot
dd7681c272 Remove the archived debian apt repository (#11220)
Signed-off-by: Kay Yan <kay.yan@daocloud.io>
Co-authored-by: Kay Yan <kay.yan@daocloud.io>
2024-05-21 04:28:05 -07:00
James
e5fc8a933f Fix kube_version in sample inventory (#11026) 2024-05-03 02:20:40 -07:00
Kay Yan
07e19e546b cleanup-for-2.23.3 (#10892) 2024-02-06 06:06:16 -08:00
Max Gautier
3f6567bba0 Add patches versions checksums (k8s binaries, runc, containerd) (#10876)
Make runc 1.1.12 and containerd 1.7.13 default
Make kubernetes 1.27.10 default
2024-02-05 07:46:01 -08:00
bo.jiang
e09a7c02a6 Fix hardcoded pod infra version
Signed-off-by: bo.jiang <bo.jiang@daocloud.io>
2024-01-22 17:23:25 +01:00
Kay Yan
48b3d9c56d cleanup-for-2.23.2 (#10801) 2024-01-18 11:23:30 +01:00
Max Gautier
ca271b8a65 [2.23] Update k8s and etcd hashes + default to latest patch version (#10797)
* k8s: add hashes for 1.25.16, 1.26.12, 1.27.9

Make 1.27.9 default

* [etcd] add 3.5.10 hashes (#10566)

* Update etcd version for 1.26 and 1.27

---------

Co-authored-by: Mohamed Omar Zaian <mohamedzaian@gmail.com>
2024-01-16 15:55:38 +01:00
Max Gautier
c264ae3016 Fix download retry when get_url has no status_code. (#10613) (#10791)
* Fix download retry when get_url has no status_code.

* Fix until clause in download role.

Co-authored-by: Romain <58464216+RomainMou@users.noreply.github.com>
2024-01-15 09:22:47 +01:00
Max Gautier
1bcd7395fa [2.23] Bump galaxy.yml to next expected version (#10728)
* Bump galaxy.yml to next expected version

* Refactor check_galaxy + fix version (#10729)

* Remove checks for docs using exact tags

Instead use a more generic documentation for installing kubespray as a
collection from git.

* Check that we upgraded galaxy.yml to next version

This is only intented to check for human error. The version in galaxy
should be the next (which does not mean the same if we're on master or a
release branch).

* Set collection version to KUBESPRAY_NEXT_VERSION
2024-01-12 10:42:48 +01:00
Max Gautier
3d76c30354 [2.23] Fix calico-node in etcd mode (#10768)
* CI: Document the 'all-in-one' layout + small refactoring (#10725)

* Rename aio to all-in-one and document it

ADTM.
Acronyms don't tell much.

* Refactor vm_count in tests provisioning

* Add test case for calico using etcd datastore (#10722)

* Add multinode ci layout

* Add test case for calico using etcd datastore

* Fix calico-node in etcd mode (#10438)

* Calico : add ETCD endpoints to install-cni container

* Calico : remove nodename from configmap in etcd mode

---------

Co-authored-by: Olivier Levitt <olivier.levitt@gmail.com>
2024-01-12 04:11:00 +01:00
Kay Yan
20a9e20c5a bump vagrant 2.3.7 (#10788) 2024-01-11 12:07:04 +01:00
Max Gautier
e4be213cf7 Disable podCIDR allocation from control-plane when using calico (#10639) (#10715)
* Disable control plane allocating podCIDR for nodes when using calico

Calico does not use the .spec.podCIDR field for its IP address
management.
Furthermore, it can false positives from the kube controller manager if
kube_network_node_prefix and calico_pool_blocksize are unaligned, which
is the case with the default shipped by kubespray.

If the subnets obtained from using kube_network_node_prefix are bigger,
this would result at some point in the control plane thinking it does
not have subnets left for a new node, while calico will work without
problems.

Explicitely set a default value of false for calico_ipam_host_local to
facilitate its use in templates.

* Don't default to kube_network_node_prefix for calico_pool_blocksize

They have different semantics: kube_network_node_prefix is intended to
be the size of the subnet for all pods on a node, while there can be
more than on calico block of the specified size (they are allocated on
demand).

Besides, this commit does not actually change anything, because the
current code is buggy: we don't ever default to
kube_network_node_prefix, since the variable is defined in the role
defaults.
2023-12-13 11:30:18 +01:00
Max Gautier
0107dbc29c [2.23] kubernetes: hashes for 1.27.8, 1.26.11, default to 1.27.8 (#10706)
* kubernetes: add hashes for 1.27.8, 1.26.11

Make 1.27.8 default.

* Convert exoscale tf provider to new version (#10646)

This is untested. It passes terraform validate to un-broke the CI.

* Update 0040-verify-settings.yml (#10699)

remove embedded template

---------

Co-authored-by: piwinkler <9642809+piwinkler@users.noreply.github.com>
2023-12-11 17:26:26 +01:00
Khanh Ngo Van Kim
72da838519 fix: invalid version check in containerd jinja-template config (#10620) 2023-11-17 14:34:00 +01:00
Romain
10679ebb5d [download] Don't fail on 304 Not Modified (#10452) (#10559)
i.e when file was not modified since last download

Co-authored-by: Mathieu Parent <mathieu.parent@insee.fr>
2023-10-30 17:28:43 +01:00
Mohamed Omar Zaian
8775dcf92f [ingress-nginx] Fix nginx controller leader election RBAC permissions (#10569) 2023-10-30 04:24:52 +01:00
Mohamed Omar Zaian
bd382a9c39 Change default cri-o versions for Kubernetes 1.25, 1.26 (#10563) 2023-10-30 04:24:45 +01:00
Mohamed Omar Zaian
ffacfe3ede Add crictl 1.26.1 for Kubernetes v1.26 (#10562) 2023-10-30 04:20:44 +01:00
Unai Arríen
7dcc22fe8c Migrate node-role.kubernetes.io/master to node-role.kubernetes.io/control-plane (#10532)
* Migrate node-role.kubernetes.io/master to node-role.kubernetes.io/control-plane

* Migrate node-role.kubernetes.io/master to node-role.kubernetes.io/control-plane

* Migrate node-role.kubernetes.io/master to node-role.kubernetes.io/control-plane

* Migrate node-role.kubernetes.io/master to node-role.kubernetes.io/control-plane
2023-10-25 18:14:32 +02:00
Mohamed Omar Zaian
47ed2b115d [kubernetes] Add hashes for kubernetes 1.27.7, 1.26.10, 1.25.15 (#10543) 2023-10-19 14:29:50 +02:00
Feruzjon Muyassarov
b9fc4ec43e Refactor NRI activation for containerd and CRI-O (#10470)
Refactor NRI (Node Resource Interface) activation in CRI-O and
containerd. Introduce a shared variable, nri_enabled, to streamline
the process. Currently, enabling NRI requires a separate update of
defaults for each container runtime independently, without any
verification of NRI support for the specific version of containerd
or CRI-O in use.

With this commit, the previous approach is replaced. Now, a single
variable, nri_enabled, handles this functionality. Also, this commit
separates the responsibility of verifying NRI supported versions of
containerd and CRI-O from cluster administrators, and leaves it to
Ansible.

Signed-off-by: Feruzjon Muyassarov <feruzjon.muyassarov@intel.com>
(cherry picked from commit 1fd31ccc28)
2023-10-06 23:24:19 +02:00
Feruzjon Muyassarov
7bd757da5f Add configuration option for NRI in crio & containerd (#10454)
* [containerd] Add Configuration option for Node Resource Interface

Node Resource Interface (NRI) is a common is a common framework for
plugging domain or vendor-specific custom logic into container
runtime like containerd. With this commit, we introduce the
containerd_disable_nri configuration flag, providing cluster
administrators the flexibility to opt in or out (defaulted to 'out')
of this feature in containerd. In line with containerd's default
configuration, NRI is disabled by default in this containerd role
defaults.

Signed-off-by: Feruzjon Muyassarov <feruzjon.muyassarov@intel.com>

* [cri-o] Add configuration option for Node Resource Interface

Node Resource Interface (NRI) is a common is a common framework for
plugging domain or vendor-specific custom logic into container
runtimes like containerd/crio. With this commit, we introduce the
crio_enable_nri configuration flag, providing cluster
administrators the flexibility to opt in or out (defaulted to 'out')
of this feature in cri-o runtime. In line with crio's default
configuration, NRI is disabled by default in this cri-o role
defaults.

Signed-off-by: Feruzjon Muyassarov <feruzjon.muyassarov@intel.com>

---------

Signed-off-by: Feruzjon Muyassarov <feruzjon.muyassarov@intel.com>
(cherry picked from commit f964b3438d)
2023-10-06 23:24:19 +02:00
Mohamed Omar Zaian
9dc2092042 [etcd] make etcd 3.5.9 default (#10483) 2023-09-29 00:22:45 -07:00
Hans Kristian Moen
c7cfd32c40 [cilium] fix: invalid hubble yaml if cilium_hubble_tls_generate is enabled (#10430) (#10476)
Co-authored-by: Toon Albers <45094749+toonalbers@users.noreply.github.com>
2023-09-26 05:01:28 -07:00
Boris Barnier
a4b0656d9b [2.23] Add hashes for kubernetes version 1.25.14, 1.27.6 & 1.26.9 (#10443)
* Add hashes for kubernetes version 1.27.6 & 1.26.9

Signed-off-by: Boris Barnier <bozzo@users.noreply.github.com>

* Add hashes for kubernetes version 1.25.14

Signed-off-by: Boris Barnier <bozzo@users.noreply.github.com>

---------

Signed-off-by: Boris Barnier <bozzo@users.noreply.github.com>
2023-09-18 07:18:32 -07:00
731 changed files with 7957 additions and 43599 deletions

View File

@@ -36,4 +36,3 @@ exclude_paths:
# Generated files # Generated files
- tests/files/custom_cni/cilium.yaml - tests/files/custom_cni/cilium.yaml
- venv - venv
- .github

View File

@@ -5,4 +5,4 @@ roles/kubernetes/control-plane/defaults/main/main.yml jinja[spacing]
roles/kubernetes/kubeadm/defaults/main.yml jinja[spacing] roles/kubernetes/kubeadm/defaults/main.yml jinja[spacing]
roles/kubernetes/node/defaults/main.yml jinja[spacing] roles/kubernetes/node/defaults/main.yml jinja[spacing]
roles/kubernetes/preinstall/defaults/main.yml jinja[spacing] roles/kubernetes/preinstall/defaults/main.yml jinja[spacing]
roles/kubespray-defaults/defaults/main/main.yml jinja[spacing] roles/kubespray-defaults/defaults/main.yaml jinja[spacing]

1
.gitattributes vendored
View File

@@ -1 +0,0 @@
docs/_sidebar.md linguist-generated=true

44
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,44 @@
---
name: Bug Report
about: Report a bug encountered while operating Kubernetes
labels: kind/bug
---
<!--
Please, be ready for followup questions, and please respond in a timely
manner. If we can't reproduce a bug or think a feature already exists, we
might close your issue. If we're wrong, PLEASE feel free to reopen it and
explain why.
-->
**Environment**:
- **Cloud provider or hardware configuration:**
- **OS (`printf "$(uname -srm)\n$(cat /etc/os-release)\n"`):**
- **Version of Ansible** (`ansible --version`):
- **Version of Python** (`python --version`):
**Kubespray version (commit) (`git rev-parse --short HEAD`):**
**Network plugin used**:
**Full inventory with variables (`ansible -i inventory/sample/inventory.ini all -m debug -a "var=hostvars[inventory_hostname]"`):**
<!-- We recommend using snippets services like https://gist.github.com/ etc. -->
**Command used to invoke ansible**:
**Output of ansible run**:
<!-- We recommend using snippets services like https://gist.github.com/ etc. -->
**Anything else do we need to know**:
<!-- By running scripts/collect-info.yaml you can get a lot of useful informations.
Script can be started by:
ansible-playbook -i <inventory_file_path> -u <ssh_user> -e ansible_ssh_user=<ssh_user> -b --become-user=root -e dir=`pwd` scripts/collect-info.yaml
(If you using CoreOS remember to add '-e ansible_python_interpreter=/opt/bin/python').
After running this command you can find logs in `pwd`/logs.tar.gz. You can even upload somewhere entire file and paste link here.-->

View File

@@ -1,124 +0,0 @@
---
name: Bug Report
description: Report a bug encountered while using Kubespray
labels: kind/bug
body:
- type: markdown
attributes:
value: |
Please, be ready for followup questions, and please respond in a timely
manner. If we can't reproduce a bug or think a feature already exists, we
might close your issue. If we're wrong, PLEASE feel free to reopen it and
explain why.
- type: textarea
id: problem
attributes:
label: What happened?
description: |
Please provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner.
validations:
required: true
- type: textarea
id: expected
attributes:
label: What did you expect to happen?
validations:
required: true
- type: textarea
id: repro
attributes:
label: How can we reproduce it (as minimally and precisely as possible)?
validations:
required: true
- type: markdown
attributes:
value: '### Environment'
- type: textarea
id: os
attributes:
label: OS
placeholder: 'printf "$(uname -srm)\n$(cat /etc/os-release)\n"'
validations:
required: true
- type: textarea
id: ansible_version
attributes:
label: Version of Ansible
placeholder: 'ansible --version'
validations:
required: true
- type: input
id: python_version
attributes:
label: Version of Python
placeholder: 'python --version'
validations:
required: true
- type: input
id: kubespray_version
attributes:
label: Version of Kubespray (commit)
placeholder: 'git rev-parse --short HEAD'
validations:
required: true
- type: dropdown
id: network_plugin
attributes:
label: Network plugin used
options:
- calico
- cilium
- cni
- custom_cni
- flannel
- kube-ovn
- kube-router
- macvlan
- meta
- multus
- ovn4nfv
- weave
validations:
required: true
- type: textarea
id: inventory
attributes:
label: Full inventory with variables
placeholder: 'ansible -i inventory/sample/inventory.ini all -m debug -a "var=hostvars[inventory_hostname]"'
description: We recommend using snippets services like https://gist.github.com/ etc.
validations:
required: true
- type: input
id: ansible_command
attributes:
label: Command used to invoke ansible
validations:
required: true
- type: textarea
id: ansible_output
attributes:
label: Output of ansible run
description: We recommend using snippets services like https://gist.github.com/ etc.
validations:
required: true
- type: textarea
id: anything_else
attributes:
label: Anything else we need to know
description: |
By running scripts/collect-info.yaml you can get a lot of useful informations.
Script can be started by:
ansible-playbook -i <inventory_file_path> -u <ssh_user> -e ansible_ssh_user=<ssh_user> -b --become-user=root -e dir=`pwd` scripts/collect-info.yaml
(If you using CoreOS remember to add '-e ansible_python_interpreter=/opt/bin/python').
After running this command you can find logs in `pwd`/logs.tar.gz. You can even upload somewhere entire file and paste link here

View File

@@ -1,5 +0,0 @@
---
contact_links:
- name: Support Request
url: https://kubernetes.slack.com/channels/kubespray
about: Support request or question relating to Kubernetes

11
.github/ISSUE_TEMPLATE/enhancement.md vendored Normal file
View File

@@ -0,0 +1,11 @@
---
name: Enhancement Request
about: Suggest an enhancement to the Kubespray project
labels: kind/feature
---
<!-- Please only use this template for submitting enhancement requests -->
**What would you like to be added**:
**Why is this needed**:

View File

@@ -1,20 +0,0 @@
---
name: Enhancement Request
description: Suggest an enhancement to the Kubespray project
labels: kind/feature
body:
- type: markdown
attributes:
value: Please only use this template for submitting enhancement requests
- type: textarea
id: what
attributes:
label: What would you like to be added
validations:
required: true
- type: textarea
id: why
attributes:
label: Why is this needed
validations:
required: true

20
.github/ISSUE_TEMPLATE/failing-test.md vendored Normal file
View File

@@ -0,0 +1,20 @@
---
name: Failing Test
about: Report test failures in Kubespray CI jobs
labels: kind/failing-test
---
<!-- Please only use this template for submitting reports about failing tests in Kubespray CI jobs -->
**Which jobs are failing**:
**Which test(s) are failing**:
**Since when has it been failing**:
**Testgrid link**:
**Reason for failure**:
**Anything else we need to know**:

View File

@@ -1,41 +0,0 @@
---
name: Failing Test
description: Report test failures in Kubespray CI jobs
labels: kind/failing-test
body:
- type: markdown
attributes:
value: Please only use this template for submitting reports about failing tests in Kubespray CI jobs
- type: textarea
id: failing_jobs
attributes:
label: Which jobs are failing ?
validations:
required: true
- type: textarea
id: failing_tests
attributes:
label: Which tests are failing ?
validations:
required: true
- type: input
id: since_when
attributes:
label: Since when has it been failing ?
validations:
required: true
- type: textarea
id: failure_reason
attributes:
label: Reason for failure
description: If you don't know and have no guess, just put "Unknown"
validations:
required: true
- type: textarea
id: anything_else
attributes:
label: Anything else we need to know

18
.github/ISSUE_TEMPLATE/support.md vendored Normal file
View File

@@ -0,0 +1,18 @@
---
name: Support Request
about: Support request or question relating to Kubespray
labels: kind/support
---
<!--
STOP -- PLEASE READ!
GitHub is not the right place for support requests.
If you're looking for help, check [Stack Overflow](https://stackoverflow.com/questions/tagged/kubespray) and the [troubleshooting guide](https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/).
You can also post your question on the [Kubernetes Slack](http://slack.k8s.io/) or the [Discuss Kubernetes](https://discuss.kubernetes.io/) forum.
If the matter is security related, please disclose it privately via https://kubernetes.io/security/.
-->

View File

@@ -1,9 +0,0 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
labels:
- dependencies
- release-note-none

2
.gitignore vendored
View File

@@ -3,8 +3,6 @@
**/vagrant_ansible_inventory **/vagrant_ansible_inventory
*.iml *.iml
temp temp
contrib/offline/container-images
contrib/offline/container-images.tar.gz
contrib/offline/offline-files contrib/offline/offline-files
contrib/offline/offline-files.tar.gz contrib/offline/offline-files.tar.gz
.idea .idea

View File

@@ -1,12 +1,15 @@
--- ---
stages: stages:
- build - build
- test - unit-tests
- deploy-part1 - deploy-part1
- deploy-extended - moderator
- deploy-part2
- deploy-part3
- deploy-special
variables: variables:
KUBESPRAY_VERSION: v2.25.0 KUBESPRAY_VERSION: v2.22.1
FAILFASTCI_NAMESPACE: 'kargo-ci' FAILFASTCI_NAMESPACE: 'kargo-ci'
GITLAB_REPOSITORY: 'kargo-ci/kubernetes-sigs-kubespray' GITLAB_REPOSITORY: 'kargo-ci/kubernetes-sigs-kubespray'
ANSIBLE_FORCE_COLOR: "true" ANSIBLE_FORCE_COLOR: "true"
@@ -40,26 +43,15 @@ before_script:
.job: &job .job: &job
tags: tags:
- ffci - packet
image: $PIPELINE_IMAGE image: $PIPELINE_IMAGE
artifacts: artifacts:
when: always when: always
paths: paths:
- cluster-dump/ - cluster-dump/
needs:
- pipeline-image
.job-moderated:
extends: .job
needs:
- pipeline-image
- ci-not-authorized
- check-galaxy-version # lint
- pre-commit # lint
- vagrant-validate # lint
.testcases: &testcases .testcases: &testcases
extends: .job-moderated <<: *job
retry: 1 retry: 1
interruptible: true interruptible: true
before_script: before_script:
@@ -69,38 +61,23 @@ before_script:
script: script:
- ./tests/scripts/testcases_run.sh - ./tests/scripts/testcases_run.sh
after_script: after_script:
- ./tests/scripts/testcases_cleanup.sh - chronic ./tests/scripts/testcases_cleanup.sh
# For failfast, at least 1 job must be defined in .gitlab-ci.yml # For failfast, at least 1 job must be defined in .gitlab-ci.yml
# Premoderated with manual actions # Premoderated with manual actions
ci-not-authorized: ci-authorized:
stage: build extends: .job
before_script: [] stage: moderator
after_script: []
rules:
# LGTM or ok-to-test labels
- if: $PR_LABELS =~ /.*,(lgtm|approved|ok-to-test).*|^(lgtm|approved|ok-to-test).*/i
variables:
CI_OK_TO_TEST: '0'
when: always
- if: $CI_PIPELINE_SOURCE == "schedule" || $CI_PIPELINE_SOURCE == "trigger"
variables:
CI_OK_TO_TEST: '0'
- if: $CI_COMMIT_BRANCH == "master"
variables:
CI_OK_TO_TEST: '0'
- when: always
variables:
CI_OK_TO_TEST: '1'
script: script:
- exit $CI_OK_TO_TEST - /bin/sh scripts/premoderator.sh
tags: except: ['triggers', 'master']
- ffci # Disable ci moderator
needs: [] only: []
include: include:
- .gitlab-ci/build.yml - .gitlab-ci/build.yml
- .gitlab-ci/lint.yml - .gitlab-ci/lint.yml
- .gitlab-ci/shellcheck.yml
- .gitlab-ci/terraform.yml - .gitlab-ci/terraform.yml
- .gitlab-ci/packet.yml - .gitlab-ci/packet.yml
- .gitlab-ci/vagrant.yml - .gitlab-ci/vagrant.yml

View File

@@ -1,32 +1,40 @@
--- ---
.build-container: .build:
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- image-cache
tags:
- ffci
stage: build stage: build
image: image:
name: gcr.io/kaniko-project/executor:debug name: moby/buildkit:rootless
entrypoint: [''] entrypoint: [""]
variables: variables:
TAG: $CI_COMMIT_SHORT_SHA BUILDKITD_FLAGS: --oci-worker-no-process-sandbox
PROJECT_DIR: $CI_PROJECT_DIR
DOCKERFILE: Dockerfile
GODEBUG: "http2client=0"
before_script: before_script:
- echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n ${CI_REGISTRY_USER}:${CI_REGISTRY_PASSWORD} | base64)\"}}}" > /kaniko/.docker/config.json - mkdir ~/.docker
script: - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > ~/.docker/config.json
- /kaniko/executor --cache=true
--cache-dir=image-cache
--context $PROJECT_DIR
--dockerfile $PROJECT_DIR/$DOCKERFILE
--label 'git-branch'=$CI_COMMIT_REF_SLUG
--label 'git-tag=$CI_COMMIT_TAG'
--destination $PIPELINE_IMAGE
pipeline-image: pipeline image:
extends: .build-container extends: .build
variables: script:
DOCKERFILE: pipeline.Dockerfile - |
buildctl-daemonless.sh build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--opt filename=./pipeline.Dockerfile \
--output type=image,name=$PIPELINE_IMAGE,push=true \
--import-cache type=registry,ref=$CI_REGISTRY_IMAGE/pipeline:cache
rules:
- if: '$CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH'
pipeline image and build cache:
extends: .build
script:
- |
buildctl-daemonless.sh build \
--frontend=dockerfile.v0 \
--local context=. \
--local dockerfile=. \
--opt filename=./pipeline.Dockerfile \
--output type=image,name=$PIPELINE_IMAGE,push=true \
--import-cache type=registry,ref=$CI_REGISTRY_IMAGE/pipeline:cache \
--export-cache type=registry,ref=$CI_REGISTRY_IMAGE/pipeline:cache,mode=max
rules:
- if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH'

View File

@@ -1,35 +1,110 @@
--- ---
pre-commit: yamllint:
stage: test extends: .job
tags: stage: unit-tests
- ffci tags: [light]
image: 'ghcr.io/pre-commit-ci/runner-image@sha256:aaf2c7b38b22286f2d381c11673bec571c28f61dd086d11b43a1c9444a813cef'
variables: variables:
PRE_COMMIT_HOME: /pre-commit-cache LANG: C.UTF-8
script: script:
- pre-commit run --all-files - yamllint --strict .
cache: except: ['triggers', 'master']
key: pre-commit-all
paths:
- /pre-commit-cache
needs: []
vagrant-validate: vagrant-validate:
extends: .job extends: .job
stage: test stage: unit-tests
tags: [ffci] tags: [light]
variables: variables:
VAGRANT_VERSION: 2.3.7 VAGRANT_VERSION: 2.3.7
script: script:
- ./tests/scripts/vagrant-validate.sh - ./tests/scripts/vagrant-validate.sh
except: ['triggers', 'master'] except: ['triggers', 'master']
ansible-lint:
extends: .job
stage: unit-tests
tags: [light]
script:
- ansible-lint -v
except: ['triggers', 'master']
# TODO: convert to pre-commit hook syntax-check:
check-galaxy-version: extends: .job
needs: [] stage: unit-tests
stage: test tags: [light]
tags: [ffci] variables:
ANSIBLE_INVENTORY: inventory/local-tests.cfg
ANSIBLE_REMOTE_USER: root
ANSIBLE_BECOME: "true"
ANSIBLE_BECOME_USER: root
ANSIBLE_VERBOSITY: "3"
script:
- ansible-playbook --syntax-check cluster.yml
- ansible-playbook --syntax-check playbooks/cluster.yml
- ansible-playbook --syntax-check upgrade-cluster.yml
- ansible-playbook --syntax-check playbooks/upgrade_cluster.yml
- ansible-playbook --syntax-check reset.yml
- ansible-playbook --syntax-check playbooks/reset.yml
- ansible-playbook --syntax-check extra_playbooks/upgrade-only-k8s.yml
except: ['triggers', 'master']
collection-build-install-sanity-check:
extends: .job
stage: unit-tests
tags: [light]
variables:
ANSIBLE_COLLECTIONS_PATH: "./ansible_collections"
script:
- ansible-galaxy collection build
- ansible-galaxy collection install kubernetes_sigs-kubespray-$(grep "^version:" galaxy.yml | awk '{print $2}').tar.gz
- ansible-galaxy collection list $(egrep -i '(name:\s+|namespace:\s+)' galaxy.yml | awk '{print $2}' | tr '\n' '.' | sed 's|\.$||g') | grep "^kubernetes_sigs.kubespray"
- test -f ansible_collections/kubernetes_sigs/kubespray/playbooks/cluster.yml
- test -f ansible_collections/kubernetes_sigs/kubespray/playbooks/reset.yml
except: ['triggers', 'master']
tox-inventory-builder:
stage: unit-tests
tags: [light]
extends: .job
before_script:
- ./tests/scripts/rebase.sh
script:
- pip3 install tox
- cd contrib/inventory_builder && tox
except: ['triggers', 'master']
markdownlint:
stage: unit-tests
tags: [light]
image: node
before_script:
- npm install -g markdownlint-cli@0.22.0
script:
- markdownlint $(find . -name '*.md' | grep -vF './.git') --ignore docs/_sidebar.md --ignore contrib/dind/README.md
check-readme-versions:
stage: unit-tests
tags: [light]
image: python:3 image: python:3
script: script:
- tests/scripts/check_galaxy_version.sh - tests/scripts/check_readme_versions.sh
check-galaxy-version:
stage: unit-tests
tags: [light]
image: python:3
script:
- tests/scripts/check_galaxy_version.sh
check-typo:
stage: unit-tests
tags: [light]
image: python:3
script:
- tests/scripts/check_typo.sh
ci-matrix:
stage: unit-tests
tags: [light]
image: python:3
script:
- tests/scripts/md-table/test.sh

View File

@@ -1,42 +1,30 @@
--- ---
.molecule: .molecule:
tags: [ffci-vm-med] tags: [c3.small.x86]
only: [/^pr-.*$/] only: [/^pr-.*$/]
except: ['triggers'] except: ['triggers']
image: quay.io/kubespray/vm-kubespray-ci:v6 image: $PIPELINE_IMAGE
services: [] services: []
stage: deploy-part1 stage: deploy-part1
needs: []
# - ci-not-authorized
variables:
VAGRANT_DEFAULT_PROVIDER: "libvirt"
before_script: before_script:
- groups - tests/scripts/rebase.sh
- python3 -m venv citest - ./tests/scripts/vagrant_clean.sh
- source citest/bin/activate
- vagrant plugin expunge --reinstall --force --no-tty
- vagrant plugin install vagrant-libvirt
- pip install --no-compile --no-cache-dir pip -U
- pip install --no-compile --no-cache-dir -r $CI_PROJECT_DIR/requirements.txt
- pip install --no-compile --no-cache-dir -r $CI_PROJECT_DIR/tests/requirements.txt
- ./tests/scripts/rebase.sh
- ./tests/scripts/vagrant_clean.sh
script: script:
- ./tests/scripts/molecule_run.sh - ./tests/scripts/molecule_run.sh
after_script: after_script:
- ./tests/scripts/molecule_logs.sh - chronic ./tests/scripts/molecule_logs.sh
artifacts: artifacts:
when: always when: always
paths: paths:
- molecule_logs/ - molecule_logs/
# CI template for periodic CI jobs # CI template for periodic CI jobs
# Enabled when PERIODIC_CI_ENABLED var is set # Enabled when PERIODIC_CI_ENABLED var is set
.molecule_periodic: .molecule_periodic:
only: only:
variables: variables:
- $PERIODIC_CI_ENABLED - $PERIODIC_CI_ENABLED
allow_failure: true allow_failure: true
extends: .molecule extends: .molecule
@@ -46,50 +34,50 @@ molecule_full:
molecule_no_container_engines: molecule_no_container_engines:
extends: .molecule extends: .molecule
script: script:
- ./tests/scripts/molecule_run.sh -e container-engine - ./tests/scripts/molecule_run.sh -e container-engine
when: on_success when: on_success
molecule_docker: molecule_docker:
extends: .molecule extends: .molecule
script: script:
- ./tests/scripts/molecule_run.sh -i container-engine/cri-dockerd - ./tests/scripts/molecule_run.sh -i container-engine/cri-dockerd
when: on_success when: on_success
molecule_containerd: molecule_containerd:
extends: .molecule extends: .molecule
script: script:
- ./tests/scripts/molecule_run.sh -i container-engine/containerd - ./tests/scripts/molecule_run.sh -i container-engine/containerd
when: on_success when: on_success
molecule_cri-o: molecule_cri-o:
extends: .molecule extends: .molecule
stage: deploy-part1 stage: deploy-part2
script: script:
- ./tests/scripts/molecule_run.sh -i container-engine/cri-o - ./tests/scripts/molecule_run.sh -i container-engine/cri-o
allow_failure: true allow_failure: true
when: on_success when: on_success
# # Stage 3 container engines don't get as much attention so allow them to fail # Stage 3 container engines don't get as much attention so allow them to fail
# molecule_kata: molecule_kata:
# extends: .molecule extends: .molecule
# stage: deploy-extended stage: deploy-part3
# script: allow_failure: true
# - ./tests/scripts/molecule_run.sh -i container-engine/kata-containers script:
# when: manual - ./tests/scripts/molecule_run.sh -i container-engine/kata-containers
# # FIXME: this test is broken (perma-failing) when: on_success
molecule_gvisor: molecule_gvisor:
extends: .molecule extends: .molecule
stage: deploy-extended stage: deploy-part3
allow_failure: true
script: script:
- ./tests/scripts/molecule_run.sh -i container-engine/gvisor - ./tests/scripts/molecule_run.sh -i container-engine/gvisor
when: manual when: on_success
# FIXME: this test is broken (perma-failing)
molecule_youki: molecule_youki:
extends: .molecule extends: .molecule
stage: deploy-extended stage: deploy-part3
allow_failure: true
script: script:
- ./tests/scripts/molecule_run.sh -i container-engine/youki - ./tests/scripts/molecule_run.sh -i container-engine/youki
when: manual when: on_success
# FIXME: this test is broken (perma-failing)

View File

@@ -6,56 +6,14 @@
CI_PLATFORM: packet CI_PLATFORM: packet
SSH_USER: kubespray SSH_USER: kubespray
tags: tags:
- ffci - packet
needs: except: [triggers]
- pipeline-image
- ci-not-authorized
# CI template for PRs # CI template for PRs
.packet_pr: .packet_pr:
stage: deploy-part1 only: [/^pr-.*$/]
rules:
- if: $PR_LABELS =~ /.*ci-short.*/
when: manual
allow_failure: true
- if: $CI_COMMIT_BRANCH =~ /^pr-.*$/
when: on_success
- when: manual
allow_failure: true
extends: .packet extends: .packet
## Uncomment this to have multiple stages
# needs:
# - packet_ubuntu20-calico-all-in-one
.packet_pr_short:
stage: deploy-part1
extends: .packet
rules:
- if: $CI_COMMIT_BRANCH =~ /^pr-.*$/
when: on_success
- when: manual
allow_failure: true
.packet_pr_manual:
extends: .packet_pr
stage: deploy-extended
rules:
- if: $PR_LABELS =~ /.*ci-full.*/
when: on_success
# Else run as manual
- when: manual
allow_failure: true
.packet_pr_extended:
extends: .packet_pr
stage: deploy-extended
rules:
- if: $PR_LABELS =~ /.*(ci-extended|ci-full).*/
when: on_success
- when: manual
allow_failure: true
# CI template for periodic CI jobs # CI template for periodic CI jobs
# Enabled when PERIODIC_CI_ENABLED var is set # Enabled when PERIODIC_CI_ENABLED var is set
.packet_periodic: .packet_periodic:
@@ -76,177 +34,299 @@ packet_cleanup_old:
# The ubuntu20-calico-all-in-one jobs are meant as early stages to prevent running the full CI if something is horribly broken # The ubuntu20-calico-all-in-one jobs are meant as early stages to prevent running the full CI if something is horribly broken
packet_ubuntu20-calico-all-in-one: packet_ubuntu20-calico-all-in-one:
stage: deploy-part1 stage: deploy-part1
extends: .packet_pr_short extends: .packet_pr
when: on_success
variables: variables:
RESET_CHECK: "true" RESET_CHECK: "true"
# ### PR JOBS PART2 # ### PR JOBS PART2
packet_ubuntu20-crio: packet_ubuntu20-all-in-one-docker:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: on_success
packet_ubuntu20-calico-all-in-one-hardening:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_ubuntu22-all-in-one-docker:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_ubuntu22-calico-all-in-one: packet_ubuntu22-calico-all-in-one:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
packet_ubuntu22-calico-all-in-one-upgrade: packet_ubuntu22-calico-etcd-datastore:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
variables: when: on_success
UPGRADE_TEST: graceful
packet_ubuntu24-calico-etcd-datastore: packet_centos7-flannel-addons-ha:
extends: .packet_pr extends: .packet_pr
stage: deploy-part2
when: on_success
packet_almalinux8-crio: packet_almalinux8-crio:
extends: .packet_pr extends: .packet_pr
stage: deploy-part2
when: on_success
allow_failure: true
packet_almalinux8-kube-ovn: packet_ubuntu20-crio:
extends: .packet_pr extends: .packet_pr
stage: deploy-part2
when: manual
packet_fedora37-crio:
extends: .packet_pr
stage: deploy-part2
when: manual
packet_ubuntu20-flannel-ha:
stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian10-cilium-svc-proxy:
stage: deploy-part2
extends: .packet_periodic
when: on_success
packet_debian10-calico:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_debian10-docker:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_debian11-calico: packet_debian11-calico:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
packet_debian11-macvlan: packet_debian11-docker:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
packet_debian12-calico:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_debian12-docker:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_debian12-cilium: packet_debian12-cilium:
stage: deploy-part2
extends: .packet_periodic
when: on_success
packet_centos7-calico-ha-once-localhost:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
variables:
# This will instruct Docker not to start over TLS.
DOCKER_TLS_CERTDIR: ""
services:
- docker:19.03.9-dind
packet_almalinux8-kube-ovn:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_almalinux8-calico:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_rockylinux8-calico: packet_rockylinux8-calico:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
packet_rockylinux9-calico:
stage: deploy-part2
extends: .packet_pr
when: on_success
packet_rockylinux9-cilium: packet_rockylinux9-cilium:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
variables: variables:
RESET_CHECK: "true" RESET_CHECK: "true"
packet_amazon-linux-2-all-in-one: packet_almalinux8-docker:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: on_success
packet_fedora38-docker-weave:
stage: deploy-part2
extends: .packet_pr
when: on_success
allow_failure: true
packet_opensuse-docker-cilium: packet_opensuse-docker-cilium:
stage: deploy-part2
extends: .packet_pr extends: .packet_pr
when: manual
packet_ubuntu20-cilium-sep:
extends: .packet_pr
## Extended
packet_debian11-docker:
extends: .packet_pr_extended
packet_debian12-docker:
extends: .packet_pr_extended
packet_debian12-calico:
extends: .packet_pr_extended
packet_almalinux8-calico-remove-node:
extends: .packet_pr_extended
variables:
REMOVE_NODE_CHECK: "true"
REMOVE_NODE_NAME: "instance-3"
packet_rockylinux9-calico:
extends: .packet_pr_extended
packet_almalinux8-calico:
extends: .packet_pr_extended
packet_almalinux8-docker:
extends: .packet_pr_extended
packet_ubuntu20-calico-all-in-one-hardening:
extends: .packet_pr_extended
packet_ubuntu24-calico-all-in-one:
extends: .packet_pr_extended
packet_ubuntu20-calico-etcd-kubeadm:
extends: .packet_pr_extended
packet_ubuntu24-all-in-one-docker:
extends: .packet_pr_extended
packet_ubuntu22-all-in-one-docker:
extends: .packet_pr_extended
# ### MANUAL JOBS # ### MANUAL JOBS
packet_fedora37-crio:
extends: .packet_pr_manual
packet_ubuntu20-flannel-ha: packet_ubuntu20-docker-weave-sep:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: manual
packet_ubuntu20-all-in-one-docker: packet_ubuntu20-cilium-sep:
extends: .packet_pr_manual stage: deploy-special
extends: .packet_pr
when: manual
packet_ubuntu20-flannel-ha-once: packet_ubuntu20-flannel-ha-once:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
packet_fedora37-calico-swap-selinux: when: manual
extends: .packet_pr_manual
# Calico HA eBPF
packet_almalinux8-calico-ha-ebpf: packet_almalinux8-calico-ha-ebpf:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: manual
packet_almalinux8-calico-nodelocaldns-secondary: packet_debian10-macvlan:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian11-custom-cni: packet_centos7-calico-ha:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian11-kubelet-csr-approver: packet_centos7-multus-calico:
extends: .packet_pr_manual stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian12-custom-cni-helm:
extends: .packet_pr_manual
packet_ubuntu20-calico-ha-wireguard:
extends: .packet_pr_manual
# PERIODIC
packet_fedora38-docker-calico: packet_fedora38-docker-calico:
stage: deploy-extended stage: deploy-part2
extends: .packet_periodic extends: .packet_periodic
when: on_success
variables: variables:
RESET_CHECK: "true" RESET_CHECK: "true"
packet_fedora37-calico-selinux: packet_fedora37-calico-selinux:
stage: deploy-extended stage: deploy-part2
extends: .packet_periodic extends: .packet_periodic
when: on_success
packet_fedora37-calico-swap-selinux:
stage: deploy-part2
extends: .packet_pr
when: manual
packet_ubuntu20-calico-etcd-kubeadm-upgrade-ha: packet_amazon-linux-2-all-in-one:
stage: deploy-extended stage: deploy-part2
extends: .packet_pr
when: manual
packet_almalinux8-calico-nodelocaldns-secondary:
stage: deploy-part2
extends: .packet_pr
when: manual
packet_fedora38-kube-ovn:
stage: deploy-part2
extends: .packet_periodic extends: .packet_periodic
when: on_success
packet_debian11-custom-cni:
stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian11-kubelet-csr-approver:
stage: deploy-part2
extends: .packet_pr
when: manual
# ### PR JOBS PART3
# Long jobs (45min+)
packet_centos7-weave-upgrade-ha:
stage: deploy-part3
extends: .packet_periodic
when: on_success
variables: variables:
UPGRADE_TEST: basic UPGRADE_TEST: basic
packet_ubuntu20-calico-etcd-kubeadm-upgrade-ha:
stage: deploy-part3
extends: .packet_periodic
when: on_success
variables:
UPGRADE_TEST: basic
# Calico HA Wireguard
packet_ubuntu20-calico-ha-wireguard:
stage: deploy-part2
extends: .packet_pr
when: manual
packet_debian11-calico-upgrade:
stage: deploy-part3
extends: .packet_pr
when: on_success
variables:
UPGRADE_TEST: graceful
packet_almalinux8-calico-remove-node:
stage: deploy-part3
extends: .packet_pr
when: on_success
variables:
REMOVE_NODE_CHECK: "true"
REMOVE_NODE_NAME: "instance-3"
packet_ubuntu20-calico-etcd-kubeadm:
stage: deploy-part3
extends: .packet_pr
when: on_success
packet_debian11-calico-upgrade-once: packet_debian11-calico-upgrade-once:
stage: deploy-extended stage: deploy-part3
extends: .packet_periodic extends: .packet_periodic
when: on_success
variables: variables:
UPGRADE_TEST: graceful UPGRADE_TEST: graceful
packet_ubuntu20-calico-ha-recover: packet_ubuntu20-calico-ha-recover:
stage: deploy-extended stage: deploy-part3
extends: .packet_periodic extends: .packet_periodic
when: on_success
variables: variables:
RECOVER_CONTROL_PLANE_TEST: "true" RECOVER_CONTROL_PLANE_TEST: "true"
RECOVER_CONTROL_PLANE_TEST_GROUPS: "etcd[2:]:kube_control_plane[1:]" RECOVER_CONTROL_PLANE_TEST_GROUPS: "etcd[2:]:kube_control_plane[1:]"
packet_ubuntu20-calico-ha-recover-noquorum: packet_ubuntu20-calico-ha-recover-noquorum:
stage: deploy-extended stage: deploy-part3
extends: .packet_periodic extends: .packet_periodic
when: on_success
variables: variables:
RECOVER_CONTROL_PLANE_TEST: "true" RECOVER_CONTROL_PLANE_TEST: "true"
RECOVER_CONTROL_PLANE_TEST_GROUPS: "etcd[1:]:kube_control_plane[1:]" RECOVER_CONTROL_PLANE_TEST_GROUPS: "etcd[1:]:kube_control_plane[1:]"
packet_debian11-calico-upgrade:
stage: deploy-extended
extends: .packet_periodic
variables:
UPGRADE_TEST: graceful
packet_debian12-cilium-svc-proxy:
stage: deploy-extended
extends: .packet_periodic

View File

@@ -1,17 +0,0 @@
---
# stub pipeline for dynamic generation
pre-commit:
tags:
- light
image: 'ghcr.io/pre-commit-ci/runner-image@sha256:aaf2c7b38b22286f2d381c11673bec571c28f61dd086d11b43a1c9444a813cef'
variables:
PRE_COMMIT_HOME: /pre-commit-cache
script:
- pre-commit run --all-files
cache:
key: pre-commit-$HOOK_ID
paths:
- /pre-commit-cache
parallel:
matrix:
- HOOK_ID:

16
.gitlab-ci/shellcheck.yml Normal file
View File

@@ -0,0 +1,16 @@
---
shellcheck:
extends: .job
stage: unit-tests
tags: [light]
variables:
SHELLCHECK_VERSION: v0.7.1
before_script:
- ./tests/scripts/rebase.sh
- curl --silent --location "https://github.com/koalaman/shellcheck/releases/download/"${SHELLCHECK_VERSION}"/shellcheck-"${SHELLCHECK_VERSION}".linux.x86_64.tar.xz" | tar -xJv
- cp shellcheck-"${SHELLCHECK_VERSION}"/shellcheck /usr/bin/
- shellcheck --version
script:
# Run shellcheck for all *.sh
- find . -name '*.sh' -not -path './.git/*' | xargs shellcheck --severity error
except: ['triggers', 'master']

View File

@@ -2,10 +2,6 @@
# Tests for contrib/terraform/ # Tests for contrib/terraform/
.terraform_install: .terraform_install:
extends: .job extends: .job
needs:
- ci-not-authorized
- pipeline-image
stage: deploy-part1
before_script: before_script:
- update-alternatives --install /usr/bin/python python /usr/bin/python3 1 - update-alternatives --install /usr/bin/python python /usr/bin/python3 1
- ./tests/scripts/rebase.sh - ./tests/scripts/rebase.sh
@@ -28,19 +24,17 @@
.terraform_validate: .terraform_validate:
extends: .terraform_install extends: .terraform_install
tags: [ffci] stage: unit-tests
tags: [light]
only: ['master', /^pr-.*$/] only: ['master', /^pr-.*$/]
script: script:
- terraform -chdir="contrib/terraform/$PROVIDER" validate - terraform -chdir="contrib/terraform/$PROVIDER" validate
- terraform -chdir="contrib/terraform/$PROVIDER" fmt -check -diff - terraform -chdir="contrib/terraform/$PROVIDER" fmt -check -diff
stage: test
needs:
- pipeline-image
.terraform_apply: .terraform_apply:
extends: .terraform_install extends: .terraform_install
tags: [ffci] tags: [light]
stage: deploy-extended stage: deploy-part3
when: manual when: manual
only: [/^pr-.*$/] only: [/^pr-.*$/]
artifacts: artifacts:
@@ -57,7 +51,7 @@
- tests/scripts/testcases_run.sh - tests/scripts/testcases_run.sh
after_script: after_script:
# Cleanup regardless of exit code # Cleanup regardless of exit code
- ./tests/scripts/testcases_cleanup.sh - chronic ./tests/scripts/testcases_cleanup.sh
tf-validate-openstack: tf-validate-openstack:
extends: .terraform_validate extends: .terraform_validate
@@ -152,7 +146,8 @@ tf-validate-nifcloud:
TF_VAR_router_id: "ab95917c-41fb-4881-b507-3a6dfe9403df" TF_VAR_router_id: "ab95917c-41fb-4881-b507-3a6dfe9403df"
tf-elastx_cleanup: tf-elastx_cleanup:
tags: [ffci] stage: unit-tests
tags: [light]
image: python image: python
variables: variables:
<<: *elastx_variables <<: *elastx_variables
@@ -160,11 +155,10 @@ tf-elastx_cleanup:
- pip install -r scripts/openstack-cleanup/requirements.txt - pip install -r scripts/openstack-cleanup/requirements.txt
script: script:
- ./scripts/openstack-cleanup/main.py - ./scripts/openstack-cleanup/main.py
allow_failure: true
tf-elastx_ubuntu20-calico: tf-elastx_ubuntu20-calico:
extends: .terraform_apply extends: .terraform_apply
stage: deploy-part1 stage: deploy-part3
when: on_success when: on_success
allow_failure: true allow_failure: true
variables: variables:

View File

@@ -1,63 +1,63 @@
--- ---
.vagrant: .vagrant:
extends: .testcases extends: .testcases
needs:
- ci-not-authorized
variables: variables:
CI_PLATFORM: "vagrant" CI_PLATFORM: "vagrant"
SSH_USER: "vagrant" SSH_USER: "vagrant"
VAGRANT_DEFAULT_PROVIDER: "libvirt" VAGRANT_DEFAULT_PROVIDER: "libvirt"
KUBESPRAY_VAGRANT_CONFIG: tests/files/${CI_JOB_NAME}.rb KUBESPRAY_VAGRANT_CONFIG: tests/files/${CI_JOB_NAME}.rb
DOCKER_NAME: vagrant tags: [c3.small.x86]
VAGRANT_ANSIBLE_TAGS: facts only: [/^pr-.*$/]
tags: [ffci-vm-large] except: ['triggers']
# only: [/^pr-.*$/] image: $PIPELINE_IMAGE
# except: ['triggers']
image: quay.io/kubespray/vm-kubespray-ci:v6
services: [] services: []
before_script: before_script:
- echo $USER
- python3 -m venv citest
- source citest/bin/activate
- vagrant plugin expunge --reinstall --force --no-tty
- vagrant plugin install vagrant-libvirt
- pip install --no-compile --no-cache-dir pip -U
- pip install --no-compile --no-cache-dir -r $CI_PROJECT_DIR/requirements.txt
- pip install --no-compile --no-cache-dir -r $CI_PROJECT_DIR/tests/requirements.txt
- ./tests/scripts/vagrant_clean.sh - ./tests/scripts/vagrant_clean.sh
script: script:
- ./tests/scripts/testcases_run.sh - ./tests/scripts/testcases_run.sh
after_script:
- chronic ./tests/scripts/testcases_cleanup.sh
allow_failure: true
vagrant_ubuntu20-calico-dual-stack: vagrant_ubuntu20-calico-dual-stack:
stage: deploy-extended stage: deploy-part2
extends: .vagrant
when: on_success
vagrant_ubuntu20-weave-medium:
stage: deploy-part2
extends: .vagrant extends: .vagrant
when: manual when: manual
# FIXME: this test if broken (perma-failing)
vagrant_ubuntu20-flannel: vagrant_ubuntu20-flannel:
stage: deploy-part1 stage: deploy-part2
extends: .vagrant extends: .vagrant
when: on_success when: on_success
allow_failure: false allow_failure: false
vagrant_ubuntu20-flannel-collection: vagrant_ubuntu20-flannel-collection:
stage: deploy-extended stage: deploy-part2
extends: .vagrant extends: .vagrant
when: manual when: on_success
vagrant_ubuntu20-kube-router-sep: vagrant_ubuntu20-kube-router-sep:
stage: deploy-extended stage: deploy-part2
extends: .vagrant extends: .vagrant
when: manual when: manual
# Service proxy test fails connectivity testing # Service proxy test fails connectivity testing
vagrant_ubuntu20-kube-router-svc-proxy: vagrant_ubuntu20-kube-router-svc-proxy:
stage: deploy-extended stage: deploy-part2
extends: .vagrant extends: .vagrant
when: manual when: manual
vagrant_fedora37-kube-router: vagrant_fedora37-kube-router:
stage: deploy-extended stage: deploy-part2
extends: .vagrant
when: on_success
vagrant_centos7-kube-router:
stage: deploy-part2
extends: .vagrant extends: .vagrant
when: manual when: manual
# FIXME: this test if broken (perma-failing)

3
.markdownlint.yaml Normal file
View File

@@ -0,0 +1,3 @@
---
MD013: false
MD029: false

View File

@@ -1,4 +0,0 @@
all
exclude_rule 'MD013'
exclude_rule 'MD029'
rule 'MD007', :indent => 2

1
.mdlrc
View File

@@ -1 +0,0 @@
style "#{File.dirname(__FILE__)}/.md_style.rb"

View File

@@ -1,7 +1,8 @@
--- ---
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0 rev: v3.4.0
hooks: hooks:
- id: check-added-large-files - id: check-added-large-files
- id: check-case-conflict - id: check-case-conflict
@@ -15,59 +16,47 @@ repos:
- id: trailing-whitespace - id: trailing-whitespace
- repo: https://github.com/adrienverge/yamllint.git - repo: https://github.com/adrienverge/yamllint.git
rev: v1.35.1 rev: v1.27.1
hooks: hooks:
- id: yamllint - id: yamllint
args: [--strict] args: [--strict]
- repo: https://github.com/markdownlint/markdownlint - repo: https://github.com/markdownlint/markdownlint
rev: v0.12.0 rev: v0.11.0
hooks: hooks:
- id: markdownlint - id: markdownlint
exclude: "^.github|(^docs/_sidebar\\.md$)" args: [ -r, "~MD013,~MD029" ]
exclude: "^.git"
- repo: https://github.com/shellcheck-py/shellcheck-py - repo: https://github.com/jumanjihouse/pre-commit-hooks
rev: v0.10.0.1 rev: 3.0.0
hooks: hooks:
- id: shellcheck - id: shellcheck
args: ["--severity=error"] args: [ --severity, "error" ]
exclude: "^.git" exclude: "^.git"
files: "\\.sh$" files: "\\.sh$"
- repo: https://github.com/ansible/ansible-lint
rev: v24.5.0
hooks:
- id: ansible-lint
additional_dependencies:
- ansible==9.8.0
- jsonschema==4.22.0
- jmespath==1.0.1
- netaddr==1.3.0
- distlib
- repo: https://github.com/golangci/misspell
rev: v0.6.0
hooks:
- id: misspell
exclude: "OWNERS_ALIASES$"
- repo: local - repo: local
hooks: hooks:
- id: ansible-lint
name: ansible-lint
entry: ansible-lint -v
language: python
pass_filenames: false
additional_dependencies:
- .[community]
- id: ansible-syntax-check - id: ansible-syntax-check
name: ansible-syntax-check name: ansible-syntax-check
entry: env ANSIBLE_INVENTORY=inventory/local-tests.cfg ANSIBLE_REMOTE_USER=root ANSIBLE_BECOME="true" ANSIBLE_BECOME_USER=root ANSIBLE_VERBOSITY="3" ansible-playbook --syntax-check entry: env ANSIBLE_INVENTORY=inventory/local-tests.cfg ANSIBLE_REMOTE_USER=root ANSIBLE_BECOME="true" ANSIBLE_BECOME_USER=root ANSIBLE_VERBOSITY="3" ansible-playbook --syntax-check
language: python language: python
files: "^cluster.yml|^upgrade-cluster.yml|^reset.yml|^extra_playbooks/upgrade-only-k8s.yml" files: "^cluster.yml|^upgrade-cluster.yml|^reset.yml|^extra_playbooks/upgrade-only-k8s.yml"
additional_dependencies:
- ansible==9.5.1
- id: tox-inventory-builder - id: tox-inventory-builder
name: tox-inventory-builder name: tox-inventory-builder
entry: bash -c "cd contrib/inventory_builder && tox" entry: bash -c "cd contrib/inventory_builder && tox"
language: python language: python
pass_filenames: false pass_filenames: false
additional_dependencies:
- tox==4.15.0
- id: check-readme-versions - id: check-readme-versions
name: check-readme-versions name: check-readme-versions
@@ -75,36 +64,8 @@ repos:
language: script language: script
pass_filenames: false pass_filenames: false
- id: collection-build-install
name: Build and install kubernetes-sigs.kubespray Ansible collection
language: python
additional_dependencies:
- ansible-core>=2.16.4
- distlib
entry: tests/scripts/collection-build-install.sh
pass_filenames: false
- id: generate-docs-sidebar
name: generate-docs-sidebar
entry: scripts/gen_docs_sidebar.sh
language: script
pass_filenames: false
- id: ci-matrix - id: ci-matrix
name: ci-matrix name: ci-matrix
entry: tests/scripts/md-table/main.py entry: tests/scripts/md-table/test.sh
language: python language: script
pass_filenames: false pass_filenames: false
additional_dependencies:
- jinja2
- pathlib
- pyaml
- id: jinja-syntax-check
name: jinja-syntax-check
entry: tests/scripts/check-templates.py
language: python
types:
- jinja
additional_dependencies:
- jinja2

View File

@@ -3,10 +3,9 @@ extends: default
ignore: | ignore: |
.git/ .git/
.github/
# Generated file # Generated file
tests/files/custom_cni/cilium.yaml tests/files/custom_cni/cilium.yaml
# https://ansible.readthedocs.io/projects/lint/rules/yaml/
rules: rules:
braces: braces:
min-spaces-inside: 0 min-spaces-inside: 0
@@ -14,15 +13,9 @@ rules:
brackets: brackets:
min-spaces-inside: 0 min-spaces-inside: 0
max-spaces-inside: 1 max-spaces-inside: 1
comments:
min-spaces-from-content: 1
# https://github.com/adrienverge/yamllint/issues/384
comments-indentation: false
indentation: indentation:
spaces: 2 spaces: 2
indent-sequences: consistent indent-sequences: consistent
line-length: disable line-length: disable
new-line-at-end-of-file: disable new-line-at-end-of-file: disable
octal-values: truthy: disable
forbid-implicit-octal: true # yamllint defaults to false
forbid-explicit-octal: true # yamllint defaults to false

View File

@@ -1,8 +1,5 @@
# syntax=docker/dockerfile:1
# Use imutable image tags rather than mutable tags (like ubuntu:22.04) # Use imutable image tags rather than mutable tags (like ubuntu:22.04)
FROM ubuntu:22.04@sha256:149d67e29f765f4db62aa52161009e99e389544e25a8f43c8c89d4a445a7ca37 FROM ubuntu:jammy-20230308
# Some tools like yamllint need this # Some tools like yamllint need this
# Pip needs this as well at the moment to install ansible # Pip needs this as well at the moment to install ansible
# (and potentially other packages) # (and potentially other packages)
@@ -10,37 +7,7 @@ FROM ubuntu:22.04@sha256:149d67e29f765f4db62aa52161009e99e389544e25a8f43c8c89d4a
ENV LANG=C.UTF-8 \ ENV LANG=C.UTF-8 \
DEBIAN_FRONTEND=noninteractive \ DEBIAN_FRONTEND=noninteractive \
PYTHONDONTWRITEBYTECODE=1 PYTHONDONTWRITEBYTECODE=1
WORKDIR /kubespray WORKDIR /kubespray
# hadolint ignore=DL3008
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
apt-get update -q \
&& apt-get install -yq --no-install-recommends \
curl \
python3 \
python3-pip \
sshpass \
vim \
rsync \
openssh-client \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* /var/log/*
RUN --mount=type=bind,source=requirements.txt,target=requirements.txt \
--mount=type=cache,sharing=locked,id=pipcache,mode=0777,target=/root/.cache/pip \
pip install --no-compile --no-cache-dir -r requirements.txt \
&& find /usr -type d -name '*__pycache__' -prune -exec rm -rf {} \;
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN --mount=type=bind,source=roles/kubespray-defaults/defaults/main/main.yml,target=roles/kubespray-defaults/defaults/main/main.yml \
KUBE_VERSION=$(sed -n 's/^kube_version: //p' roles/kubespray-defaults/defaults/main/main.yml) \
OS_ARCHITECTURE=$(dpkg --print-architecture) \
&& curl -L "https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${OS_ARCHITECTURE}/kubectl" -o /usr/local/bin/kubectl \
&& echo "$(curl -L "https://dl.k8s.io/release/${KUBE_VERSION}/bin/linux/${OS_ARCHITECTURE}/kubectl.sha256")" /usr/local/bin/kubectl | sha256sum --check \
&& chmod a+x /usr/local/bin/kubectl
COPY *.yml ./ COPY *.yml ./
COPY *.cfg ./ COPY *.cfg ./
COPY roles ./roles COPY roles ./roles
@@ -50,3 +17,29 @@ COPY library ./library
COPY extra_playbooks ./extra_playbooks COPY extra_playbooks ./extra_playbooks
COPY playbooks ./playbooks COPY playbooks ./playbooks
COPY plugins ./plugins COPY plugins ./plugins
RUN apt update -q \
&& apt install -yq --no-install-recommends \
curl \
python3 \
python3-pip \
sshpass \
vim \
rsync \
openssh-client \
&& pip install --no-compile --no-cache-dir \
ansible==7.6.0 \
ansible-core==2.14.6 \
cryptography==41.0.1 \
jinja2==3.1.2 \
netaddr==0.8.0 \
jmespath==1.0.1 \
MarkupSafe==2.1.3 \
ruamel.yaml==0.17.21 \
passlib==1.7.4 \
&& KUBE_VERSION=$(sed -n 's/^kube_version: //p' roles/kubespray-defaults/defaults/main.yaml) \
&& curl -L https://dl.k8s.io/release/$KUBE_VERSION/bin/linux/$(dpkg --print-architecture)/kubectl -o /usr/local/bin/kubectl \
&& echo $(curl -L https://dl.k8s.io/release/$KUBE_VERSION/bin/linux/$(dpkg --print-architecture)/kubectl.sha256) /usr/local/bin/kubectl | sha256sum --check \
&& chmod a+x /usr/local/bin/kubectl \
&& rm -rf /var/lib/apt/lists/* /var/log/* \
&& find /usr -type d -name '*__pycache__' -prune -exec rm -rf {} \;

View File

@@ -1,26 +1,31 @@
aliases: aliases:
kubespray-approvers: kubespray-approvers:
- cristicalin
- floryut
- liupeng0518
- mzaian
- oomichi
- yankay
- ant31
- vannten
kubespray-reviewers:
- cyclinder
- erikjiang
- mrfreezeex
- mzaian
- tico88612
- vannten
- yankay
kubespray-emeritus_approvers:
- atoms
- chadswen
- luckysb
- mattymo - mattymo
- chadswen
- mirwan
- miouge1 - miouge1
- luckysb
- floryut
- oomichi
- cristicalin
- liupeng0518
- yankay
- mzaian
kubespray-reviewers:
- holmsten
- bozzo
- eppo
- oomichi
- jayonlau
- cristicalin
- liupeng0518
- yankay
- cyclinder
- mzaian
- mrfreezeex
- erikjiang
kubespray-emeritus_approvers:
- riverzhang - riverzhang
- atoms
- ant31
- woopstar - woopstar

149
README.md
View File

@@ -5,7 +5,7 @@
If you have questions, check the documentation at [kubespray.io](https://kubespray.io) and join us on the [kubernetes slack](https://kubernetes.slack.com), channel **\#kubespray**. If you have questions, check the documentation at [kubespray.io](https://kubespray.io) and join us on the [kubernetes slack](https://kubernetes.slack.com), channel **\#kubespray**.
You can get your invite [here](http://slack.k8s.io/) You can get your invite [here](http://slack.k8s.io/)
- Can be deployed on **[AWS](docs/cloud_providers/aws.md), GCE, [Azure](docs/cloud_providers/azure.md), [OpenStack](docs/cloud_providers/openstack.md), [vSphere](docs/cloud_providers/vsphere.md), [Equinix Metal](docs/cloud_providers/equinix-metal.md) (bare metal), Oracle Cloud Infrastructure (Experimental), or Baremetal** - Can be deployed on **[AWS](docs/aws.md), GCE, [Azure](docs/azure.md), [OpenStack](docs/openstack.md), [vSphere](docs/vsphere.md), [Equinix Metal](docs/equinix-metal.md) (bare metal), Oracle Cloud Infrastructure (Experimental), or Baremetal**
- **Highly available** cluster - **Highly available** cluster
- **Composable** (Choice of the network plugin for instance) - **Composable** (Choice of the network plugin for instance)
- Supports most popular **Linux distributions** - Supports most popular **Linux distributions**
@@ -19,7 +19,7 @@ Below are several ways to use Kubespray to deploy a Kubernetes cluster.
#### Usage #### Usage
Install Ansible according to [Ansible installation guide](/docs/ansible/ansible.md#installing-ansible) Install Ansible according to [Ansible installation guide](/docs/ansible.md#installing-ansible)
then run the following steps: then run the following steps:
```ShellSession ```ShellSession
@@ -75,18 +75,18 @@ You will then need to use [bind mounts](https://docs.docker.com/storage/bind-mou
to access the inventory and SSH key in the container, like this: to access the inventory and SSH key in the container, like this:
```ShellSession ```ShellSession
git checkout v2.25.0 git checkout v2.23.3
docker pull quay.io/kubespray/kubespray:v2.25.0 docker pull quay.io/kubespray/kubespray:v2.23.3
docker run --rm -it --mount type=bind,source="$(pwd)"/inventory/sample,dst=/inventory \ docker run --rm -it --mount type=bind,source="$(pwd)"/inventory/sample,dst=/inventory \
--mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \ --mount type=bind,source="${HOME}"/.ssh/id_rsa,dst=/root/.ssh/id_rsa \
quay.io/kubespray/kubespray:v2.25.0 bash quay.io/kubespray/kubespray:v2.23.3 bash
# Inside the container you may now run the kubespray playbooks: # Inside the container you may now run the kubespray playbooks:
ansible-playbook -i /inventory/inventory.ini --private-key /root/.ssh/id_rsa cluster.yml ansible-playbook -i /inventory/inventory.ini --private-key /root/.ssh/id_rsa cluster.yml
``` ```
#### Collection #### Collection
See [here](docs/ansible/ansible_collection.md) if you wish to use this repository as an Ansible collection See [here](docs/ansible_collection.md) if you wish to use this repository as an Ansible collection
### Vagrant ### Vagrant
@@ -99,7 +99,7 @@ python -V && pip -V
If this returns the version of the software, you're good to go. If not, download and install Python from here <https://www.python.org/downloads/source/> If this returns the version of the software, you're good to go. If not, download and install Python from here <https://www.python.org/downloads/source/>
Install Ansible according to [Ansible installation guide](/docs/ansible/ansible.md#installing-ansible) Install Ansible according to [Ansible installation guide](/docs/ansible.md#installing-ansible)
then run the following step: then run the following step:
```ShellSession ```ShellSession
@@ -109,79 +109,80 @@ vagrant up
## Documents ## Documents
- [Requirements](#requirements) - [Requirements](#requirements)
- [Kubespray vs ...](docs/getting_started/comparisons.md) - [Kubespray vs ...](docs/comparisons.md)
- [Getting started](docs/getting_started/getting-started.md) - [Getting started](docs/getting-started.md)
- [Setting up your first cluster](docs/getting_started/setting-up-your-first-cluster.md) - [Setting up your first cluster](docs/setting-up-your-first-cluster.md)
- [Ansible inventory and tags](docs/ansible/ansible.md) - [Ansible inventory and tags](docs/ansible.md)
- [Integration with existing ansible repo](docs/operations/integration.md) - [Integration with existing ansible repo](docs/integration.md)
- [Deployment data variables](docs/ansible/vars.md) - [Deployment data variables](docs/vars.md)
- [DNS stack](docs/advanced/dns-stack.md) - [DNS stack](docs/dns-stack.md)
- [HA mode](docs/operations/ha-mode.md) - [HA mode](docs/ha-mode.md)
- [Network plugins](#network-plugins) - [Network plugins](#network-plugins)
- [Vagrant install](docs/developers/vagrant.md) - [Vagrant install](docs/vagrant.md)
- [Flatcar Container Linux bootstrap](docs/operating_systems/flatcar.md) - [Flatcar Container Linux bootstrap](docs/flatcar.md)
- [Fedora CoreOS bootstrap](docs/operating_systems/fcos.md) - [Fedora CoreOS bootstrap](docs/fcos.md)
- [openSUSE setup](docs/operating_systems/opensuse.md) - [Debian Jessie setup](docs/debian.md)
- [Downloaded artifacts](docs/advanced/downloads.md) - [openSUSE setup](docs/opensuse.md)
- [Cloud providers](docs/cloud_providers/cloud.md) - [Downloaded artifacts](docs/downloads.md)
- [OpenStack](docs/cloud_providers/openstack.md) - [Cloud providers](docs/cloud.md)
- [AWS](docs/cloud_providers/aws.md) - [OpenStack](docs/openstack.md)
- [Azure](docs/cloud_providers/azure.md) - [AWS](docs/aws.md)
- [vSphere](docs/cloud_providers/vsphere.md) - [Azure](docs/azure.md)
- [Equinix Metal](docs/cloud_providers/equinix-metal.md) - [vSphere](docs/vsphere.md)
- [Large deployments](docs/operations/large-deployments.md) - [Equinix Metal](docs/equinix-metal.md)
- [Adding/replacing a node](docs/operations/nodes.md) - [Large deployments](docs/large-deployments.md)
- [Upgrades basics](docs/operations/upgrades.md) - [Adding/replacing a node](docs/nodes.md)
- [Air-Gap installation](docs/operations/offline-environment.md) - [Upgrades basics](docs/upgrades.md)
- [NTP](docs/advanced/ntp.md) - [Air-Gap installation](docs/offline-environment.md)
- [Hardening](docs/operations/hardening.md) - [NTP](docs/ntp.md)
- [Mirror](docs/operations/mirror.md) - [Hardening](docs/hardening.md)
- [Roadmap](docs/roadmap/roadmap.md) - [Mirror](docs/mirror.md)
- [Roadmap](docs/roadmap.md)
## Supported Linux Distributions ## Supported Linux Distributions
- **Flatcar Container Linux by Kinvolk** - **Flatcar Container Linux by Kinvolk**
- **Debian** Bookworm, Bullseye - **Debian** Bookworm, Bullseye, Buster
- **Ubuntu** 20.04, 22.04, 24.04 - **Ubuntu** 20.04, 22.04
- **CentOS/RHEL** [8, 9](docs/operating_systems/centos.md#centos-8) - **CentOS/RHEL** 7, [8, 9](docs/centos.md#centos-8)
- **Fedora** 37, 38 - **Fedora** 37, 38
- **Fedora CoreOS** (see [fcos Note](docs/operating_systems/fcos.md)) - **Fedora CoreOS** (see [fcos Note](docs/fcos.md))
- **openSUSE** Leap 15.x/Tumbleweed - **openSUSE** Leap 15.x/Tumbleweed
- **Oracle Linux** [8, 9](docs/operating_systems/centos.md#centos-8) - **Oracle Linux** 7, [8, 9](docs/centos.md#centos-8)
- **Alma Linux** [8, 9](docs/operating_systems/centos.md#centos-8) - **Alma Linux** [8, 9](docs/centos.md#centos-8)
- **Rocky Linux** [8, 9](docs/operating_systems/centos.md#centos-8) - **Rocky Linux** [8, 9](docs/centos.md#centos-8)
- **Kylin Linux Advanced Server V10** (experimental: see [kylin linux notes](docs/operating_systems/kylinlinux.md)) - **Kylin Linux Advanced Server V10** (experimental: see [kylin linux notes](docs/kylinlinux.md))
- **Amazon Linux 2** (experimental: see [amazon linux notes](docs/operating_systems/amazonlinux.md)) - **Amazon Linux 2** (experimental: see [amazon linux notes](docs/amazonlinux.md))
- **UOS Linux** (experimental: see [uos linux notes](docs/operating_systems/uoslinux.md)) - **UOS Linux** (experimental: see [uos linux notes](docs/uoslinux.md))
- **openEuler** (experimental: see [openEuler notes](docs/operating_systems/openeuler.md)) - **openEuler** (experimental: see [openEuler notes](docs/openeuler.md))
Note: Upstart/SysV init based OS types are not supported. Note: Upstart/SysV init based OS types are not supported.
## Supported Components ## Supported Components
- Core - Core
- [kubernetes](https://github.com/kubernetes/kubernetes) v1.30.4 - [kubernetes](https://github.com/kubernetes/kubernetes) v1.27.10
- [etcd](https://github.com/etcd-io/etcd) v3.5.12 - [etcd](https://github.com/etcd-io/etcd) v3.5.10
- [docker](https://www.docker.com/) v26.1 - [docker](https://www.docker.com/) v20.10 (see note)
- [containerd](https://containerd.io/) v1.7.21 - [containerd](https://containerd.io/) v1.7.13
- [cri-o](http://cri-o.io/) v1.30.3 (experimental: see [CRI-O Note](docs/CRI/cri-o.md). Only on fedora, ubuntu and centos based OS) - [cri-o](http://cri-o.io/) v1.27 (experimental: see [CRI-O Note](docs/cri-o.md). Only on fedora, ubuntu and centos based OS)
- Network Plugin - Network Plugin
- [cni-plugins](https://github.com/containernetworking/plugins) v1.2.0 - [cni-plugins](https://github.com/containernetworking/plugins) v1.2.0
- [calico](https://github.com/projectcalico/calico) v3.28.1 - [calico](https://github.com/projectcalico/calico) v3.25.2
- [cilium](https://github.com/cilium/cilium) v1.15.4 - [cilium](https://github.com/cilium/cilium) v1.13.4
- [flannel](https://github.com/flannel-io/flannel) v0.22.0 - [flannel](https://github.com/flannel-io/flannel) v0.22.0
- [kube-ovn](https://github.com/alauda/kube-ovn) v1.12.21 - [kube-ovn](https://github.com/alauda/kube-ovn) v1.11.5
- [kube-router](https://github.com/cloudnativelabs/kube-router) v2.0.0 - [kube-router](https://github.com/cloudnativelabs/kube-router) v1.5.1
- [multus](https://github.com/k8snetworkplumbingwg/multus-cni) v3.8 - [multus](https://github.com/k8snetworkplumbingwg/multus-cni) v3.8
- [weave](https://github.com/rajch/weave) v2.8.7 - [weave](https://github.com/weaveworks/weave) v2.8.1
- [kube-vip](https://github.com/kube-vip/kube-vip) v0.8.0 - [kube-vip](https://github.com/kube-vip/kube-vip) v0.5.12
- Application - Application
- [cert-manager](https://github.com/jetstack/cert-manager) v1.14.7 - [cert-manager](https://github.com/jetstack/cert-manager) v1.11.1
- [coredns](https://github.com/coredns/coredns) v1.11.1 - [coredns](https://github.com/coredns/coredns) v1.10.1
- [ingress-nginx](https://github.com/kubernetes/ingress-nginx) v1.11.2 - [ingress-nginx](https://github.com/kubernetes/ingress-nginx) v1.8.1
- [krew](https://github.com/kubernetes-sigs/krew) v0.4.4 - [krew](https://github.com/kubernetes-sigs/krew) v0.4.4
- [argocd](https://argoproj.github.io/) v2.11.0 - [argocd](https://argoproj.github.io/) v2.8.0
- [helm](https://helm.sh/) v3.15.4 - [helm](https://helm.sh/) v3.12.3
- [metallb](https://metallb.universe.tf/) v0.13.9 - [metallb](https://metallb.universe.tf/) v0.13.9
- [registry](https://github.com/distribution/distribution) v2.8.1 - [registry](https://github.com/distribution/distribution) v2.8.1
- Storage Plugin - Storage Plugin
@@ -189,21 +190,21 @@ Note: Upstart/SysV init based OS types are not supported.
- [rbd-provisioner](https://github.com/kubernetes-incubator/external-storage) v2.1.1-k8s1.11 - [rbd-provisioner](https://github.com/kubernetes-incubator/external-storage) v2.1.1-k8s1.11
- [aws-ebs-csi-plugin](https://github.com/kubernetes-sigs/aws-ebs-csi-driver) v0.5.0 - [aws-ebs-csi-plugin](https://github.com/kubernetes-sigs/aws-ebs-csi-driver) v0.5.0
- [azure-csi-plugin](https://github.com/kubernetes-sigs/azuredisk-csi-driver) v1.10.0 - [azure-csi-plugin](https://github.com/kubernetes-sigs/azuredisk-csi-driver) v1.10.0
- [cinder-csi-plugin](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/cinder-csi-plugin/using-cinder-csi-plugin.md) v1.30.0 - [cinder-csi-plugin](https://github.com/kubernetes/cloud-provider-openstack/blob/master/docs/cinder-csi-plugin/using-cinder-csi-plugin.md) v1.22.0
- [gcp-pd-csi-plugin](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver) v1.9.2 - [gcp-pd-csi-plugin](https://github.com/kubernetes-sigs/gcp-compute-persistent-disk-csi-driver) v1.9.2
- [local-path-provisioner](https://github.com/rancher/local-path-provisioner) v0.0.24 - [local-path-provisioner](https://github.com/rancher/local-path-provisioner) v0.0.24
- [local-volume-provisioner](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) v2.5.0 - [local-volume-provisioner](https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner) v2.5.0
- [node-feature-discovery](https://github.com/kubernetes-sigs/node-feature-discovery) v0.16.4
## Container Runtime Notes ## Container Runtime Notes
- Supported Docker versions are 18.09, 19.03, 20.10, 23.0 and 24.0. The *recommended* Docker version is 20.10 (except on Debian bookworm which without supporting for 20.10 and below any more). `Kubelet` might break on docker's non-standard version numbering (it no longer uses semantic versioning). To ensure auto-updates don't break your cluster look into e.g. the YUM ``versionlock`` plugin or ``apt pin``).
- The cri-o version should be aligned with the respective kubernetes version (i.e. kube_version=1.20.x, crio_version=1.20) - The cri-o version should be aligned with the respective kubernetes version (i.e. kube_version=1.20.x, crio_version=1.20)
## Requirements ## Requirements
- **Minimum required version of Kubernetes is v1.28** - **Minimum required version of Kubernetes is v1.25**
- **Ansible v2.14+, Jinja 2.11+ and python-netaddr is installed on the machine that will run Ansible commands** - **Ansible v2.14+, Jinja 2.11+ and python-netaddr is installed on the machine that will run Ansible commands**
- The target servers must have **access to the Internet** in order to pull docker images. Otherwise, additional configuration is required (See [Offline Environment](docs/operations/offline-environment.md)) - The target servers must have **access to the Internet** in order to pull docker images. Otherwise, additional configuration is required (See [Offline Environment](docs/offline-environment.md))
- The target servers are configured to allow **IPv4 forwarding**. - The target servers are configured to allow **IPv4 forwarding**.
- If using IPv6 for pods and services, the target servers are configured to allow **IPv6 forwarding**. - If using IPv6 for pods and services, the target servers are configured to allow **IPv6 forwarding**.
- The **firewalls are not managed**, you'll need to implement your own rules the way you used to. - The **firewalls are not managed**, you'll need to implement your own rules the way you used to.
@@ -224,7 +225,7 @@ These limits are safeguarded by Kubespray. Actual requirements for your workload
You can choose among ten network plugins. (default: `calico`, except Vagrant uses `flannel`) You can choose among ten network plugins. (default: `calico`, except Vagrant uses `flannel`)
- [flannel](docs/CNI/flannel.md): gre/vxlan (layer 2) networking. - [flannel](docs/flannel.md): gre/vxlan (layer 2) networking.
- [Calico](https://docs.tigera.io/calico/latest/about/) is a networking and network policy provider. Calico supports a flexible set of networking options - [Calico](https://docs.tigera.io/calico/latest/about/) is a networking and network policy provider. Calico supports a flexible set of networking options
designed to give you the most efficient networking across a range of situations, including non-overlay designed to give you the most efficient networking across a range of situations, including non-overlay
@@ -233,32 +234,32 @@ You can choose among ten network plugins. (default: `calico`, except Vagrant use
- [cilium](http://docs.cilium.io/en/latest/): layer 3/4 networking (as well as layer 7 to protect and secure application protocols), supports dynamic insertion of BPF bytecode into the Linux kernel to implement security services, networking and visibility logic. - [cilium](http://docs.cilium.io/en/latest/): layer 3/4 networking (as well as layer 7 to protect and secure application protocols), supports dynamic insertion of BPF bytecode into the Linux kernel to implement security services, networking and visibility logic.
- [weave](docs/CNI/weave.md): Weave is a lightweight container overlay network that doesn't require an external K/V database cluster. - [weave](docs/weave.md): Weave is a lightweight container overlay network that doesn't require an external K/V database cluster.
(Please refer to `weave` [troubleshooting documentation](https://www.weave.works/docs/net/latest/troubleshooting/)). (Please refer to `weave` [troubleshooting documentation](https://www.weave.works/docs/net/latest/troubleshooting/)).
- [kube-ovn](docs/CNI/kube-ovn.md): Kube-OVN integrates the OVN-based Network Virtualization with Kubernetes. It offers an advanced Container Network Fabric for Enterprises. - [kube-ovn](docs/kube-ovn.md): Kube-OVN integrates the OVN-based Network Virtualization with Kubernetes. It offers an advanced Container Network Fabric for Enterprises.
- [kube-router](docs/CNI/kube-router.md): Kube-router is a L3 CNI for Kubernetes networking aiming to provide operational - [kube-router](docs/kube-router.md): Kube-router is a L3 CNI for Kubernetes networking aiming to provide operational
simplicity and high performance: it uses IPVS to provide Kube Services Proxy (if setup to replace kube-proxy), simplicity and high performance: it uses IPVS to provide Kube Services Proxy (if setup to replace kube-proxy),
iptables for network policies, and BGP for ods L3 networking (with optionally BGP peering with out-of-cluster BGP peers). iptables for network policies, and BGP for ods L3 networking (with optionally BGP peering with out-of-cluster BGP peers).
It can also optionally advertise routes to Kubernetes cluster Pods CIDRs, ClusterIPs, ExternalIPs and LoadBalancerIPs. It can also optionally advertise routes to Kubernetes cluster Pods CIDRs, ClusterIPs, ExternalIPs and LoadBalancerIPs.
- [macvlan](docs/CNI/macvlan.md): Macvlan is a Linux network driver. Pods have their own unique Mac and Ip address, connected directly the physical (layer 2) network. - [macvlan](docs/macvlan.md): Macvlan is a Linux network driver. Pods have their own unique Mac and Ip address, connected directly the physical (layer 2) network.
- [multus](docs/CNI/multus.md): Multus is a meta CNI plugin that provides multiple network interface support to pods. For each interface Multus delegates CNI calls to secondary CNI plugins such as Calico, macvlan, etc. - [multus](docs/multus.md): Multus is a meta CNI plugin that provides multiple network interface support to pods. For each interface Multus delegates CNI calls to secondary CNI plugins such as Calico, macvlan, etc.
- [custom_cni](roles/network-plugin/custom_cni/) : You can specify some manifests that will be applied to the clusters to bring you own CNI and use non-supported ones by Kubespray. - [custom_cni](roles/network-plugin/custom_cni/) : You can specify some manifests that will be applied to the clusters to bring you own CNI and use non-supported ones by Kubespray.
See `tests/files/custom_cni/README.md` and `tests/files/custom_cni/values.yaml`for an example with a CNI provided by a Helm Chart. See `tests/files/custom_cni/README.md` and `tests/files/custom_cni/values.yaml`for an example with a CNI provided by a Helm Chart.
The network plugin to use is defined by the variable `kube_network_plugin`. There is also an The network plugin to use is defined by the variable `kube_network_plugin`. There is also an
option to leverage built-in cloud provider networking instead. option to leverage built-in cloud provider networking instead.
See also [Network checker](docs/advanced/netcheck.md). See also [Network checker](docs/netcheck.md).
## Ingress Plugins ## Ingress Plugins
- [nginx](https://kubernetes.github.io/ingress-nginx): the NGINX Ingress Controller. - [nginx](https://kubernetes.github.io/ingress-nginx): the NGINX Ingress Controller.
- [metallb](docs/ingress/metallb.md): the MetalLB bare-metal service LoadBalancer provider. - [metallb](docs/metallb.md): the MetalLB bare-metal service LoadBalancer provider.
## Community docs and resources ## Community docs and resources
@@ -279,4 +280,4 @@ See also [Network checker](docs/advanced/netcheck.md).
CI/end-to-end tests sponsored by: [CNCF](https://cncf.io), [Equinix Metal](https://metal.equinix.com/), [OVHcloud](https://www.ovhcloud.com/), [ELASTX](https://elastx.se/). CI/end-to-end tests sponsored by: [CNCF](https://cncf.io), [Equinix Metal](https://metal.equinix.com/), [OVHcloud](https://www.ovhcloud.com/), [ELASTX](https://elastx.se/).
See the [test matrix](docs/developers/test_cases.md) for details. See the [test matrix](docs/test_cases.md) for details.

View File

@@ -3,20 +3,17 @@
The Kubespray Project is released on an as-needed basis. The process is as follows: The Kubespray Project is released on an as-needed basis. The process is as follows:
1. An issue is proposing a new release with a changelog since the last release. Please see [a good sample issue](https://github.com/kubernetes-sigs/kubespray/issues/8325) 1. An issue is proposing a new release with a changelog since the last release. Please see [a good sample issue](https://github.com/kubernetes-sigs/kubespray/issues/8325)
1. At least one of the [approvers](OWNERS_ALIASES) must approve this release 2. At least one of the [approvers](OWNERS_ALIASES) must approve this release
1. (Only for major releases) The `kube_version_min_required` variable is set to `n-1` 3. The `kube_version_min_required` variable is set to `n-1`
1. (Only for major releases) Remove hashes for [EOL versions](https://github.com/kubernetes/website/blob/main/content/en/releases/patch-releases.md) of kubernetes from `*_checksums` variables. 4. Remove hashes for [EOL versions](https://github.com/kubernetes/website/blob/main/content/en/releases/patch-releases.md) of kubernetes from `*_checksums` variables.
1. Create the release note with [Kubernetes Release Notes Generator](https://github.com/kubernetes/release/blob/master/cmd/release-notes/README.md). See the following `Release note creation` section for the details. 5. Create the release note with [Kubernetes Release Notes Generator](https://github.com/kubernetes/release/blob/master/cmd/release-notes/README.md). See the following `Release note creation` section for the details.
1. An approver creates [new release in GitHub](https://github.com/kubernetes-sigs/kubespray/releases/new) using a version and tag name like `vX.Y.Z` and attaching the release notes 6. An approver creates [new release in GitHub](https://github.com/kubernetes-sigs/kubespray/releases/new) using a version and tag name like `vX.Y.Z` and attaching the release notes
1. (Only for major releases) An approver creates a release branch in the form `release-X.Y` 7. An approver creates a release branch in the form `release-X.Y`
1. (For major releases) On the `master` branch: bump the version in `galaxy.yml` to the next expected major release (X.y.0 with y = Y + 1), make a Pull Request. 8. The corresponding version of [quay.io/kubespray/kubespray:vX.Y.Z](https://quay.io/repository/kubespray/kubespray) and [quay.io/kubespray/vagrant:vX.Y.Z](https://quay.io/repository/kubespray/vagrant) container images are built and tagged. See the following `Container image creation` section for the details.
1. (For minor releases) On the `release-X.Y` branch: bump the version in `galaxy.yml` to the next expected minor release (X.Y.z with z = Z + 1), make a Pull Request. 9. The `KUBESPRAY_VERSION` variable is updated in `.gitlab-ci.yml`
1. The corresponding version of [quay.io/kubespray/kubespray:vX.Y.Z](https://quay.io/repository/kubespray/kubespray) and [quay.io/kubespray/vagrant:vX.Y.Z](https://quay.io/repository/kubespray/vagrant) container images are built and tagged. See the following `Container image creation` section for the details. 10. The release issue is closed
1. (Only for major releases) The `KUBESPRAY_VERSION` in `.gitlab-ci.yml` is upgraded to the version we just released # TODO clarify this, this variable is for testing upgrades. 11. An announcement email is sent to `dev@kubernetes.io` with the subject `[ANNOUNCE] Kubespray $VERSION is released`
1. The release issue is closed 12. The topic of the #kubespray channel is updated with `vX.Y.Z is released! | ...`
1. An announcement email is sent to `dev@kubernetes.io` with the subject `[ANNOUNCE] Kubespray $VERSION is released`
1. The topic of the #kubespray channel is updated with `vX.Y.Z is released! | ...`
1. Create/Update Issue for upgradeing kubernetes and [k8s-conformance](https://github.com/cncf/k8s-conformance)
## Major/minor releases and milestones ## Major/minor releases and milestones

36
Vagrantfile vendored
View File

@@ -1,7 +1,7 @@
# -*- mode: ruby -*- # -*- mode: ruby -*-
# # vi: set ft=ruby : # # vi: set ft=ruby :
# For help on using kubespray with vagrant, check out docs/developers/vagrant.md # For help on using kubespray with vagrant, check out docs/vagrant.md
require 'fileutils' require 'fileutils'
@@ -21,22 +21,21 @@ SUPPORTED_OS = {
"flatcar-edge" => {box: "flatcar-edge", user: "core", box_url: FLATCAR_URL_TEMPLATE % ["edge"]}, "flatcar-edge" => {box: "flatcar-edge", user: "core", box_url: FLATCAR_URL_TEMPLATE % ["edge"]},
"ubuntu2004" => {box: "generic/ubuntu2004", user: "vagrant"}, "ubuntu2004" => {box: "generic/ubuntu2004", user: "vagrant"},
"ubuntu2204" => {box: "generic/ubuntu2204", user: "vagrant"}, "ubuntu2204" => {box: "generic/ubuntu2204", user: "vagrant"},
"ubuntu2404" => {box: "bento/ubuntu-24.04", user: "vagrant"}, "centos" => {box: "centos/7", user: "vagrant"},
"centos-bento" => {box: "bento/centos-7.6", user: "vagrant"},
"centos8" => {box: "centos/8", user: "vagrant"}, "centos8" => {box: "centos/8", user: "vagrant"},
"centos8-bento" => {box: "bento/centos-8", user: "vagrant"}, "centos8-bento" => {box: "bento/centos-8", user: "vagrant"},
"almalinux8" => {box: "almalinux/8", user: "vagrant"}, "almalinux8" => {box: "almalinux/8", user: "vagrant"},
"almalinux8-bento" => {box: "bento/almalinux-8", user: "vagrant"}, "almalinux8-bento" => {box: "bento/almalinux-8", user: "vagrant"},
"rockylinux8" => {box: "rockylinux/8", user: "vagrant"}, "rockylinux8" => {box: "generic/rocky8", user: "vagrant"},
"rockylinux9" => {box: "rockylinux/9", user: "vagrant"},
"fedora37" => {box: "fedora/37-cloud-base", user: "vagrant"}, "fedora37" => {box: "fedora/37-cloud-base", user: "vagrant"},
"fedora38" => {box: "fedora/38-cloud-base", user: "vagrant"}, "fedora38" => {box: "fedora/38-cloud-base", user: "vagrant"},
"opensuse" => {box: "opensuse/Leap-15.4.x86_64", user: "vagrant"}, "opensuse" => {box: "opensuse/Leap-15.4.x86_64", user: "vagrant"},
"opensuse-tumbleweed" => {box: "opensuse/Tumbleweed.x86_64", user: "vagrant"}, "opensuse-tumbleweed" => {box: "opensuse/Tumbleweed.x86_64", user: "vagrant"},
"oraclelinux" => {box: "generic/oracle7", user: "vagrant"}, "oraclelinux" => {box: "generic/oracle7", user: "vagrant"},
"oraclelinux8" => {box: "generic/oracle8", user: "vagrant"}, "oraclelinux8" => {box: "generic/oracle8", user: "vagrant"},
"rhel7" => {box: "generic/rhel7", user: "vagrant"},
"rhel8" => {box: "generic/rhel8", user: "vagrant"}, "rhel8" => {box: "generic/rhel8", user: "vagrant"},
"debian11" => {box: "debian/bullseye64", user: "vagrant"},
"debian12" => {box: "debian/bookworm64", user: "vagrant"},
} }
if File.exist?(CONFIG) if File.exist?(CONFIG)
@@ -78,10 +77,7 @@ $libvirt_nested ||= false
$ansible_verbosity ||= false $ansible_verbosity ||= false
$ansible_tags ||= ENV['VAGRANT_ANSIBLE_TAGS'] || "" $ansible_tags ||= ENV['VAGRANT_ANSIBLE_TAGS'] || ""
$vagrant_dir ||= File.join(File.dirname(__FILE__), ".vagrant")
$playbook ||= "cluster.yml" $playbook ||= "cluster.yml"
$extra_vars ||= {}
host_vars = {} host_vars = {}
@@ -100,7 +96,7 @@ $inventory = File.absolute_path($inventory, File.dirname(__FILE__))
# if $inventory has a hosts.ini file use it, otherwise copy over # if $inventory has a hosts.ini file use it, otherwise copy over
# vars etc to where vagrant expects dynamic inventory to be # vars etc to where vagrant expects dynamic inventory to be
if ! File.exist?(File.join(File.dirname($inventory), "hosts.ini")) if ! File.exist?(File.join(File.dirname($inventory), "hosts.ini"))
$vagrant_ansible = File.join(File.absolute_path($vagrant_dir), "provisioners", "ansible") $vagrant_ansible = File.join(File.dirname(__FILE__), ".vagrant", "provisioners", "ansible")
FileUtils.mkdir_p($vagrant_ansible) if ! File.exist?($vagrant_ansible) FileUtils.mkdir_p($vagrant_ansible) if ! File.exist?($vagrant_ansible)
$vagrant_inventory = File.join($vagrant_ansible,"inventory") $vagrant_inventory = File.join($vagrant_ansible,"inventory")
FileUtils.rm_f($vagrant_inventory) FileUtils.rm_f($vagrant_inventory)
@@ -186,14 +182,6 @@ Vagrant.configure("2") do |config|
lv.storage :file, :device => "hd#{driverletters[d]}", :path => "disk-#{i}-#{d}-#{DISK_UUID}.disk", :size => $kube_node_instances_with_disks_size, :bus => "scsi" lv.storage :file, :device => "hd#{driverletters[d]}", :path => "disk-#{i}-#{d}-#{DISK_UUID}.disk", :size => $kube_node_instances_with_disks_size, :bus => "scsi"
end end
end end
node.vm.provider :virtualbox do |vb|
# always make /dev/sd{a/b/c} so that CI can ensure that
# virtualbox and libvirt will have the same devices to use for OSDs
(1..$kube_node_instances_with_disks_number).each do |d|
vb.customize ['createhd', '--filename', "disk-#{i}-#{driverletters[d]}-#{DISK_UUID}.disk", '--size', $kube_node_instances_with_disks_size] # 10GB disk
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', d, '--device', 0, '--type', 'hdd', '--medium', "disk-#{i}-#{driverletters[d]}-#{DISK_UUID}.disk", '--nonrotational', 'on', '--mtype', 'normal']
end
end
end end
if $expose_docker_tcp if $expose_docker_tcp
@@ -244,13 +232,6 @@ Vagrant.configure("2") do |config|
SHELL SHELL
end end
# Rockylinux boxes needs UEFI
if ["rockylinux8", "rockylinux9"].include? $os
config.vm.provider "libvirt" do |domain|
domain.loader = "/usr/share/OVMF/x64/OVMF_CODE.fd"
end
end
# Disable firewalld on oraclelinux/redhat vms # Disable firewalld on oraclelinux/redhat vms
if ["oraclelinux","oraclelinux8","rhel7","rhel8","rockylinux8"].include? $os if ["oraclelinux","oraclelinux8","rhel7","rhel8","rockylinux8"].include? $os
node.vm.provision "shell", inline: "systemctl stop firewalld; systemctl disable firewalld" node.vm.provision "shell", inline: "systemctl stop firewalld; systemctl disable firewalld"
@@ -274,9 +255,7 @@ Vagrant.configure("2") do |config|
"kubectl_localhost": "True", "kubectl_localhost": "True",
"local_path_provisioner_enabled": "#{$local_path_provisioner_enabled}", "local_path_provisioner_enabled": "#{$local_path_provisioner_enabled}",
"local_path_provisioner_claim_root": "#{$local_path_provisioner_claim_root}", "local_path_provisioner_claim_root": "#{$local_path_provisioner_claim_root}",
"ansible_ssh_user": SUPPORTED_OS[$os][:user], "ansible_ssh_user": SUPPORTED_OS[$os][:user]
"ansible_ssh_private_key_file": File.join(Dir.home, ".vagrant.d", "insecure_private_key"),
"unsafe_show_logs": "True"
} }
# Only execute the Ansible provisioner once, when all the machines are up and ready. # Only execute the Ansible provisioner once, when all the machines are up and ready.
@@ -295,7 +274,6 @@ Vagrant.configure("2") do |config|
ansible.host_key_checking = false ansible.host_key_checking = false
ansible.raw_arguments = ["--forks=#{$num_instances}", "--flush-cache", "-e ansible_become_pass=vagrant"] ansible.raw_arguments = ["--forks=#{$num_instances}", "--flush-cache", "-e ansible_become_pass=vagrant"]
ansible.host_vars = host_vars ansible.host_vars = host_vars
ansible.extra_vars = $extra_vars
if $ansible_tags != "" if $ansible_tags != ""
ansible.tags = [$ansible_tags] ansible.tags = [$ansible_tags]
end end

View File

@@ -1,6 +1,6 @@
[ssh_connection] [ssh_connection]
pipelining=True pipelining=True
ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o ConnectionAttempts=100 -o UserKnownHostsFile=/dev/null ansible_ssh_args = -o ControlMaster=auto -o ControlPersist=30m -o ConnectionAttempts=100 -o UserKnownHostsFile=/dev/null
#control_path = ~/.ssh/ansible-%%r@%%h:%%p #control_path = ~/.ssh/ansible-%%r@%%h:%%p
[defaults] [defaults]
# https://github.com/ansible/ansible/issues/56930 (to ignore group names with - and .) # https://github.com/ansible/ansible/issues/56930 (to ignore group names with - and .)
@@ -11,7 +11,6 @@ gathering = smart
fact_caching = jsonfile fact_caching = jsonfile
fact_caching_connection = /tmp fact_caching_connection = /tmp
fact_caching_timeout = 86400 fact_caching_timeout = 86400
timeout = 300
stdout_callback = default stdout_callback = default
display_skipped_hosts = no display_skipped_hosts = no
library = ./library library = ./library

View File

@@ -49,7 +49,7 @@ If you need to delete all resources from a resource group, simply call:
## Installing Ansible and the dependencies ## Installing Ansible and the dependencies
Install Ansible according to [Ansible installation guide](/docs/ansible/ansible.md#installing-ansible) Install Ansible according to [Ansible installation guide](/docs/ansible.md#installing-ansible)
## Generating an inventory for kubespray ## Generating an inventory for kubespray

View File

@@ -1,6 +1,6 @@
--- ---
- name: Generate Azure inventory - name: Generate Azure inventory
hosts: localhost hosts: localhost
gather_facts: false gather_facts: False
roles: roles:
- generate-inventory - generate-inventory

View File

@@ -1,6 +1,6 @@
--- ---
- name: Generate Azure inventory - name: Generate Azure inventory
hosts: localhost hosts: localhost
gather_facts: false gather_facts: False
roles: roles:
- generate-inventory_2 - generate-inventory_2

View File

@@ -1,6 +1,6 @@
--- ---
- name: Generate Azure templates - name: Generate Azure templates
hosts: localhost hosts: localhost
gather_facts: false gather_facts: False
roles: roles:
- generate-templates - generate-templates

View File

@@ -12,4 +12,4 @@
template: template:
src: inventory.j2 src: inventory.j2
dest: "{{ playbook_dir }}/inventory" dest: "{{ playbook_dir }}/inventory"
mode: "0644" mode: 0644

View File

@@ -22,10 +22,10 @@
template: template:
src: inventory.j2 src: inventory.j2
dest: "{{ playbook_dir }}/inventory" dest: "{{ playbook_dir }}/inventory"
mode: "0644" mode: 0644
- name: Generate Load Balancer variables - name: Generate Load Balancer variables
template: template:
src: loadbalancer_vars.j2 src: loadbalancer_vars.j2
dest: "{{ playbook_dir }}/loadbalancer_vars.yml" dest: "{{ playbook_dir }}/loadbalancer_vars.yml"
mode: "0644" mode: 0644

View File

@@ -8,13 +8,13 @@
path: "{{ base_dir }}" path: "{{ base_dir }}"
state: directory state: directory
recurse: true recurse: true
mode: "0755" mode: 0755
- name: Store json files in base_dir - name: Store json files in base_dir
template: template:
src: "{{ item }}" src: "{{ item }}"
dest: "{{ base_dir }}/{{ item }}" dest: "{{ base_dir }}/{{ item }}"
mode: "0644" mode: 0644
with_items: with_items:
- network.json - network.json
- storage.json - storage.json

View File

@@ -1,7 +1,7 @@
--- ---
- name: Create nodes as docker containers - name: Create nodes as docker containers
hosts: localhost hosts: localhost
gather_facts: false gather_facts: False
roles: roles:
- { role: dind-host } - { role: dind-host }

View File

@@ -18,7 +18,7 @@ distro_settings:
init: | init: |
/sbin/init /sbin/init
centos: &CENTOS centos: &CENTOS
image: "centos:8" image: "centos:7"
user: "centos" user: "centos"
pid1_exe: /usr/lib/systemd/systemd pid1_exe: /usr/lib/systemd/systemd
init: | init: |

View File

@@ -15,7 +15,7 @@ docker_storage_options: -s overlay2 --storage-opt overlay2.override_kernel_check
dns_mode: coredns dns_mode: coredns
deploy_netchecker: true deploy_netchecker: True
netcheck_agent_image_repo: quay.io/l23network/k8s-netchecker-agent netcheck_agent_image_repo: quay.io/l23network/k8s-netchecker-agent
netcheck_server_image_repo: quay.io/l23network/k8s-netchecker-server netcheck_server_image_repo: quay.io/l23network/k8s-netchecker-server
netcheck_agent_image_tag: v1.0 netcheck_agent_image_tag: v1.0

View File

@@ -14,7 +14,7 @@
src: "/bin/true" src: "/bin/true"
dest: "{{ item }}" dest: "{{ item }}"
state: link state: link
force: true force: yes
with_items: with_items:
# DIND box may have swap enable, don't bother # DIND box may have swap enable, don't bother
- /sbin/swapoff - /sbin/swapoff
@@ -35,7 +35,7 @@
path-exclude=/usr/share/doc/* path-exclude=/usr/share/doc/*
path-include=/usr/share/doc/*/copyright path-include=/usr/share/doc/*/copyright
dest: /etc/dpkg/dpkg.cfg.d/01_nodoc dest: /etc/dpkg/dpkg.cfg.d/01_nodoc
mode: "0644" mode: 0644
when: when:
- ansible_os_family == 'Debian' - ansible_os_family == 'Debian'
@@ -58,13 +58,13 @@
name: "{{ distro_user }}" name: "{{ distro_user }}"
uid: 1000 uid: 1000
# groups: sudo # groups: sudo
append: true append: yes
- name: Allow password-less sudo to "{{ distro_user }}" - name: Allow password-less sudo to "{{ distro_user }}"
copy: copy:
content: "{{ distro_user }} ALL=(ALL) NOPASSWD:ALL" content: "{{ distro_user }} ALL=(ALL) NOPASSWD:ALL"
dest: "/etc/sudoers.d/{{ distro_user }}" dest: "/etc/sudoers.d/{{ distro_user }}"
mode: "0640" mode: 0640
- name: "Add my pubkey to {{ distro_user }} user authorized keys" - name: "Add my pubkey to {{ distro_user }} user authorized keys"
ansible.posix.authorized_key: ansible.posix.authorized_key:

View File

@@ -19,7 +19,7 @@
state: started state: started
hostname: "{{ item }}" hostname: "{{ item }}"
command: "{{ distro_init }}" command: "{{ distro_init }}"
# recreate: true # recreate: yes
privileged: true privileged: true
tmpfs: tmpfs:
- /sys/module/nf_conntrack/parameters - /sys/module/nf_conntrack/parameters
@@ -42,7 +42,7 @@
template: template:
src: inventory_builder.sh.j2 src: inventory_builder.sh.j2
dest: /tmp/kubespray.dind.inventory_builder.sh dest: /tmp/kubespray.dind.inventory_builder.sh
mode: "0755" mode: 0755
tags: tags:
- addresses - addresses

View File

@@ -1,8 +1,8 @@
--- ---
- name: Prepare Hypervisor to later install kubespray VMs - name: Prepare Hypervisor to later install kubespray VMs
hosts: localhost hosts: localhost
gather_facts: false gather_facts: False
become: true become: yes
vars: vars:
bootstrap_os: none bootstrap_os: none
roles: roles:

View File

@@ -11,12 +11,12 @@
- name: Install required packages - name: Install required packages
apt: apt:
upgrade: true upgrade: yes
update_cache: true update_cache: yes
cache_valid_time: 3600 cache_valid_time: 3600
name: "{{ item }}" name: "{{ item }}"
state: present state: present
install_recommends: false install_recommends: no
with_items: with_items:
- dnsutils - dnsutils
- ntp - ntp

View File

@@ -20,7 +20,7 @@
br-netfilter br-netfilter
owner: root owner: root
group: root group: root
mode: "0644" mode: 0644
when: br_netfilter is defined when: br_netfilter is defined
@@ -30,7 +30,7 @@
value: 1 value: 1
sysctl_file: "{{ sysctl_file_path }}" sysctl_file: "{{ sysctl_file_path }}"
state: present state: present
reload: true reload: yes
- name: Set bridge-nf-call-{arptables,iptables} to 0 - name: Set bridge-nf-call-{arptables,iptables} to 0
ansible.posix.sysctl: ansible.posix.sysctl:
@@ -38,7 +38,7 @@
state: present state: present
value: 0 value: 0
sysctl_file: "{{ sysctl_file_path }}" sysctl_file: "{{ sysctl_file_path }}"
reload: true reload: yes
with_items: with_items:
- net.bridge.bridge-nf-call-arptables - net.bridge.bridge-nf-call-arptables
- net.bridge.bridge-nf-call-ip6tables - net.bridge.bridge-nf-call-ip6tables

View File

@@ -11,7 +11,7 @@
state: directory state: directory
owner: "{{ k8s_deployment_user }}" owner: "{{ k8s_deployment_user }}"
group: "{{ k8s_deployment_user }}" group: "{{ k8s_deployment_user }}"
mode: "0700" mode: 0700
- name: Configure sudo for deployment user - name: Configure sudo for deployment user
copy: copy:
@@ -20,13 +20,13 @@
dest: "/etc/sudoers.d/55-k8s-deployment" dest: "/etc/sudoers.d/55-k8s-deployment"
owner: root owner: root
group: root group: root
mode: "0644" mode: 0644
- name: Write private SSH key - name: Write private SSH key
copy: copy:
src: "{{ k8s_deployment_user_pkey_path }}" src: "{{ k8s_deployment_user_pkey_path }}"
dest: "/home/{{ k8s_deployment_user }}/.ssh/id_rsa" dest: "/home/{{ k8s_deployment_user }}/.ssh/id_rsa"
mode: "0400" mode: 0400
owner: "{{ k8s_deployment_user }}" owner: "{{ k8s_deployment_user }}"
group: "{{ k8s_deployment_user }}" group: "{{ k8s_deployment_user }}"
when: k8s_deployment_user_pkey_path is defined when: k8s_deployment_user_pkey_path is defined
@@ -41,7 +41,7 @@
- name: Fix ssh-pub-key permissions - name: Fix ssh-pub-key permissions
file: file:
path: "/home/{{ k8s_deployment_user }}/.ssh/authorized_keys" path: "/home/{{ k8s_deployment_user }}/.ssh/authorized_keys"
mode: "0600" mode: 0600
owner: "{{ k8s_deployment_user }}" owner: "{{ k8s_deployment_user }}"
group: "{{ k8s_deployment_user }}" group: "{{ k8s_deployment_user }}"
when: k8s_deployment_user_pkey_path is defined when: k8s_deployment_user_pkey_path is defined

View File

@@ -14,7 +14,7 @@
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
mode: "0755" mode: 0755
become: false become: false
loop: loop:
- "{{ playbook_dir }}/plugins/mitogen" - "{{ playbook_dir }}/plugins/mitogen"
@@ -25,7 +25,7 @@
url: "{{ mitogen_url }}" url: "{{ mitogen_url }}"
dest: "{{ playbook_dir }}/dist/mitogen_{{ mitogen_version }}.tar.gz" dest: "{{ playbook_dir }}/dist/mitogen_{{ mitogen_version }}.tar.gz"
validate_certs: true validate_certs: true
mode: "0644" mode: 0644
- name: Extract archive - name: Extract archive
unarchive: unarchive:
@@ -40,7 +40,7 @@
- name: Add strategy to ansible.cfg - name: Add strategy to ansible.cfg
community.general.ini_file: community.general.ini_file:
path: ansible.cfg path: ansible.cfg
mode: "0644" mode: 0644
section: "{{ item.section | d('defaults') }}" section: "{{ item.section | d('defaults') }}"
option: "{{ item.option }}" option: "{{ item.option }}"
value: "{{ item.value }}" value: "{{ item.value }}"

View File

@@ -21,7 +21,7 @@ glusterfs_default_release: ""
You can specify a `default_release` for apt on Debian/Ubuntu by overriding this variable. This is helpful if you need a different package or version for the main GlusterFS packages (e.g. GlusterFS 3.5.x instead of 3.2.x with the `wheezy-backports` default release on Debian Wheezy). You can specify a `default_release` for apt on Debian/Ubuntu by overriding this variable. This is helpful if you need a different package or version for the main GlusterFS packages (e.g. GlusterFS 3.5.x instead of 3.2.x with the `wheezy-backports` default release on Debian Wheezy).
```yaml ```yaml
glusterfs_ppa_use: true glusterfs_ppa_use: yes
glusterfs_ppa_version: "3.5" glusterfs_ppa_version: "3.5"
``` ```

View File

@@ -1,7 +1,7 @@
--- ---
# For Ubuntu. # For Ubuntu.
glusterfs_default_release: "" glusterfs_default_release: ""
glusterfs_ppa_use: true glusterfs_ppa_use: yes
glusterfs_ppa_version: "4.1" glusterfs_ppa_version: "4.1"
# Gluster configuration. # Gluster configuration.

View File

@@ -15,7 +15,7 @@
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
mode: "0775" mode: 0775
with_items: with_items:
- "{{ gluster_mount_dir }}" - "{{ gluster_mount_dir }}"
when: ansible_os_family in ["Debian","RedHat"] and groups['gfs-cluster'] is defined when: ansible_os_family in ["Debian","RedHat"] and groups['gfs-cluster'] is defined

View File

@@ -3,7 +3,7 @@
apt_repository: apt_repository:
repo: 'ppa:gluster/glusterfs-{{ glusterfs_ppa_version }}' repo: 'ppa:gluster/glusterfs-{{ glusterfs_ppa_version }}'
state: present state: present
update_cache: true update_cache: yes
register: glusterfs_ppa_added register: glusterfs_ppa_added
when: glusterfs_ppa_use when: glusterfs_ppa_use

View File

@@ -1,7 +1,7 @@
--- ---
# For Ubuntu. # For Ubuntu.
glusterfs_default_release: "" glusterfs_default_release: ""
glusterfs_ppa_use: true glusterfs_ppa_use: yes
glusterfs_ppa_version: "3.12" glusterfs_ppa_version: "3.12"
# Gluster configuration. # Gluster configuration.

View File

@@ -43,13 +43,13 @@
service: service:
name: "{{ glusterfs_daemon }}" name: "{{ glusterfs_daemon }}"
state: started state: started
enabled: true enabled: yes
- name: Ensure Gluster brick and mount directories exist. - name: Ensure Gluster brick and mount directories exist.
file: file:
path: "{{ item }}" path: "{{ item }}"
state: directory state: directory
mode: "0775" mode: 0775
with_items: with_items:
- "{{ gluster_brick_dir }}" - "{{ gluster_brick_dir }}"
- "{{ gluster_mount_dir }}" - "{{ gluster_mount_dir }}"
@@ -62,7 +62,7 @@
replicas: "{{ groups['gfs-cluster'] | length }}" replicas: "{{ groups['gfs-cluster'] | length }}"
cluster: "{% for item in groups['gfs-cluster'] -%}{{ hostvars[item]['ip'] | default(hostvars[item].ansible_default_ipv4['address']) }}{% if not loop.last %},{% endif %}{%- endfor %}" cluster: "{% for item in groups['gfs-cluster'] -%}{{ hostvars[item]['ip'] | default(hostvars[item].ansible_default_ipv4['address']) }}{% if not loop.last %},{% endif %}{%- endfor %}"
host: "{{ inventory_hostname }}" host: "{{ inventory_hostname }}"
force: true force: yes
run_once: true run_once: true
when: groups['gfs-cluster'] | length > 1 when: groups['gfs-cluster'] | length > 1
@@ -73,7 +73,7 @@
brick: "{{ gluster_brick_dir }}" brick: "{{ gluster_brick_dir }}"
cluster: "{% for item in groups['gfs-cluster'] -%}{{ hostvars[item]['ip'] | default(hostvars[item].ansible_default_ipv4['address']) }}{% if not loop.last %},{% endif %}{%- endfor %}" cluster: "{% for item in groups['gfs-cluster'] -%}{{ hostvars[item]['ip'] | default(hostvars[item].ansible_default_ipv4['address']) }}{% if not loop.last %},{% endif %}{%- endfor %}"
host: "{{ inventory_hostname }}" host: "{{ inventory_hostname }}"
force: true force: yes
run_once: true run_once: true
when: groups['gfs-cluster'] | length <= 1 when: groups['gfs-cluster'] | length <= 1
@@ -101,7 +101,7 @@
template: template:
dest: "{{ gluster_mount_dir }}/.test-file.txt" dest: "{{ gluster_mount_dir }}/.test-file.txt"
src: test-file.txt src: test-file.txt
mode: "0644" mode: 0644
when: groups['gfs-cluster'] is defined and inventory_hostname == groups['gfs-cluster'][0] when: groups['gfs-cluster'] is defined and inventory_hostname == groups['gfs-cluster'][0]
- name: Unmount glusterfs - name: Unmount glusterfs

View File

@@ -3,7 +3,7 @@
apt_repository: apt_repository:
repo: 'ppa:gluster/glusterfs-{{ glusterfs_ppa_version }}' repo: 'ppa:gluster/glusterfs-{{ glusterfs_ppa_version }}'
state: present state: present
update_cache: true update_cache: yes
register: glusterfs_ppa_added register: glusterfs_ppa_added
when: glusterfs_ppa_use when: glusterfs_ppa_use

View File

@@ -3,7 +3,7 @@
template: template:
src: "{{ item.file }}" src: "{{ item.file }}"
dest: "{{ kube_config_dir }}/{{ item.dest }}" dest: "{{ kube_config_dir }}/{{ item.dest }}"
mode: "0644" mode: 0644
with_items: with_items:
- { file: glusterfs-kubernetes-endpoint.json.j2, type: ep, dest: glusterfs-kubernetes-endpoint.json} - { file: glusterfs-kubernetes-endpoint.json.j2, type: ep, dest: glusterfs-kubernetes-endpoint.json}
- { file: glusterfs-kubernetes-pv.yml.j2, type: pv, dest: glusterfs-kubernetes-pv.yml} - { file: glusterfs-kubernetes-pv.yml.j2, type: pv, dest: glusterfs-kubernetes-pv.yml}

View File

@@ -6,6 +6,6 @@
- name: Teardown disks in heketi - name: Teardown disks in heketi
hosts: heketi-node hosts: heketi-node
become: true become: yes
roles: roles:
- { role: tear-down-disks } - { role: tear-down-disks }

View File

@@ -4,7 +4,7 @@
template: template:
src: "heketi-bootstrap.json.j2" src: "heketi-bootstrap.json.j2"
dest: "{{ kube_config_dir }}/heketi-bootstrap.json" dest: "{{ kube_config_dir }}/heketi-bootstrap.json"
mode: "0640" mode: 0640
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure Heketi Bootstrap" - name: "Kubernetes Apps | Install and configure Heketi Bootstrap"
kube: kube:

View File

@@ -10,7 +10,7 @@
template: template:
src: "topology.json.j2" src: "topology.json.j2"
dest: "{{ kube_config_dir }}/topology.json" dest: "{{ kube_config_dir }}/topology.json"
mode: "0644" mode: 0644
- name: "Copy topology configuration into container." - name: "Copy topology configuration into container."
changed_when: false changed_when: false
command: "{{ bin_dir }}/kubectl cp {{ kube_config_dir }}/topology.json {{ initial_heketi_pod_name }}:/tmp/topology.json" command: "{{ bin_dir }}/kubectl cp {{ kube_config_dir }}/topology.json {{ initial_heketi_pod_name }}:/tmp/topology.json"

View File

@@ -3,7 +3,7 @@
template: template:
src: "glusterfs-daemonset.json.j2" src: "glusterfs-daemonset.json.j2"
dest: "{{ kube_config_dir }}/glusterfs-daemonset.json" dest: "{{ kube_config_dir }}/glusterfs-daemonset.json"
mode: "0644" mode: 0644
become: true become: true
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure GlusterFS daemonset" - name: "Kubernetes Apps | Install and configure GlusterFS daemonset"
@@ -33,7 +33,7 @@
template: template:
src: "heketi-service-account.json.j2" src: "heketi-service-account.json.j2"
dest: "{{ kube_config_dir }}/heketi-service-account.json" dest: "{{ kube_config_dir }}/heketi-service-account.json"
mode: "0644" mode: 0644
become: true become: true
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure Heketi Service Account" - name: "Kubernetes Apps | Install and configure Heketi Service Account"

View File

@@ -4,7 +4,7 @@
template: template:
src: "heketi-deployment.json.j2" src: "heketi-deployment.json.j2"
dest: "{{ kube_config_dir }}/heketi-deployment.json" dest: "{{ kube_config_dir }}/heketi-deployment.json"
mode: "0644" mode: 0644
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure Heketi" - name: "Kubernetes Apps | Install and configure Heketi"

View File

@@ -28,7 +28,7 @@
template: template:
src: "heketi.json.j2" src: "heketi.json.j2"
dest: "{{ kube_config_dir }}/heketi.json" dest: "{{ kube_config_dir }}/heketi.json"
mode: "0644" mode: 0644
- name: "Deploy Heketi config secret" - name: "Deploy Heketi config secret"
when: "secret_state.stdout | length == 0" when: "secret_state.stdout | length == 0"

View File

@@ -5,7 +5,7 @@
template: template:
src: "heketi-storage.json.j2" src: "heketi-storage.json.j2"
dest: "{{ kube_config_dir }}/heketi-storage.json" dest: "{{ kube_config_dir }}/heketi-storage.json"
mode: "0644" mode: 0644
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure Heketi Storage" - name: "Kubernetes Apps | Install and configure Heketi Storage"
kube: kube:

View File

@@ -16,7 +16,7 @@
template: template:
src: "storageclass.yml.j2" src: "storageclass.yml.j2"
dest: "{{ kube_config_dir }}/storageclass.yml" dest: "{{ kube_config_dir }}/storageclass.yml"
mode: "0644" mode: 0644
register: "rendering" register: "rendering"
- name: "Kubernetes Apps | Install and configure Storace Class" - name: "Kubernetes Apps | Install and configure Storace Class"
kube: kube:

View File

@@ -10,7 +10,7 @@
template: template:
src: "topology.json.j2" src: "topology.json.j2"
dest: "{{ kube_config_dir }}/topology.json" dest: "{{ kube_config_dir }}/topology.json"
mode: "0644" mode: 0644
- name: "Copy topology configuration into container." # noqa no-handler - name: "Copy topology configuration into container." # noqa no-handler
when: "rendering.changed" when: "rendering.changed"
command: "{{ bin_dir }}/kubectl cp {{ kube_config_dir }}/topology.json {{ heketi_pod_name }}:/tmp/topology.json" command: "{{ bin_dir }}/kubectl cp {{ kube_config_dir }}/topology.json {{ heketi_pod_name }}:/tmp/topology.json"

View File

@@ -5,17 +5,13 @@
Container image collecting script for offline deployment Container image collecting script for offline deployment
This script has two features: This script has two features:
(1) Get container images from an environment which is deployed online, or set IMAGES_FROM_FILE (1) Get container images from an environment which is deployed online.
environment variable to get images from a file (e.g. temp/images.list after running the
./generate_list.sh script).
(2) Deploy local container registry and register the container images to the registry. (2) Deploy local container registry and register the container images to the registry.
Step(1) should be done online site as a preparation, then we bring the gotten images Step(1) should be done online site as a preparation, then we bring the gotten images
to the target offline environment. if images are from a private registry, to the target offline environment. if images are from a private registry,
you need to set `PRIVATE_REGISTRY` environment variable. you need to set `PRIVATE_REGISTRY` environment variable.
Then we will run step(2) for registering the images to local registry, or to an existing Then we will run step(2) for registering the images to local registry.
registry set by the `DESTINATION_REGISTRY` environment variable. By default, the local registry
will run on port 5000. This can be changed with the `REGISTRY_PORT` environment variable
Step(1) can be operated with: Step(1) can be operated with:
@@ -31,7 +27,7 @@ manage-offline-container-images.sh register
## generate_list.sh ## generate_list.sh
This script generates the list of downloaded files and the list of container images by `roles/kubespray-defaults/defaults/main/download.yml` file. This script generates the list of downloaded files and the list of container images by `roles/download/defaults/main/main.yml` file.
Run this script will execute `generate_list.yml` playbook in kubespray root directory and generate four files, Run this script will execute `generate_list.yml` playbook in kubespray root directory and generate four files,
all downloaded files url in files.list, all container images in images.list, jinja2 templates in *.template. all downloaded files url in files.list, all container images in images.list, jinja2 templates in *.template.

View File

@@ -5,7 +5,7 @@ CURRENT_DIR=$(cd $(dirname $0); pwd)
TEMP_DIR="${CURRENT_DIR}/temp" TEMP_DIR="${CURRENT_DIR}/temp"
REPO_ROOT_DIR="${CURRENT_DIR%/contrib/offline}" REPO_ROOT_DIR="${CURRENT_DIR%/contrib/offline}"
: ${DOWNLOAD_YML:="roles/kubespray-defaults/defaults/main/download.yml"} : ${DOWNLOAD_YML:="roles/download/defaults/main/main.yml"}
mkdir -p ${TEMP_DIR} mkdir -p ${TEMP_DIR}
@@ -19,7 +19,7 @@ sed -n '/^downloads:/,/download_defaults:/p' ${REPO_ROOT_DIR}/${DOWNLOAD_YML} \
| sed 'N;s#\n# #g' | tr ' ' ':' | sed 's/\"//g' > ${TEMP_DIR}/images.list.template | sed 'N;s#\n# #g' | tr ' ' ':' | sed 's/\"//g' > ${TEMP_DIR}/images.list.template
# add kube-* images to images list template # add kube-* images to images list template
# Those container images are downloaded by kubeadm, then roles/kubespray-defaults/defaults/main/download.yml # Those container images are downloaded by kubeadm, then roles/download/defaults/main/main.yml
# doesn't contain those images. That is reason why here needs to put those images into the # doesn't contain those images. That is reason why here needs to put those images into the
# list separately. # list separately.
KUBE_IMAGES="kube-apiserver kube-controller-manager kube-scheduler kube-proxy" KUBE_IMAGES="kube-apiserver kube-controller-manager kube-scheduler kube-proxy"

View File

@@ -1,7 +1,7 @@
--- ---
- name: Collect container images for offline deployment - name: Collect container images for offline deployment
hosts: localhost hosts: localhost
become: false become: no
roles: roles:
# Just load default variables from roles. # Just load default variables from roles.
@@ -16,7 +16,7 @@
template: template:
src: ./contrib/offline/temp/{{ item }}.list.template src: ./contrib/offline/temp/{{ item }}.list.template
dest: ./contrib/offline/temp/{{ item }}.list dest: ./contrib/offline/temp/{{ item }}.list
mode: "0644" mode: 0644
with_items: with_items:
- files - files
- images - images

View File

@@ -12,40 +12,27 @@ RETRY_COUNT=5
function create_container_image_tar() { function create_container_image_tar() {
set -e set -e
if [ -z "${IMAGES_FROM_FILE}" ]; then IMAGES=$(kubectl describe pods --all-namespaces | grep " Image:" | awk '{print $2}' | sort | uniq)
echo "Getting images from current \"$(kubectl config current-context)\"" # NOTE: etcd and pause cannot be seen as pods.
# The pause image is used for --pod-infra-container-image option of kubelet.
IMAGES=$(mktemp --suffix=-images) EXT_IMAGES=$(kubectl cluster-info dump | egrep "quay.io/coreos/etcd:|registry.k8s.io/pause:" | sed s@\"@@g)
trap 'rm -f "${IMAGES}"' EXIT IMAGES="${IMAGES} ${EXT_IMAGES}"
kubectl describe cronjobs,jobs,pods --all-namespaces | grep " Image:" | awk '{print $2}' | sort | uniq > "${IMAGES}"
# NOTE: etcd and pause cannot be seen as pods.
# The pause image is used for --pod-infra-container-image option of kubelet.
kubectl cluster-info dump | grep -E "quay.io/coreos/etcd:|registry.k8s.io/pause:" | sed s@\"@@g >> "${IMAGES}"
else
echo "Getting images from file \"${IMAGES_FROM_FILE}\""
if [ ! -f "${IMAGES_FROM_FILE}" ]; then
echo "${IMAGES_FROM_FILE} is not a file"
exit 1
fi
IMAGES=$(realpath $IMAGES_FROM_FILE)
fi
rm -f ${IMAGE_TAR_FILE} rm -f ${IMAGE_TAR_FILE}
rm -rf ${IMAGE_DIR} rm -rf ${IMAGE_DIR}
mkdir ${IMAGE_DIR} mkdir ${IMAGE_DIR}
cd ${IMAGE_DIR} cd ${IMAGE_DIR}
sudo ${runtime} pull registry:latest sudo docker pull registry:latest
sudo ${runtime} save -o registry-latest.tar registry:latest sudo docker save -o registry-latest.tar registry:latest
while read -r image for image in ${IMAGES}
do do
FILE_NAME="$(echo ${image} | sed s@"/"@"-"@g | sed s/":"/"-"/g | sed -E 's/\@.*//g')".tar FILE_NAME="$(echo ${image} | sed s@"/"@"-"@g | sed s/":"/"-"/g)".tar
set +e set +e
for step in $(seq 1 ${RETRY_COUNT}) for step in $(seq 1 ${RETRY_COUNT})
do do
sudo ${runtime} pull ${image} sudo docker pull ${image}
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
break break
fi fi
@@ -55,26 +42,24 @@ function create_container_image_tar() {
fi fi
done done
set -e set -e
sudo ${runtime} save -o ${FILE_NAME} ${image} sudo docker save -o ${FILE_NAME} ${image}
# NOTE: Here removes the following repo parts from each image # NOTE: Here removes the following repo parts from each image
# so that these parts will be replaced with Kubespray. # so that these parts will be replaced with Kubespray.
# - kube_image_repo: "registry.k8s.io" # - kube_image_repo: "registry.k8s.io"
# - gcr_image_repo: "gcr.io" # - gcr_image_repo: "gcr.io"
# - ghcr_image_repo: "ghcr.io"
# - docker_image_repo: "docker.io" # - docker_image_repo: "docker.io"
# - quay_image_repo: "quay.io" # - quay_image_repo: "quay.io"
FIRST_PART=$(echo ${image} | awk -F"/" '{print $1}') FIRST_PART=$(echo ${image} | awk -F"/" '{print $1}')
if [ "${FIRST_PART}" = "registry.k8s.io" ] || if [ "${FIRST_PART}" = "registry.k8s.io" ] ||
[ "${FIRST_PART}" = "gcr.io" ] || [ "${FIRST_PART}" = "gcr.io" ] ||
[ "${FIRST_PART}" = "ghcr.io" ] ||
[ "${FIRST_PART}" = "docker.io" ] || [ "${FIRST_PART}" = "docker.io" ] ||
[ "${FIRST_PART}" = "quay.io" ] || [ "${FIRST_PART}" = "quay.io" ] ||
[ "${FIRST_PART}" = "${PRIVATE_REGISTRY}" ]; then [ "${FIRST_PART}" = "${PRIVATE_REGISTRY}" ]; then
image=$(echo ${image} | sed s@"${FIRST_PART}/"@@ | sed -E 's/\@.*/\n/g') image=$(echo ${image} | sed s@"${FIRST_PART}/"@@)
fi fi
echo "${FILE_NAME} ${image}" >> ${IMAGE_LIST} echo "${FILE_NAME} ${image}" >> ${IMAGE_LIST}
done < "${IMAGES}" done
cd .. cd ..
sudo chown ${USER} ${IMAGE_DIR}/* sudo chown ${USER} ${IMAGE_DIR}/*
@@ -87,16 +72,6 @@ function create_container_image_tar() {
} }
function register_container_images() { function register_container_images() {
create_registry=false
REGISTRY_PORT=${REGISTRY_PORT:-"5000"}
if [ -z "${DESTINATION_REGISTRY}" ]; then
echo "DESTINATION_REGISTRY not set, will create local registry"
create_registry=true
DESTINATION_REGISTRY="$(hostname):${REGISTRY_PORT}"
fi
echo "Images will be pushed to ${DESTINATION_REGISTRY}"
if [ ! -f ${IMAGE_TAR_FILE} ]; then if [ ! -f ${IMAGE_TAR_FILE} ]; then
echo "${IMAGE_TAR_FILE} should exist." echo "${IMAGE_TAR_FILE} should exist."
exit 1 exit 1
@@ -106,47 +81,39 @@ function register_container_images() {
fi fi
# To avoid "http: server gave http response to https client" error. # To avoid "http: server gave http response to https client" error.
LOCALHOST_NAME=$(hostname)
if [ -d /etc/docker/ ]; then if [ -d /etc/docker/ ]; then
set -e set -e
# Ubuntu18.04, RHEL7/CentOS7 # Ubuntu18.04, RHEL7/CentOS7
cp ${CURRENT_DIR}/docker-daemon.json ${TEMP_DIR}/docker-daemon.json cp ${CURRENT_DIR}/docker-daemon.json ${TEMP_DIR}/docker-daemon.json
sed -i s@"HOSTNAME"@"$(hostname)"@ ${TEMP_DIR}/docker-daemon.json sed -i s@"HOSTNAME"@"${LOCALHOST_NAME}"@ ${TEMP_DIR}/docker-daemon.json
sudo cp ${TEMP_DIR}/docker-daemon.json /etc/docker/daemon.json sudo cp ${TEMP_DIR}/docker-daemon.json /etc/docker/daemon.json
elif [ -d /etc/containers/ ]; then elif [ -d /etc/containers/ ]; then
set -e set -e
# RHEL8/CentOS8 # RHEL8/CentOS8
cp ${CURRENT_DIR}/registries.conf ${TEMP_DIR}/registries.conf cp ${CURRENT_DIR}/registries.conf ${TEMP_DIR}/registries.conf
sed -i s@"HOSTNAME"@"$(hostname)"@ ${TEMP_DIR}/registries.conf sed -i s@"HOSTNAME"@"${LOCALHOST_NAME}"@ ${TEMP_DIR}/registries.conf
sudo cp ${TEMP_DIR}/registries.conf /etc/containers/registries.conf sudo cp ${TEMP_DIR}/registries.conf /etc/containers/registries.conf
else else
echo "runtime package(docker-ce, podman, nerctl, etc.) should be installed" echo "docker package(docker-ce, etc.) should be installed"
exit 1 exit 1
fi fi
tar -zxvf ${IMAGE_TAR_FILE} tar -zxvf ${IMAGE_TAR_FILE}
sudo docker load -i ${IMAGE_DIR}/registry-latest.tar
if [ "${create_registry}" ]; then set +e
sudo ${runtime} load -i ${IMAGE_DIR}/registry-latest.tar sudo docker container inspect registry >/dev/null 2>&1
set +e if [ $? -ne 0 ]; then
sudo docker run --restart=always -d -p 5000:5000 --name registry registry:latest
sudo ${runtime} container inspect registry >/dev/null 2>&1
if [ $? -ne 0 ]; then
sudo ${runtime} run --restart=always -d -p "${REGISTRY_PORT}":"${REGISTRY_PORT}" --name registry registry:latest
fi
set -e
fi fi
set -e
while read -r line; do while read -r line; do
file_name=$(echo ${line} | awk '{print $1}') file_name=$(echo ${line} | awk '{print $1}')
raw_image=$(echo ${line} | awk '{print $2}') raw_image=$(echo ${line} | awk '{print $2}')
new_image="${DESTINATION_REGISTRY}/${raw_image}" new_image="${LOCALHOST_NAME}:5000/${raw_image}"
load_image=$(sudo ${runtime} load -i ${IMAGE_DIR}/${file_name} | head -n1) org_image=$(sudo docker load -i ${IMAGE_DIR}/${file_name} | head -n1 | awk '{print $3}')
org_image=$(echo "${load_image}" | awk '{print $3}') image_id=$(sudo docker image inspect ${org_image} | grep "\"Id\":" | awk -F: '{print $3}'| sed s/'\",'//)
# special case for tags containing the digest when using docker or podman as the container runtime
if [ "${org_image}" == "ID:" ]; then
org_image=$(echo "${load_image}" | awk '{print $4}')
fi
image_id=$(sudo ${runtime} image inspect ${org_image} | grep "\"Id\":" | awk -F: '{print $3}'| sed s/'\",'//)
if [ -z "${file_name}" ]; then if [ -z "${file_name}" ]; then
echo "Failed to get file_name for line ${line}" echo "Failed to get file_name for line ${line}"
exit 1 exit 1
@@ -163,48 +130,32 @@ function register_container_images() {
echo "Failed to get image_id for file ${file_name}" echo "Failed to get image_id for file ${file_name}"
exit 1 exit 1
fi fi
sudo ${runtime} load -i ${IMAGE_DIR}/${file_name} sudo docker load -i ${IMAGE_DIR}/${file_name}
sudo ${runtime} tag ${image_id} ${new_image} sudo docker tag ${image_id} ${new_image}
sudo ${runtime} push ${new_image} sudo docker push ${new_image}
done <<< "$(cat ${IMAGE_LIST})" done <<< "$(cat ${IMAGE_LIST})"
echo "Succeeded to register container images to local registry." echo "Succeeded to register container images to local registry."
echo "Please specify \"${DESTINATION_REGISTRY}\" for the following options in your inventry:" echo "Please specify ${LOCALHOST_NAME}:5000 for the following options in your inventry:"
echo "- kube_image_repo" echo "- kube_image_repo"
echo "- gcr_image_repo" echo "- gcr_image_repo"
echo "- docker_image_repo" echo "- docker_image_repo"
echo "- quay_image_repo" echo "- quay_image_repo"
} }
# get runtime command
if command -v nerdctl 1>/dev/null 2>&1; then
runtime="nerdctl"
elif command -v podman 1>/dev/null 2>&1; then
runtime="podman"
elif command -v docker 1>/dev/null 2>&1; then
runtime="docker"
else
echo "No supported container runtime found"
exit 1
fi
if [ "${OPTION}" == "create" ]; then if [ "${OPTION}" == "create" ]; then
create_container_image_tar create_container_image_tar
elif [ "${OPTION}" == "register" ]; then elif [ "${OPTION}" == "register" ]; then
register_container_images register_container_images
else else
echo "This script has two features:" echo "This script has two features:"
echo "(1) Get container images from an environment which is deployed online, or set IMAGES_FROM_FILE" echo "(1) Get container images from an environment which is deployed online."
echo " environment variable to get images from a file (e.g. temp/images.list after running the"
echo " ./generate_list.sh script)."
echo "(2) Deploy local container registry and register the container images to the registry." echo "(2) Deploy local container registry and register the container images to the registry."
echo "" echo ""
echo "Step(1) should be done online site as a preparation, then we bring" echo "Step(1) should be done online site as a preparation, then we bring"
echo "the gotten images to the target offline environment. if images are from" echo "the gotten images to the target offline environment. if images are from"
echo "a private registry, you need to set PRIVATE_REGISTRY environment variable." echo "a private registry, you need to set PRIVATE_REGISTRY environment variable."
echo "Then we will run step(2) for registering the images to local registry, or to an existing" echo "Then we will run step(2) for registering the images to local registry."
echo "registry set by the DESTINATION_REGISTRY environment variable. By default, the local registry"
echo "will run on port 5000. This can be changed with the REGISTRY_PORT environment variable"
echo "" echo ""
echo "${IMAGE_TAR_FILE} is created to contain your container images." echo "${IMAGE_TAR_FILE} is created to contain your container images."
echo "Please keep this file and bring it to your offline environment." echo "Please keep this file and bring it to your offline environment."

View File

@@ -17,12 +17,7 @@ rm -rf "${OFFLINE_FILES_DIR}"
rm "${OFFLINE_FILES_ARCHIVE}" rm "${OFFLINE_FILES_ARCHIVE}"
mkdir "${OFFLINE_FILES_DIR}" mkdir "${OFFLINE_FILES_DIR}"
while read -r url; do wget -x -P "${OFFLINE_FILES_DIR}" -i "${FILES_LIST}"
if ! wget -x -P "${OFFLINE_FILES_DIR}" "${url}"; then
exit 1
fi
done < "${FILES_LIST}"
tar -czvf "${OFFLINE_FILES_ARCHIVE}" "${OFFLINE_FILES_DIR_NAME}" tar -czvf "${OFFLINE_FILES_ARCHIVE}" "${OFFLINE_FILES_DIR_NAME}"
[ -n "$NO_HTTP_SERVER" ] && echo "skip to run nginx" && exit 0 [ -n "$NO_HTTP_SERVER" ] && echo "skip to run nginx" && exit 0
@@ -43,7 +38,7 @@ sudo "${runtime}" container inspect nginx >/dev/null 2>&1
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
sudo "${runtime}" run \ sudo "${runtime}" run \
--restart=always -d -p ${NGINX_PORT}:80 \ --restart=always -d -p ${NGINX_PORT}:80 \
--volume "${OFFLINE_FILES_DIR}":/usr/share/nginx/html/download \ --volume "${OFFLINE_FILES_DIR}:/usr/share/nginx/html/download" \
--volume "${CURRENT_DIR}"/nginx.conf:/etc/nginx/nginx.conf \ --volume "${CURRENT_DIR}"/nginx.conf:/etc/nginx/nginx.conf \
--name nginx nginx:alpine --name nginx nginx:alpine
fi fi

View File

@@ -7,17 +7,17 @@
service_facts: service_facts:
- name: Disable service firewalld - name: Disable service firewalld
systemd_service: systemd:
name: firewalld name: firewalld
state: stopped state: stopped
enabled: false enabled: no
when: when:
"'firewalld.service' in services and services['firewalld.service'].status != 'not-found'" "'firewalld.service' in services and services['firewalld.service'].status != 'not-found'"
- name: Disable service ufw - name: Disable service ufw
systemd_service: systemd:
name: ufw name: ufw
state: stopped state: stopped
enabled: false enabled: no
when: when:
"'ufw.service' in services and services['ufw.service'].status != 'not-found'" "'ufw.service' in services and services['ufw.service'].status != 'not-found'"

View File

@@ -1,3 +1,5 @@
# See the OWNERS docs at https://go.k8s.io/owners # See the OWNERS docs at https://go.k8s.io/owners
approvers: approvers:
- holmsten
- miouge1 - miouge1

View File

@@ -50,32 +50,70 @@ Example (this one assumes you are using Ubuntu)
ansible-playbook -i ./inventory/hosts ./cluster.yml -e ansible_user=ubuntu -b --become-user=root --flush-cache ansible-playbook -i ./inventory/hosts ./cluster.yml -e ansible_user=ubuntu -b --become-user=root --flush-cache
``` ```
## Using other distrib than Ubuntu*** ***Using other distrib than Ubuntu***
If you want to use another distribution than Ubuntu 18.04 (Bionic) LTS, you can modify the search filters of the 'data "aws_ami" "distro"' in variables.tf.
To leverage a Linux distribution other than Ubuntu 18.04 (Bionic) LTS for your Terraform configurations, you can adjust the AMI search filters within the 'data "aws_ami" "distro"' block by utilizing variables in your `terraform.tfvars` file. This approach ensures a flexible configuration that adapts to various Linux distributions without directly modifying the core Terraform files. For example, to use:
### Example Usages - Debian Jessie, replace 'data "aws_ami" "distro"' in variables.tf with
- **Debian Jessie**: To configure the usage of Debian Jessie, insert the subsequent lines into your `terraform.tfvars`: ```ini
data "aws_ami" "distro" {
most_recent = true
```hcl filter {
ami_name_pattern = "debian-jessie-amd64-hvm-*" name = "name"
ami_owners = ["379101102735"] values = ["debian-jessie-amd64-hvm-*"]
``` }
- **Ubuntu 16.04**: To utilize Ubuntu 16.04 instead, apply the following configuration in your `terraform.tfvars`: filter {
name = "virtualization-type"
values = ["hvm"]
}
```hcl owners = ["379101102735"]
ami_name_pattern = "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-*" }
ami_owners = ["099720109477"] ```
```
- **Centos 7**: For employing Centos 7, incorporate these lines into your `terraform.tfvars`: - Ubuntu 16.04, replace 'data "aws_ami" "distro"' in variables.tf with
```hcl ```ini
ami_name_pattern = "dcos-centos7-*" data "aws_ami" "distro" {
ami_owners = ["688023202711"] most_recent = true
```
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"]
}
```
- Centos 7, replace 'data "aws_ami" "distro"' in variables.tf with
```ini
data "aws_ami" "distro" {
most_recent = true
filter {
name = "name"
values = ["dcos-centos7-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["688023202711"]
}
```
## Connecting to Kubernetes ## Connecting to Kubernetes

View File

@@ -20,38 +20,20 @@ variable "aws_cluster_name" {
description = "Name of AWS Cluster" description = "Name of AWS Cluster"
} }
variable "ami_name_pattern" {
description = "The name pattern to use for AMI lookup"
type = string
default = "debian-10-amd64-*"
}
variable "ami_virtualization_type" {
description = "The virtualization type to use for AMI lookup"
type = string
default = "hvm"
}
variable "ami_owners" {
description = "The owners to use for AMI lookup"
type = list(string)
default = ["136693071363"]
}
data "aws_ami" "distro" { data "aws_ami" "distro" {
most_recent = true most_recent = true
filter { filter {
name = "name" name = "name"
values = [var.ami_name_pattern] values = ["debian-10-amd64-*"]
} }
filter { filter {
name = "virtualization-type" name = "virtualization-type"
values = [var.ami_virtualization_type] values = ["hvm"]
} }
owners = var.ami_owners owners = ["136693071363"] # Debian-10
} }
//AWS VPC Variables //AWS VPC Variables

View File

@@ -35,7 +35,7 @@ now six total etcd replicas.
## Requirements ## Requirements
- [Install Terraform](https://www.terraform.io/intro/getting-started/install.html) - [Install Terraform](https://www.terraform.io/intro/getting-started/install.html)
- [Install Ansible dependencies](/docs/ansible/ansible.md#installing-ansible) - [Install Ansible dependencies](/docs/ansible.md#installing-ansible)
- Account with Equinix Metal - Account with Equinix Metal
- An SSH key pair - An SSH key pair

View File

@@ -7,7 +7,7 @@ terraform {
required_providers { required_providers {
equinix = { equinix = {
source = "equinix/equinix" source = "equinix/equinix"
version = "1.24.0" version = "~> 1.14"
} }
} }
} }

View File

@@ -12,8 +12,8 @@ ${list_master}
${list_worker} ${list_worker}
[k8s_cluster:children] [k8s_cluster:children]
kube_control_plane kube-master
kube_node kube-node
[k8s_cluster:vars] [k8s_cluster:vars]
network_id=${network_id} network_id=${network_id}

View File

@@ -72,7 +72,6 @@ The setup looks like following
```bash ```bash
./generate-inventory.sh > sample-inventory/inventory.ini ./generate-inventory.sh > sample-inventory/inventory.ini
```
* Export Variables: * Export Variables:

View File

@@ -1,5 +1,5 @@
.terraform .terraform
*.tfvars *.tfvars
!sample-inventory/cluster.tfvars !sample-inventory\/cluster.tfvars
*.tfstate *.tfstate
*.tfstate.backup *.tfstate.backup

View File

@@ -24,7 +24,6 @@ most modern installs of OpenStack that support the basic services.
- [Ultimum](https://ultimum.io/) - [Ultimum](https://ultimum.io/)
- [VexxHost](https://vexxhost.com/) - [VexxHost](https://vexxhost.com/)
- [Zetta](https://www.zetta.io/) - [Zetta](https://www.zetta.io/)
- [Cloudify](https://www.cloudify.ro/en)
## Approach ## Approach
@@ -98,10 +97,9 @@ binaries available on hyperkube v1.4.3_coreos.0 or higher.
## Module Architecture ## Module Architecture
The configuration is divided into four modules: The configuration is divided into three modules:
- Network - Network
- Loadbalancer
- IPs - IPs
- Compute - Compute
@@ -271,18 +269,11 @@ For your cluster, edit `inventory/$CLUSTER/cluster.tfvars`.
|`supplementary_master_groups` | To add ansible groups to the masters, such as `kube_node` for tainting them as nodes, empty by default. | |`supplementary_master_groups` | To add ansible groups to the masters, such as `kube_node` for tainting them as nodes, empty by default. |
|`supplementary_node_groups` | To add ansible groups to the nodes, such as `kube_ingress` for running ingress controller pods, empty by default. | |`supplementary_node_groups` | To add ansible groups to the nodes, such as `kube_ingress` for running ingress controller pods, empty by default. |
|`bastion_allowed_remote_ips` | List of CIDR allowed to initiate a SSH connection, `["0.0.0.0/0"]` by default | |`bastion_allowed_remote_ips` | List of CIDR allowed to initiate a SSH connection, `["0.0.0.0/0"]` by default |
|`bastion_allowed_remote_ipv6_ips` | List of IPv6 CIDR allowed to initiate a SSH connection, `["::/0"]` by default |
|`master_allowed_remote_ips` | List of CIDR blocks allowed to initiate an API connection, `["0.0.0.0/0"]` by default | |`master_allowed_remote_ips` | List of CIDR blocks allowed to initiate an API connection, `["0.0.0.0/0"]` by default |
|`master_allowed_remote_ipv6_ips` | List of IPv6 CIDR blocks allowed to initiate an API connection, `["::/0"]` by default |
|`bastion_allowed_ports` | List of ports to open on bastion node, `[]` by default | |`bastion_allowed_ports` | List of ports to open on bastion node, `[]` by default |
|`bastion_allowed_ports_ipv6` | List of ports to open on bastion node for IPv6 CIDR blocks, `[]` by default |
|`k8s_allowed_remote_ips` | List of CIDR allowed to initiate a SSH connection, empty by default | |`k8s_allowed_remote_ips` | List of CIDR allowed to initiate a SSH connection, empty by default |
|`k8s_allowed_remote_ips_ipv6` | List of IPv6 CIDR allowed to initiate a SSH connection, empty by default |
|`k8s_allowed_egress_ipv6_ips` | List of IPv6 CIDRs allowed for egress traffic, `["::/0"]` by default |
|`worker_allowed_ports` | List of ports to open on worker nodes, `[{ "protocol" = "tcp", "port_range_min" = 30000, "port_range_max" = 32767, "remote_ip_prefix" = "0.0.0.0/0"}]` by default | |`worker_allowed_ports` | List of ports to open on worker nodes, `[{ "protocol" = "tcp", "port_range_min" = 30000, "port_range_max" = 32767, "remote_ip_prefix" = "0.0.0.0/0"}]` by default |
|`worker_allowed_ports_ipv6` | List of ports to open on worker nodes for IPv6 CIDR blocks, `[{ "protocol" = "tcp", "port_range_min" = 30000, "port_range_max" = 32767, "remote_ip_prefix" = "::/0"}]` by default |
|`master_allowed_ports` | List of ports to open on master nodes, expected format is `[{ "protocol" = "tcp", "port_range_min" = 443, "port_range_max" = 443, "remote_ip_prefix" = "0.0.0.0/0"}]`, empty by default | |`master_allowed_ports` | List of ports to open on master nodes, expected format is `[{ "protocol" = "tcp", "port_range_min" = 443, "port_range_max" = 443, "remote_ip_prefix" = "0.0.0.0/0"}]`, empty by default |
|`master_allowed_ports_ipv6` | List of ports to open on master nodes for IPv6 CIDR blocks, expected format is `[{ "protocol" = "tcp", "port_range_min" = 443, "port_range_max" = 443, "remote_ip_prefix" = "::/0"}]`, empty by default |
|`node_root_volume_size_in_gb` | Size of the root volume for nodes, 0 to use ephemeral storage | |`node_root_volume_size_in_gb` | Size of the root volume for nodes, 0 to use ephemeral storage |
|`master_root_volume_size_in_gb` | Size of the root volume for masters, 0 to use ephemeral storage | |`master_root_volume_size_in_gb` | Size of the root volume for masters, 0 to use ephemeral storage |
|`master_volume_type` | Volume type of the root volume for control_plane, 'Default' by default | |`master_volume_type` | Volume type of the root volume for control_plane, 'Default' by default |
@@ -299,10 +290,6 @@ For your cluster, edit `inventory/$CLUSTER/cluster.tfvars`.
|`force_null_port_security` | Set `null` instead of `true` or `false` for `port_security`. `false` by default | |`force_null_port_security` | Set `null` instead of `true` or `false` for `port_security`. `false` by default |
|`k8s_nodes` | Map containing worker node definition, see explanation below | |`k8s_nodes` | Map containing worker node definition, see explanation below |
|`k8s_masters` | Map containing master node definition, see explanation for k8s_nodes and `sample-inventory/cluster.tfvars` | |`k8s_masters` | Map containing master node definition, see explanation for k8s_nodes and `sample-inventory/cluster.tfvars` |
| `k8s_master_loadbalancer_enabled`| Enable and use an Octavia load balancer for the K8s master nodes |
| `k8s_master_loadbalancer_listener_port` | Define via which port the K8s Api should be exposed. `6443` by default |
| `k8s_master_loadbalancer_server_port` | Define via which port the K8S api is available on the mas. `6443` by default |
| `k8s_master_loadbalancer_public_ip` | Specify if an existing floating IP should be used for the load balancer. A new floating IP is assigned by default |
##### k8s_nodes ##### k8s_nodes
@@ -331,7 +318,6 @@ k8s_nodes:
mount_path: string # Path to where the partition should be mounted mount_path: string # Path to where the partition should be mounted
partition_start: string # Where the partition should start (e.g. 10GB ). Note, if you set the partition_start to 0 there will be no space left for the root partition partition_start: string # Where the partition should start (e.g. 10GB ). Note, if you set the partition_start to 0 there will be no space left for the root partition
partition_end: string # Where the partition should end (e.g. 10GB or -1 for end of volume) partition_end: string # Where the partition should end (e.g. 10GB or -1 for end of volume)
netplan_critical_dhcp_interface: string # Name of interface to set the dhcp flag critical = true, to circumvent [this issue](https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1776013).
``` ```
For example: For example:
@@ -619,7 +605,7 @@ Edit `inventory/$CLUSTER/group_vars/k8s_cluster/k8s_cluster.yml`:
- Set variable **kube_network_plugin** to your desired networking plugin. - Set variable **kube_network_plugin** to your desired networking plugin.
- **flannel** works out-of-the-box - **flannel** works out-of-the-box
- **calico** requires [configuring OpenStack Neutron ports](/docs/cloud_providers/openstack.md) to allow service and pod subnets - **calico** requires [configuring OpenStack Neutron ports](/docs/openstack.md) to allow service and pod subnets
```yml ```yml
# Choose network plugin (calico, weave or flannel) # Choose network plugin (calico, weave or flannel)

View File

@@ -77,21 +77,14 @@ module "compute" {
k8s_nodes_fips = module.ips.k8s_nodes_fips k8s_nodes_fips = module.ips.k8s_nodes_fips
bastion_fips = module.ips.bastion_fips bastion_fips = module.ips.bastion_fips
bastion_allowed_remote_ips = var.bastion_allowed_remote_ips bastion_allowed_remote_ips = var.bastion_allowed_remote_ips
bastion_allowed_remote_ipv6_ips = var.bastion_allowed_remote_ipv6_ips
master_allowed_remote_ips = var.master_allowed_remote_ips master_allowed_remote_ips = var.master_allowed_remote_ips
master_allowed_remote_ipv6_ips = var.master_allowed_remote_ipv6_ips
k8s_allowed_remote_ips = var.k8s_allowed_remote_ips k8s_allowed_remote_ips = var.k8s_allowed_remote_ips
k8s_allowed_remote_ips_ipv6 = var.k8s_allowed_remote_ips_ipv6
k8s_allowed_egress_ips = var.k8s_allowed_egress_ips k8s_allowed_egress_ips = var.k8s_allowed_egress_ips
k8s_allowed_egress_ipv6_ips = var.k8s_allowed_egress_ipv6_ips
supplementary_master_groups = var.supplementary_master_groups supplementary_master_groups = var.supplementary_master_groups
supplementary_node_groups = var.supplementary_node_groups supplementary_node_groups = var.supplementary_node_groups
master_allowed_ports = var.master_allowed_ports master_allowed_ports = var.master_allowed_ports
master_allowed_ports_ipv6 = var.master_allowed_ports_ipv6
worker_allowed_ports = var.worker_allowed_ports worker_allowed_ports = var.worker_allowed_ports
worker_allowed_ports_ipv6 = var.worker_allowed_ports_ipv6
bastion_allowed_ports = var.bastion_allowed_ports bastion_allowed_ports = var.bastion_allowed_ports
bastion_allowed_ports_ipv6 = var.bastion_allowed_ports_ipv6
use_access_ip = var.use_access_ip use_access_ip = var.use_access_ip
master_server_group_policy = var.master_server_group_policy master_server_group_policy = var.master_server_group_policy
node_server_group_policy = var.node_server_group_policy node_server_group_policy = var.node_server_group_policy
@@ -112,24 +105,6 @@ module "compute" {
] ]
} }
module "loadbalancer" {
source = "./modules/loadbalancer"
cluster_name = var.cluster_name
subnet_id = module.network.subnet_id
floatingip_pool = var.floatingip_pool
k8s_master_ips = module.compute.k8s_master_ips
k8s_master_loadbalancer_enabled = var.k8s_master_loadbalancer_enabled
k8s_master_loadbalancer_listener_port = var.k8s_master_loadbalancer_listener_port
k8s_master_loadbalancer_server_port = var.k8s_master_loadbalancer_server_port
k8s_master_loadbalancer_public_ip = var.k8s_master_loadbalancer_public_ip
depends_on = [
module.compute.k8s_master
]
}
output "private_subnet_id" { output "private_subnet_id" {
value = module.network.subnet_id value = module.network.subnet_id
} }

View File

@@ -19,8 +19,8 @@ data "cloudinit_config" "cloudinit" {
part { part {
content_type = "text/cloud-config" content_type = "text/cloud-config"
content = templatefile("${path.module}/templates/cloudinit.yaml.tmpl", { content = templatefile("${path.module}/templates/cloudinit.yaml.tmpl", {
extra_partitions = [], # template_file doesn't support lists
netplan_critical_dhcp_interface = "" extra_partitions = ""
}) })
} }
} }
@@ -70,36 +70,6 @@ resource "openstack_networking_secgroup_rule_v2" "k8s_master_ports" {
security_group_id = openstack_networking_secgroup_v2.k8s_master.id security_group_id = openstack_networking_secgroup_v2.k8s_master.id
} }
resource "openstack_networking_secgroup_rule_v2" "k8s_master_ipv6_ingress" {
count = length(var.master_allowed_remote_ipv6_ips)
direction = "ingress"
ethertype = "IPv6"
protocol = "tcp"
port_range_min = "6443"
port_range_max = "6443"
remote_ip_prefix = var.master_allowed_remote_ipv6_ips[count.index]
security_group_id = openstack_networking_secgroup_v2.k8s_master.id
}
resource "openstack_networking_secgroup_rule_v2" "k8s_master_ports_ipv6_ingress" {
count = length(var.master_allowed_ports_ipv6)
direction = "ingress"
ethertype = "IPv6"
protocol = lookup(var.master_allowed_ports_ipv6[count.index], "protocol", "tcp")
port_range_min = lookup(var.master_allowed_ports_ipv6[count.index], "port_range_min")
port_range_max = lookup(var.master_allowed_ports_ipv6[count.index], "port_range_max")
remote_ip_prefix = lookup(var.master_allowed_ports_ipv6[count.index], "remote_ip_prefix", "::/0")
security_group_id = openstack_networking_secgroup_v2.k8s_master.id
}
resource "openstack_networking_secgroup_rule_v2" "master_egress_ipv6" {
count = length(var.k8s_allowed_egress_ipv6_ips)
direction = "egress"
ethertype = "IPv6"
remote_ip_prefix = var.k8s_allowed_egress_ipv6_ips[count.index]
security_group_id = openstack_networking_secgroup_v2.k8s_master.id
}
resource "openstack_networking_secgroup_v2" "bastion" { resource "openstack_networking_secgroup_v2" "bastion" {
name = "${var.cluster_name}-bastion" name = "${var.cluster_name}-bastion"
count = var.number_of_bastions != "" ? 1 : 0 count = var.number_of_bastions != "" ? 1 : 0
@@ -129,28 +99,6 @@ resource "openstack_networking_secgroup_rule_v2" "k8s_bastion_ports" {
security_group_id = openstack_networking_secgroup_v2.bastion[0].id security_group_id = openstack_networking_secgroup_v2.bastion[0].id
} }
resource "openstack_networking_secgroup_rule_v2" "bastion_ipv6_ingress" {
count = var.number_of_bastions != "" ? length(var.bastion_allowed_remote_ipv6_ips) : 0
direction = "ingress"
ethertype = "IPv6"
protocol = "tcp"
port_range_min = "22"
port_range_max = "22"
remote_ip_prefix = var.bastion_allowed_remote_ipv6_ips[count.index]
security_group_id = openstack_networking_secgroup_v2.bastion[0].id
}
resource "openstack_networking_secgroup_rule_v2" "k8s_bastion_ports_ipv6_ingress" {
count = length(var.bastion_allowed_ports_ipv6)
direction = "ingress"
ethertype = "IPv6"
protocol = lookup(var.bastion_allowed_ports_ipv6[count.index], "protocol", "tcp")
port_range_min = lookup(var.bastion_allowed_ports_ipv6[count.index], "port_range_min")
port_range_max = lookup(var.bastion_allowed_ports_ipv6[count.index], "port_range_max")
remote_ip_prefix = lookup(var.bastion_allowed_ports_ipv6[count.index], "remote_ip_prefix", "::/0")
security_group_id = openstack_networking_secgroup_v2.bastion[0].id
}
resource "openstack_networking_secgroup_v2" "k8s" { resource "openstack_networking_secgroup_v2" "k8s" {
name = "${var.cluster_name}-k8s" name = "${var.cluster_name}-k8s"
description = "${var.cluster_name} - Kubernetes" description = "${var.cluster_name} - Kubernetes"
@@ -164,13 +112,6 @@ resource "openstack_networking_secgroup_rule_v2" "k8s" {
security_group_id = openstack_networking_secgroup_v2.k8s.id security_group_id = openstack_networking_secgroup_v2.k8s.id
} }
resource "openstack_networking_secgroup_rule_v2" "k8s_ipv6" {
direction = "ingress"
ethertype = "IPv6"
remote_group_id = openstack_networking_secgroup_v2.k8s.id
security_group_id = openstack_networking_secgroup_v2.k8s.id
}
resource "openstack_networking_secgroup_rule_v2" "k8s_allowed_remote_ips" { resource "openstack_networking_secgroup_rule_v2" "k8s_allowed_remote_ips" {
count = length(var.k8s_allowed_remote_ips) count = length(var.k8s_allowed_remote_ips)
direction = "ingress" direction = "ingress"
@@ -182,17 +123,6 @@ resource "openstack_networking_secgroup_rule_v2" "k8s_allowed_remote_ips" {
security_group_id = openstack_networking_secgroup_v2.k8s.id security_group_id = openstack_networking_secgroup_v2.k8s.id
} }
resource "openstack_networking_secgroup_rule_v2" "k8s_allowed_remote_ips_ipv6" {
count = length(var.k8s_allowed_remote_ips_ipv6)
direction = "ingress"
ethertype = "IPv6"
protocol = "tcp"
port_range_min = "22"
port_range_max = "22"
remote_ip_prefix = var.k8s_allowed_remote_ips_ipv6[count.index]
security_group_id = openstack_networking_secgroup_v2.k8s.id
}
resource "openstack_networking_secgroup_rule_v2" "egress" { resource "openstack_networking_secgroup_rule_v2" "egress" {
count = length(var.k8s_allowed_egress_ips) count = length(var.k8s_allowed_egress_ips)
direction = "egress" direction = "egress"
@@ -201,14 +131,6 @@ resource "openstack_networking_secgroup_rule_v2" "egress" {
security_group_id = openstack_networking_secgroup_v2.k8s.id security_group_id = openstack_networking_secgroup_v2.k8s.id
} }
resource "openstack_networking_secgroup_rule_v2" "egress_ipv6" {
count = length(var.k8s_allowed_egress_ipv6_ips)
direction = "egress"
ethertype = "IPv6"
remote_ip_prefix = var.k8s_allowed_egress_ipv6_ips[count.index]
security_group_id = openstack_networking_secgroup_v2.k8s.id
}
resource "openstack_networking_secgroup_v2" "worker" { resource "openstack_networking_secgroup_v2" "worker" {
name = "${var.cluster_name}-k8s-worker" name = "${var.cluster_name}-k8s-worker"
description = "${var.cluster_name} - Kubernetes worker nodes" description = "${var.cluster_name} - Kubernetes worker nodes"
@@ -233,17 +155,6 @@ resource "openstack_networking_secgroup_rule_v2" "worker" {
security_group_id = openstack_networking_secgroup_v2.worker.id security_group_id = openstack_networking_secgroup_v2.worker.id
} }
resource "openstack_networking_secgroup_rule_v2" "worker_ipv6_ingress" {
count = length(var.worker_allowed_ports_ipv6)
direction = "ingress"
ethertype = "IPv6"
protocol = lookup(var.worker_allowed_ports_ipv6[count.index], "protocol", "tcp")
port_range_min = lookup(var.worker_allowed_ports_ipv6[count.index], "port_range_min")
port_range_max = lookup(var.worker_allowed_ports_ipv6[count.index], "port_range_max")
remote_ip_prefix = lookup(var.worker_allowed_ports_ipv6[count.index], "remote_ip_prefix", "::/0")
security_group_id = openstack_networking_secgroup_v2.worker.id
}
resource "openstack_compute_servergroup_v2" "k8s_master" { resource "openstack_compute_servergroup_v2" "k8s_master" {
count = var.master_server_group_policy != "" ? 1 : 0 count = var.master_server_group_policy != "" ? 1 : 0
name = "k8s-master-srvgrp" name = "k8s-master-srvgrp"
@@ -393,10 +304,6 @@ resource "openstack_networking_port_v2" "k8s_master_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -463,10 +370,6 @@ resource "openstack_networking_port_v2" "k8s_masters_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -531,10 +434,6 @@ resource "openstack_networking_port_v2" "k8s_master_no_etcd_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -661,10 +560,6 @@ resource "openstack_networking_port_v2" "k8s_master_no_floating_ip_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -725,10 +620,6 @@ resource "openstack_networking_port_v2" "k8s_master_no_floating_ip_no_etcd_port"
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -790,10 +681,6 @@ resource "openstack_networking_port_v2" "k8s_node_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -860,10 +747,6 @@ resource "openstack_networking_port_v2" "k8s_node_no_floating_ip_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -925,10 +808,6 @@ resource "openstack_networking_port_v2" "k8s_nodes_port" {
} }
} }
lifecycle {
ignore_changes = [ allowed_address_pairs ]
}
depends_on = [ depends_on = [
var.network_router_id var.network_router_id
] ]
@@ -942,8 +821,7 @@ resource "openstack_compute_instance_v2" "k8s_nodes" {
flavor_id = each.value.flavor flavor_id = each.value.flavor
key_pair = openstack_compute_keypair_v2.k8s.name key_pair = openstack_compute_keypair_v2.k8s.name
user_data = each.value.cloudinit != null ? templatefile("${path.module}/templates/cloudinit.yaml.tmpl", { user_data = each.value.cloudinit != null ? templatefile("${path.module}/templates/cloudinit.yaml.tmpl", {
extra_partitions = each.value.cloudinit.extra_partitions, extra_partitions = each.value.cloudinit.extra_partitions
netplan_critical_dhcp_interface = each.value.cloudinit.netplan_critical_dhcp_interface,
}) : data.cloudinit_config.cloudinit.rendered }) : data.cloudinit_config.cloudinit.rendered
dynamic "block_device" { dynamic "block_device" {
@@ -972,7 +850,7 @@ resource "openstack_compute_instance_v2" "k8s_nodes" {
metadata = { metadata = {
ssh_user = var.ssh_user ssh_user = var.ssh_user
kubespray_groups = "kube_node,k8s_cluster,%{if !each.value.floating_ip}no_floating,%{endif}${var.supplementary_node_groups}${each.value.extra_groups != null ? ",${each.value.extra_groups}" : ""}" kubespray_groups = "kube_node,k8s_cluster,%{if each.value.floating_ip == false}no_floating,%{endif}${var.supplementary_node_groups}${each.value.extra_groups != null ? ",${each.value.extra_groups}" : ""}"
depends_on = var.network_router_id depends_on = var.network_router_id
use_access_ip = var.use_access_ip use_access_ip = var.use_access_ip
} }

View File

@@ -1,3 +0,0 @@
output "k8s_master_ips" {
value = concat(openstack_compute_instance_v2.k8s_master_no_floating_ip.*, openstack_compute_instance_v2.k8s_master_no_floating_ip_no_etcd.*)
}

View File

@@ -1,4 +1,4 @@
%{~ if length(extra_partitions) > 0 || netplan_critical_dhcp_interface != "" } %{~ if length(extra_partitions) > 0 }
#cloud-config #cloud-config
bootcmd: bootcmd:
%{~ for idx, partition in extra_partitions } %{~ for idx, partition in extra_partitions }
@@ -8,26 +8,11 @@ bootcmd:
%{~ endfor } %{~ endfor }
runcmd: runcmd:
%{~ if netplan_critical_dhcp_interface != "" }
- netplan apply
%{~ endif }
%{~ for idx, partition in extra_partitions } %{~ for idx, partition in extra_partitions }
- mkdir -p ${partition.mount_path} - mkdir -p ${partition.mount_path}
- chown nobody:nogroup ${partition.mount_path} - chown nobody:nogroup ${partition.mount_path}
- mount ${partition.partition_path} ${partition.mount_path} - mount ${partition.partition_path} ${partition.mount_path}
%{~ endfor ~} %{~ endfor }
%{~ if netplan_critical_dhcp_interface != "" }
write_files:
- path: /etc/netplan/90-critical-dhcp.yaml
content: |
network:
version: 2
ethernets:
${ netplan_critical_dhcp_interface }:
dhcp4: true
critical: true
%{~ endif }
mounts: mounts:
%{~ for idx, partition in extra_partitions } %{~ for idx, partition in extra_partitions }

View File

@@ -104,34 +104,18 @@ variable "bastion_allowed_remote_ips" {
type = list type = list
} }
variable "bastion_allowed_remote_ipv6_ips" {
type = list
}
variable "master_allowed_remote_ips" { variable "master_allowed_remote_ips" {
type = list type = list
} }
variable "master_allowed_remote_ipv6_ips" {
type = list
}
variable "k8s_allowed_remote_ips" { variable "k8s_allowed_remote_ips" {
type = list type = list
} }
variable "k8s_allowed_remote_ips_ipv6" {
type = list
}
variable "k8s_allowed_egress_ips" { variable "k8s_allowed_egress_ips" {
type = list type = list
} }
variable "k8s_allowed_egress_ipv6_ips" {
type = list
}
variable "k8s_masters" { variable "k8s_masters" {
type = map(object({ type = map(object({
az = string az = string
@@ -158,14 +142,13 @@ variable "k8s_nodes" {
additional_server_groups = optional(list(string)) additional_server_groups = optional(list(string))
server_group = optional(string) server_group = optional(string)
cloudinit = optional(object({ cloudinit = optional(object({
extra_partitions = optional(list(object({ extra_partitions = list(object({
volume_path = string volume_path = string
partition_path = string partition_path = string
partition_start = string partition_start = string
partition_end = string partition_end = string
mount_path = string mount_path = string
})), []) }))
netplan_critical_dhcp_interface = optional(string, "")
})) }))
})) }))
} }
@@ -188,26 +171,14 @@ variable "master_allowed_ports" {
type = list type = list
} }
variable "master_allowed_ports_ipv6" {
type = list
}
variable "worker_allowed_ports" { variable "worker_allowed_ports" {
type = list type = list
} }
variable "worker_allowed_ports_ipv6" {
type = list
}
variable "bastion_allowed_ports" { variable "bastion_allowed_ports" {
type = list type = list
} }
variable "bastion_allowed_ports_ipv6" {
type = list
}
variable "use_access_ip" {} variable "use_access_ip" {}
variable "master_server_group_policy" { variable "master_server_group_policy" {

View File

@@ -1,54 +0,0 @@
resource "openstack_lb_loadbalancer_v2" "k8s_lb" {
count = var.k8s_master_loadbalancer_enabled ? 1 : 0
name = "${var.cluster_name}-api-loadbalancer"
vip_subnet_id = var.subnet_id
}
resource "openstack_lb_listener_v2" "api_listener"{
count = var.k8s_master_loadbalancer_enabled ? 1 : 0
name = "api-listener"
protocol = "TCP"
protocol_port = var.k8s_master_loadbalancer_listener_port
loadbalancer_id = openstack_lb_loadbalancer_v2.k8s_lb[0].id
depends_on = [ openstack_lb_loadbalancer_v2.k8s_lb ]
}
resource "openstack_lb_pool_v2" "api_pool" {
count = var.k8s_master_loadbalancer_enabled ? 1 : 0
name = "api-pool"
protocol = "TCP"
lb_method = "ROUND_ROBIN"
listener_id = openstack_lb_listener_v2.api_listener[0].id
depends_on = [ openstack_lb_listener_v2.api_listener ]
}
resource "openstack_lb_member_v2" "lb_member" {
count = var.k8s_master_loadbalancer_enabled ? length(var.k8s_master_ips) : 0
name = var.k8s_master_ips[count.index].name
pool_id = openstack_lb_pool_v2.api_pool[0].id
address = var.k8s_master_ips[count.index].access_ip_v4
protocol_port = var.k8s_master_loadbalancer_server_port
depends_on = [ openstack_lb_pool_v2.api_pool ]
}
resource "openstack_lb_monitor_v2" "monitor" {
count = var.k8s_master_loadbalancer_enabled ? 1 : 0
name = "Api Monitor"
pool_id = openstack_lb_pool_v2.api_pool[0].id
type = "TCP"
delay = 10
timeout = 5
max_retries = 5
}
resource "openstack_networking_floatingip_v2" "floatip_1" {
count = var.k8s_master_loadbalancer_enabled && var.k8s_master_loadbalancer_public_ip == "" ? 1 : 0
pool = var.floatingip_pool
}
resource "openstack_networking_floatingip_associate_v2" "public_ip" {
count = var.k8s_master_loadbalancer_enabled ? 1 : 0
floating_ip = var.k8s_master_loadbalancer_public_ip != "" ? var.k8s_master_loadbalancer_public_ip : openstack_networking_floatingip_v2.floatip_1[0].address
port_id = openstack_lb_loadbalancer_v2.k8s_lb[0].vip_port_id
depends_on = [ openstack_lb_loadbalancer_v2.k8s_lb ]
}

View File

@@ -1,15 +0,0 @@
variable "cluster_name" {}
variable "subnet_id" {}
variable "floatingip_pool" {}
variable "k8s_master_ips" {}
variable "k8s_master_loadbalancer_enabled" {}
variable "k8s_master_loadbalancer_listener_port" {}
variable "k8s_master_loadbalancer_server_port" {}
variable "k8s_master_loadbalancer_public_ip" {}

View File

@@ -1,8 +0,0 @@
terraform {
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
}
}
required_version = ">= 0.12.26"
}

View File

@@ -220,60 +220,30 @@ variable "bastion_allowed_remote_ips" {
default = ["0.0.0.0/0"] default = ["0.0.0.0/0"]
} }
variable "bastion_allowed_remote_ipv6_ips" {
description = "An array of IPv6 CIDRs allowed to SSH to hosts"
type = list(string)
default = ["::/0"]
}
variable "master_allowed_remote_ips" { variable "master_allowed_remote_ips" {
description = "An array of CIDRs allowed to access API of masters" description = "An array of CIDRs allowed to access API of masters"
type = list(string) type = list(string)
default = ["0.0.0.0/0"] default = ["0.0.0.0/0"]
} }
variable "master_allowed_remote_ipv6_ips" {
description = "An array of IPv6 CIDRs allowed to access API of masters"
type = list(string)
default = ["::/0"]
}
variable "k8s_allowed_remote_ips" { variable "k8s_allowed_remote_ips" {
description = "An array of CIDRs allowed to SSH to hosts" description = "An array of CIDRs allowed to SSH to hosts"
type = list(string) type = list(string)
default = [] default = []
} }
variable "k8s_allowed_remote_ips_ipv6" {
description = "An array of IPv6 CIDRs allowed to SSH to hosts"
type = list(string)
default = []
}
variable "k8s_allowed_egress_ips" { variable "k8s_allowed_egress_ips" {
description = "An array of CIDRs allowed for egress traffic" description = "An array of CIDRs allowed for egress traffic"
type = list(string) type = list(string)
default = ["0.0.0.0/0"] default = ["0.0.0.0/0"]
} }
variable "k8s_allowed_egress_ipv6_ips" {
description = "An array of CIDRs allowed for egress IPv6 traffic"
type = list(string)
default = ["::/0"]
}
variable "master_allowed_ports" { variable "master_allowed_ports" {
type = list(any) type = list(any)
default = [] default = []
} }
variable "master_allowed_ports_ipv6" {
type = list(any)
default = []
}
variable "worker_allowed_ports" { variable "worker_allowed_ports" {
type = list(any) type = list(any)
@@ -287,31 +257,12 @@ variable "worker_allowed_ports" {
] ]
} }
variable "worker_allowed_ports_ipv6" {
type = list(any)
default = [
{
"protocol" = "tcp"
"port_range_min" = 30000
"port_range_max" = 32767
"remote_ip_prefix" = "::/0"
},
]
}
variable "bastion_allowed_ports" { variable "bastion_allowed_ports" {
type = list(any) type = list(any)
default = [] default = []
} }
variable "bastion_allowed_ports_ipv6" {
type = list(any)
default = []
}
variable "use_access_ip" { variable "use_access_ip" {
default = 1 default = 1
} }
@@ -389,23 +340,3 @@ variable "group_vars_path" {
type = string type = string
default = "./group_vars" default = "./group_vars"
} }
variable "k8s_master_loadbalancer_enabled" {
type = bool
default = "false"
}
variable "k8s_master_loadbalancer_listener_port" {
type = string
default = "6443"
}
variable "k8s_master_loadbalancer_server_port" {
type = string
default = 6443
}
variable "k8s_master_loadbalancer_public_ip" {
type = string
default = ""
}

View File

@@ -368,7 +368,7 @@ def iter_host_ips(hosts, ips):
'ansible_host': ip, 'ansible_host': ip,
}) })
if 'use_access_ip' in host[1]['metadata'] and host[1]['metadata']['use_access_ip'] == "0" and 'access_ip' in host[1]: if 'use_access_ip' in host[1]['metadata'] and host[1]['metadata']['use_access_ip'] == "0":
host[1].pop('access_ip') host[1].pop('access_ip')
yield host yield host

View File

@@ -140,4 +140,4 @@ terraform destroy --var-file cluster-settings.tfvars \
* `backend_servers`: List of servers that traffic to the port should be forwarded to. * `backend_servers`: List of servers that traffic to the port should be forwarded to.
* `server_groups`: Group servers together * `server_groups`: Group servers together
* `servers`: The servers that should be included in the group. * `servers`: The servers that should be included in the group.
* `anti_affinity_policy`: Defines if a server group is an anti-affinity group. Setting this to "strict" or yes" will result in all servers in the group being placed on separate compute hosts. The value can be "strict", "yes" or "no". "strict" refers to strict policy doesn't allow servers in the same server group to be on the same host. "yes" refers to best-effort policy and tries to put servers on different hosts, but this is not guaranteed. * `anti_affinity`: If anti-affinity should be enabled, try to spread the VMs out on separate nodes.

View File

@@ -1,11 +1,5 @@
# See: https://developers.upcloud.com/1.3/5-zones/ # See: https://developers.upcloud.com/1.3/5-zones/
zone = "fi-hel1" zone = "fi-hel1"
private_cloud = false
# Only used if private_cloud = true, public zone equivalent
# For example use finnish public zone for finnish private zone
public_zone = "fi-hel2"
username = "ubuntu" username = "ubuntu"
# Prefix to use for all resources to separate them from other resources # Prefix to use for all resources to separate them from other resources
@@ -24,7 +18,7 @@ ssh_public_keys = [
# check list of available plan https://developers.upcloud.com/1.3/7-plans/ # check list of available plan https://developers.upcloud.com/1.3/7-plans/
machines = { machines = {
"control-plane-0" : { "master-0" : {
"node_type" : "master", "node_type" : "master",
# plan to use instead of custom cpu/mem # plan to use instead of custom cpu/mem
"plan" : null, "plan" : null,
@@ -122,9 +116,8 @@ k8s_allowed_remote_ips = [
master_allowed_ports = [] master_allowed_ports = []
worker_allowed_ports = [] worker_allowed_ports = []
loadbalancer_enabled = false loadbalancer_enabled = false
loadbalancer_plan = "development" loadbalancer_plan = "development"
loadbalancer_proxy_protocol = false
loadbalancers = { loadbalancers = {
# "http" : { # "http" : {
# "port" : 80, # "port" : 80,
@@ -140,9 +133,9 @@ loadbalancers = {
server_groups = { server_groups = {
# "control-plane" = { # "control-plane" = {
# servers = [ # servers = [
# "control-plane-0" # "master-0"
# ] # ]
# anti_affinity_policy = "strict" # anti_affinity = true
# }, # },
# "workers" = { # "workers" = {
# servers = [ # servers = [
@@ -150,6 +143,6 @@ server_groups = {
# "worker-1", # "worker-1",
# "worker-2" # "worker-2"
# ] # ]
# anti_affinity_policy = "yes" # anti_affinity = true
# } # }
} }

View File

@@ -11,10 +11,8 @@ provider "upcloud" {
module "kubernetes" { module "kubernetes" {
source = "./modules/kubernetes-cluster" source = "./modules/kubernetes-cluster"
prefix = var.prefix prefix = var.prefix
zone = var.zone zone = var.zone
private_cloud = var.private_cloud
public_zone = var.public_zone
template_name = var.template_name template_name = var.template_name
username = var.username username = var.username
@@ -33,10 +31,9 @@ module "kubernetes" {
master_allowed_ports = var.master_allowed_ports master_allowed_ports = var.master_allowed_ports
worker_allowed_ports = var.worker_allowed_ports worker_allowed_ports = var.worker_allowed_ports
loadbalancer_enabled = var.loadbalancer_enabled loadbalancer_enabled = var.loadbalancer_enabled
loadbalancer_plan = var.loadbalancer_plan loadbalancer_plan = var.loadbalancer_plan
loadbalancer_outbound_proxy_protocol = var.loadbalancer_proxy_protocol ? "v2" : "" loadbalancers = var.loadbalancers
loadbalancers = var.loadbalancers
server_groups = var.server_groups server_groups = var.server_groups
} }

View File

@@ -3,7 +3,7 @@ locals {
disks = flatten([ disks = flatten([
for node_name, machine in var.machines : [ for node_name, machine in var.machines : [
for disk_name, disk in machine.additional_disks : { for disk_name, disk in machine.additional_disks : {
disk = disk disk = disk
disk_name = disk_name disk_name = disk_name
node_name = node_name node_name = node_name
} }
@@ -13,8 +13,8 @@ locals {
lb_backend_servers = flatten([ lb_backend_servers = flatten([
for lb_name, loadbalancer in var.loadbalancers : [ for lb_name, loadbalancer in var.loadbalancers : [
for backend_server in loadbalancer.backend_servers : { for backend_server in loadbalancer.backend_servers : {
port = loadbalancer.target_port port = loadbalancer.target_port
lb_name = lb_name lb_name = lb_name
server_name = backend_server server_name = backend_server
} }
] ]
@@ -22,7 +22,7 @@ locals {
# If prefix is set, all resources will be prefixed with "${var.prefix}-" # If prefix is set, all resources will be prefixed with "${var.prefix}-"
# Else don't prefix with anything # Else don't prefix with anything
resource-prefix = "%{if var.prefix != ""}${var.prefix}-%{endif}" resource-prefix = "%{ if var.prefix != ""}${var.prefix}-%{ endif }"
} }
resource "upcloud_network" "private" { resource "upcloud_network" "private" {
@@ -38,7 +38,7 @@ resource "upcloud_network" "private" {
resource "upcloud_storage" "additional_disks" { resource "upcloud_storage" "additional_disks" {
for_each = { for_each = {
for disk in local.disks : "${disk.node_name}_${disk.disk_name}" => disk.disk for disk in local.disks: "${disk.node_name}_${disk.disk_name}" => disk.disk
} }
size = each.value.size size = each.value.size
@@ -54,16 +54,15 @@ resource "upcloud_server" "master" {
if machine.node_type == "master" if machine.node_type == "master"
} }
hostname = "${local.resource-prefix}${each.key}" hostname = "${local.resource-prefix}${each.key}"
plan = each.value.plan plan = each.value.plan
cpu = each.value.plan == null ? null : each.value.cpu cpu = each.value.plan == null ? each.value.cpu : null
mem = each.value.plan == null ? null : each.value.mem mem = each.value.plan == null ? each.value.mem : null
zone = var.zone zone = var.zone
server_group = each.value.server_group == null ? null : upcloud_server_group.server_groups[each.value.server_group].id
template { template {
storage = var.template_name storage = var.template_name
size = each.value.disk_size size = each.value.disk_size
} }
# Public network interface # Public network interface
@@ -82,14 +81,14 @@ resource "upcloud_server" "master" {
ignore_changes = [storage_devices] ignore_changes = [storage_devices]
} }
firewall = var.firewall_enabled firewall = var.firewall_enabled
dynamic "storage_devices" { dynamic "storage_devices" {
for_each = { for_each = {
for disk_key_name, disk in upcloud_storage.additional_disks : for disk_key_name, disk in upcloud_storage.additional_disks :
disk_key_name => disk disk_key_name => disk
# Only add the disk if it matches the node name in the start of its name # Only add the disk if it matches the node name in the start of its name
if length(regexall("^${each.key}_.+", disk_key_name)) > 0 if length(regexall("^${each.key}_.+", disk_key_name)) > 0
} }
content { content {
@@ -112,13 +111,11 @@ resource "upcloud_server" "worker" {
if machine.node_type == "worker" if machine.node_type == "worker"
} }
hostname = "${local.resource-prefix}${each.key}" hostname = "${local.resource-prefix}${each.key}"
plan = each.value.plan plan = each.value.plan
cpu = each.value.plan == null ? null : each.value.cpu cpu = each.value.plan == null ? each.value.cpu : null
mem = each.value.plan == null ? null : each.value.mem mem = each.value.plan == null ? each.value.mem : null
zone = var.zone zone = var.zone
server_group = each.value.server_group == null ? null : upcloud_server_group.server_groups[each.value.server_group].id
template { template {
storage = var.template_name storage = var.template_name
@@ -141,14 +138,14 @@ resource "upcloud_server" "worker" {
ignore_changes = [storage_devices] ignore_changes = [storage_devices]
} }
firewall = var.firewall_enabled firewall = var.firewall_enabled
dynamic "storage_devices" { dynamic "storage_devices" {
for_each = { for_each = {
for disk_key_name, disk in upcloud_storage.additional_disks : for disk_key_name, disk in upcloud_storage.additional_disks :
disk_key_name => disk disk_key_name => disk
# Only add the disk if it matches the node name in the start of its name # Only add the disk if it matches the node name in the start of its name
if length(regexall("^${each.key}_.+", disk_key_name)) > 0 if length(regexall("^${each.key}_.+", disk_key_name)) > 0
} }
content { content {
@@ -165,10 +162,10 @@ resource "upcloud_server" "worker" {
} }
resource "upcloud_firewall_rules" "master" { resource "upcloud_firewall_rules" "master" {
for_each = upcloud_server.master for_each = upcloud_server.master
server_id = each.value.id server_id = each.value.id
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.master_allowed_remote_ips for_each = var.master_allowed_remote_ips
content { content {
@@ -184,7 +181,7 @@ resource "upcloud_firewall_rules" "master" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = length(var.master_allowed_remote_ips) > 0 ? [1] : [] for_each = length(var.master_allowed_remote_ips) > 0 ? [1] : []
content { content {
@@ -200,7 +197,7 @@ resource "upcloud_firewall_rules" "master" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.k8s_allowed_remote_ips for_each = var.k8s_allowed_remote_ips
content { content {
@@ -216,7 +213,7 @@ resource "upcloud_firewall_rules" "master" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = length(var.k8s_allowed_remote_ips) > 0 ? [1] : [] for_each = length(var.k8s_allowed_remote_ips) > 0 ? [1] : []
content { content {
@@ -232,7 +229,7 @@ resource "upcloud_firewall_rules" "master" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.master_allowed_ports for_each = var.master_allowed_ports
content { content {
@@ -248,97 +245,97 @@ resource "upcloud_firewall_rules" "master" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "94.237.40.9" source_address_end = "94.237.40.9"
source_address_start = "94.237.40.9" source_address_start = "94.237.40.9"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "94.237.127.9" source_address_end = "94.237.127.9"
source_address_start = "94.237.127.9" source_address_start = "94.237.127.9"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "2a04:3540:53::1" source_address_end = "2a04:3540:53::1"
source_address_start = "2a04:3540:53::1" source_address_start = "2a04:3540:53::1"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "2a04:3544:53::1" source_address_end = "2a04:3544:53::1"
source_address_start = "2a04:3544:53::1" source_address_start = "2a04:3544:53::1"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["udp"] : [] for_each = var.firewall_default_deny_in ? ["udp"] : []
content { content {
action = "accept" action = "accept"
comment = "NTP Port" comment = "NTP Port"
source_port_end = "123" source_port_end = "123"
source_port_start = "123" source_port_start = "123"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "255.255.255.255" source_address_end = "255.255.255.255"
source_address_start = "0.0.0.0" source_address_start = "0.0.0.0"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["udp"] : [] for_each = var.firewall_default_deny_in ? ["udp"] : []
content { content {
action = "accept" action = "accept"
comment = "NTP Port" comment = "NTP Port"
source_port_end = "123" source_port_end = "123"
source_port_start = "123" source_port_start = "123"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
} }
} }
@@ -354,10 +351,10 @@ resource "upcloud_firewall_rules" "master" {
} }
resource "upcloud_firewall_rules" "k8s" { resource "upcloud_firewall_rules" "k8s" {
for_each = upcloud_server.worker for_each = upcloud_server.worker
server_id = each.value.id server_id = each.value.id
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.k8s_allowed_remote_ips for_each = var.k8s_allowed_remote_ips
content { content {
@@ -373,7 +370,7 @@ resource "upcloud_firewall_rules" "k8s" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = length(var.k8s_allowed_remote_ips) > 0 ? [1] : [] for_each = length(var.k8s_allowed_remote_ips) > 0 ? [1] : []
content { content {
@@ -389,7 +386,7 @@ resource "upcloud_firewall_rules" "k8s" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.worker_allowed_ports for_each = var.worker_allowed_ports
content { content {
@@ -405,97 +402,97 @@ resource "upcloud_firewall_rules" "k8s" {
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "94.237.40.9" source_address_end = "94.237.40.9"
source_address_start = "94.237.40.9" source_address_start = "94.237.40.9"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "94.237.127.9" source_address_end = "94.237.127.9"
source_address_start = "94.237.127.9" source_address_start = "94.237.127.9"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "2a04:3540:53::1" source_address_end = "2a04:3540:53::1"
source_address_start = "2a04:3540:53::1" source_address_start = "2a04:3540:53::1"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : [] for_each = var.firewall_default_deny_in ? ["tcp", "udp"] : []
content { content {
action = "accept" action = "accept"
comment = "UpCloud DNS" comment = "UpCloud DNS"
source_port_end = "53" source_port_end = "53"
source_port_start = "53" source_port_start = "53"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "2a04:3544:53::1" source_address_end = "2a04:3544:53::1"
source_address_start = "2a04:3544:53::1" source_address_start = "2a04:3544:53::1"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["udp"] : [] for_each = var.firewall_default_deny_in ? ["udp"] : []
content { content {
action = "accept" action = "accept"
comment = "NTP Port" comment = "NTP Port"
source_port_end = "123" source_port_end = "123"
source_port_start = "123" source_port_start = "123"
direction = "in" direction = "in"
family = "IPv4" family = "IPv4"
protocol = firewall_rule.value protocol = firewall_rule.value
source_address_end = "255.255.255.255" source_address_end = "255.255.255.255"
source_address_start = "0.0.0.0" source_address_start = "0.0.0.0"
} }
} }
dynamic "firewall_rule" { dynamic firewall_rule {
for_each = var.firewall_default_deny_in ? ["udp"] : [] for_each = var.firewall_default_deny_in ? ["udp"] : []
content { content {
action = "accept" action = "accept"
comment = "NTP Port" comment = "NTP Port"
source_port_end = "123" source_port_end = "123"
source_port_start = "123" source_port_start = "123"
direction = "in" direction = "in"
family = "IPv6" family = "IPv6"
protocol = firewall_rule.value protocol = firewall_rule.value
} }
} }
@@ -515,18 +512,8 @@ resource "upcloud_loadbalancer" "lb" {
configured_status = "started" configured_status = "started"
name = "${local.resource-prefix}lb" name = "${local.resource-prefix}lb"
plan = var.loadbalancer_plan plan = var.loadbalancer_plan
zone = var.private_cloud ? var.public_zone : var.zone zone = var.zone
networks { network = upcloud_network.private.id
name = "Private-Net"
type = "private"
family = "IPv4"
network = upcloud_network.private.id
}
networks {
name = "Public-Net"
type = "public"
family = "IPv4"
}
} }
resource "upcloud_loadbalancer_backend" "lb_backend" { resource "upcloud_loadbalancer_backend" "lb_backend" {
@@ -534,9 +521,6 @@ resource "upcloud_loadbalancer_backend" "lb_backend" {
loadbalancer = upcloud_loadbalancer.lb[0].id loadbalancer = upcloud_loadbalancer.lb[0].id
name = "lb-backend-${each.key}" name = "lb-backend-${each.key}"
properties {
outbound_proxy_protocol = var.loadbalancer_outbound_proxy_protocol
}
} }
resource "upcloud_loadbalancer_frontend" "lb_frontend" { resource "upcloud_loadbalancer_frontend" "lb_frontend" {
@@ -547,16 +531,13 @@ resource "upcloud_loadbalancer_frontend" "lb_frontend" {
mode = "tcp" mode = "tcp"
port = each.value.port port = each.value.port
default_backend_name = upcloud_loadbalancer_backend.lb_backend[each.key].name default_backend_name = upcloud_loadbalancer_backend.lb_backend[each.key].name
networks {
name = "Public-Net"
}
} }
resource "upcloud_loadbalancer_static_backend_member" "lb_backend_member" { resource "upcloud_loadbalancer_static_backend_member" "lb_backend_member" {
for_each = { for_each = {
for be_server in local.lb_backend_servers : for be_server in local.lb_backend_servers:
"${be_server.server_name}-lb-backend-${be_server.lb_name}" => be_server "${be_server.server_name}-lb-backend-${be_server.lb_name}" => be_server
if var.loadbalancer_enabled if var.loadbalancer_enabled
} }
backend = upcloud_loadbalancer_backend.lb_backend[each.value.lb_name].id backend = upcloud_loadbalancer_backend.lb_backend[each.value.lb_name].id
@@ -569,13 +550,9 @@ resource "upcloud_loadbalancer_static_backend_member" "lb_backend_member" {
} }
resource "upcloud_server_group" "server_groups" { resource "upcloud_server_group" "server_groups" {
for_each = var.server_groups for_each = var.server_groups
title = each.key title = each.key
anti_affinity_policy = each.value.anti_affinity_policy anti_affinity = each.value.anti_affinity
labels = {} labels = {}
# Managed upstream via upcloud_server resource members = [for server in each.value.servers : merge(upcloud_server.master, upcloud_server.worker)[server].id]
members = [] }
lifecycle {
ignore_changes = [members]
}
}

View File

@@ -3,8 +3,8 @@ output "master_ip" {
value = { value = {
for instance in upcloud_server.master : for instance in upcloud_server.master :
instance.hostname => { instance.hostname => {
"public_ip" : instance.network_interface[0].ip_address "public_ip": instance.network_interface[0].ip_address
"private_ip" : instance.network_interface[1].ip_address "private_ip": instance.network_interface[1].ip_address
} }
} }
} }
@@ -13,8 +13,8 @@ output "worker_ip" {
value = { value = {
for instance in upcloud_server.worker : for instance in upcloud_server.worker :
instance.hostname => { instance.hostname => {
"public_ip" : instance.network_interface[0].ip_address "public_ip": instance.network_interface[0].ip_address
"private_ip" : instance.network_interface[1].ip_address "private_ip": instance.network_interface[1].ip_address
} }
} }
} }

View File

@@ -6,14 +6,6 @@ variable "zone" {
type = string type = string
} }
variable "private_cloud" {
type = bool
}
variable "public_zone" {
type = string
}
variable "template_name" {} variable "template_name" {}
variable "username" {} variable "username" {}
@@ -23,12 +15,11 @@ variable "private_network_cidr" {}
variable "machines" { variable "machines" {
description = "Cluster machines" description = "Cluster machines"
type = map(object({ type = map(object({
node_type = string node_type = string
plan = string plan = string
cpu = string cpu = string
mem = string mem = string
disk_size = number disk_size = number
server_group : string
additional_disks = map(object({ additional_disks = map(object({
size = number size = number
tier = string tier = string
@@ -94,10 +85,6 @@ variable "loadbalancer_plan" {
type = string type = string
} }
variable "loadbalancer_outbound_proxy_protocol" {
type = string
}
variable "loadbalancers" { variable "loadbalancers" {
description = "Load balancers" description = "Load balancers"
@@ -112,6 +99,7 @@ variable "server_groups" {
description = "Server groups" description = "Server groups"
type = map(object({ type = map(object({
anti_affinity_policy = string anti_affinity = bool
servers = list(string)
})) }))
} }

View File

@@ -2,8 +2,8 @@
terraform { terraform {
required_providers { required_providers {
upcloud = { upcloud = {
source = "UpCloudLtd/upcloud" source = "UpCloudLtd/upcloud"
version = "~>5.6.0" version = "~>2.7.1"
} }
} }
required_version = ">= 0.13" required_version = ">= 0.13"

View File

@@ -18,7 +18,7 @@ ssh_public_keys = [
# check list of available plan https://developers.upcloud.com/1.3/7-plans/ # check list of available plan https://developers.upcloud.com/1.3/7-plans/
machines = { machines = {
"control-plane-0" : { "master-0" : {
"node_type" : "master", "node_type" : "master",
# plan to use instead of custom cpu/mem # plan to use instead of custom cpu/mem
"plan" : null, "plan" : null,
@@ -28,7 +28,7 @@ machines = {
"mem" : "4096" "mem" : "4096"
# The size of the storage in GB # The size of the storage in GB
"disk_size" : 250 "disk_size" : 250
"additional_disks" : {} "additional_disks": {}
}, },
"worker-0" : { "worker-0" : {
"node_type" : "worker", "node_type" : "worker",
@@ -40,7 +40,7 @@ machines = {
"mem" : "4096" "mem" : "4096"
# The size of the storage in GB # The size of the storage in GB
"disk_size" : 250 "disk_size" : 250
"additional_disks" : { "additional_disks": {
# "some-disk-name-1": { # "some-disk-name-1": {
# "size": 100, # "size": 100,
# "tier": "maxiops", # "tier": "maxiops",
@@ -61,7 +61,7 @@ machines = {
"mem" : "4096" "mem" : "4096"
# The size of the storage in GB # The size of the storage in GB
"disk_size" : 250 "disk_size" : 250
"additional_disks" : { "additional_disks": {
# "some-disk-name-1": { # "some-disk-name-1": {
# "size": 100, # "size": 100,
# "tier": "maxiops", # "tier": "maxiops",
@@ -82,7 +82,7 @@ machines = {
"mem" : "4096" "mem" : "4096"
# The size of the storage in GB # The size of the storage in GB
"disk_size" : 250 "disk_size" : 250
"additional_disks" : { "additional_disks": {
# "some-disk-name-1": { # "some-disk-name-1": {
# "size": 100, # "size": 100,
# "tier": "maxiops", # "tier": "maxiops",
@@ -118,7 +118,7 @@ master_allowed_ports = []
worker_allowed_ports = [] worker_allowed_ports = []
loadbalancer_enabled = false loadbalancer_enabled = false
loadbalancer_plan = "development" loadbalancer_plan = "development"
loadbalancers = { loadbalancers = {
# "http" : { # "http" : {
# "port" : 80, # "port" : 80,
@@ -134,9 +134,9 @@ loadbalancers = {
server_groups = { server_groups = {
# "control-plane" = { # "control-plane" = {
# servers = [ # servers = [
# "control-plane-0" # "master-0"
# ] # ]
# anti_affinity_policy = "strict" # anti_affinity = true
# }, # },
# "workers" = { # "workers" = {
# servers = [ # servers = [
@@ -144,6 +144,6 @@ server_groups = {
# "worker-1", # "worker-1",
# "worker-2" # "worker-2"
# ] # ]
# anti_affinity_policy = "yes" # anti_affinity = true
# } # }
} }

Some files were not shown because too many files have changed in this diff Show More