Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -1792,21 +1792,26 @@ Here's the list of typical variables that can be used (you can list them with `k
|ingress_ip |None ||
|ctlplanes |1 |number of ctlplane|
|workers |0 |number of workers|
|arbiters |0 |number of arbiters (TNA topology, requires ctlplanes=2)|
|network_type |OVNKubernetes ||
|pool |default ||
|flavor |None ||
|flavor_bootstrap |None ||
|flavor_ctlplane |None ||
|flavor_worker |None ||
|flavor_arbiter |None ||
|numcpus |4 ||
|bootstrap_numcpus |None ||
|ctlplane_numcpus |None ||
|worker_numcpus |None ||
|arbiter_numcpus |2 ||
|memory |8192 ||
|bootstrap_memory |None ||
|ctlplane_memory |None ||
|worker_memory |None ||
|arbiter_memory |8192 ||
|disk_size |30 |disk size in Gb for final nodes|
|arbiter_disk_size |None ||
|extra_disks |[] ||
|disconnected_url |None ||
|disconnected_user |None ||
Expand Down
17 changes: 14 additions & 3 deletions kvirt/cluster/openshift/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ def update_registry(config, plandir, cluster, data):
patch_oc_mirror(clusterdir)


def create_ignition_files(config, plandir, cluster, domain, api_ip=None, bucket_url=None, ignition_version=None):
def create_ignition_files(config, plandir, cluster, domain, api_ip=None, bucket_url=None, ignition_version=None,
arbiters=0):
clusterdir = os.path.expanduser(f"~/.kcli/clusters/{cluster}")
ignition_overrides = {'api_ip': api_ip, 'cluster': cluster, 'domain': domain, 'role': 'master'}
ctlplane_ignition = config.process_inputfile(cluster, f"{plandir}/ignition.j2", overrides=ignition_overrides)
Expand All @@ -144,6 +145,12 @@ def create_ignition_files(config, plandir, cluster, domain, api_ip=None, bucket_
worker_ignition = config.process_inputfile(cluster, f"{plandir}/ignition.j2", overrides=ignition_overrides)
with open(f"{clusterdir}/worker.ign", 'w') as f:
f.write(worker_ignition)
if arbiters > 0:
ignition_overrides['role'] = 'arbiter'
arbiter_ignition = config.process_inputfile(cluster, f"{plandir}/ignition.j2", overrides=ignition_overrides)
with open(f"{clusterdir}/arbiter.ign", 'w') as f:
f.write(arbiter_ignition)
del ignition_overrides['role']
if bucket_url is not None:
if config.type == 'openstack':
ignition_overrides['ca_file'] = config.k.ca_file
Expand Down Expand Up @@ -584,7 +591,8 @@ def scale(config, plandir, cluster, overrides):
return {'result': 'failure', 'reason': "Missing domain..."}
os.mkdir(clusterdir)
ignition_version = overrides['ignition_version']
create_ignition_files(config, plandir, cluster, domain, api_ip=api_ip, ignition_version=ignition_version)
create_ignition_files(config, plandir, cluster, domain, api_ip=api_ip, ignition_version=ignition_version,
arbiters=overrides.get('arbiters', 0))
if storedparameters and os.path.exists(f"{clusterdir}/kcli_parameters.yml"):
with open(f"{clusterdir}/kcli_parameters.yml", 'r') as install:
installparam = safe_load(install)
Expand Down Expand Up @@ -663,6 +671,9 @@ def create(config, plandir, cluster, overrides, dnsconfig=None):
workers = data['workers']
if workers < 0:
return {'result': 'failure', 'reason': f"Invalid number of workers {workers}"}
arbiters = data.get('arbiters', 0)
if arbiters > 0 and ctlplanes != 2:
return {'result': 'failure', 'reason': "TNA topology requires exactly 2 control plane nodes"}
if data['dual_api_ip'] is not None:
warning("Forcing dualstack")
data['dualstack'] = True
Expand Down Expand Up @@ -1607,7 +1618,7 @@ def create(config, plandir, cluster, overrides, dnsconfig=None):
ignition_version = json.load(f)['ignition']['version']
installparam['ignition_version'] = ignition_version
create_ignition_files(config, plandir, cluster, domain, api_ip=api_ip, bucket_url=bucket_url,
ignition_version=ignition_version)
ignition_version=ignition_version, arbiters=arbiters)
backup_paramfile(config.client, installparam, clusterdir, cluster, plan, image, dnsconfig)
if provider in virt_providers:
if provider == 'vsphere':
Expand Down
41 changes: 41 additions & 0 deletions kvirt/cluster/openshift/ctlplanes.yml
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,44 @@
extra_files: {{ files }}
{% endif %}
{% endfor %}
{% for num in range(0, arbiters|int) %}

{{ cluster }}-arbiter-{{ num }}:
domain: {{ domain }}
image: {{ image }}
pool: {{ pool or config_pool }}
enableroot: false
notify: false
flavor: {{ flavor_arbiter or flavor }}
keys: {{ keys }}
numcpus: {{ arbiter_numcpus | default(bootstrap_numcpus) }}
memory: {{ arbiter_memory | default(bootstrap_memory) }}
autostart: {{ autostart }}
{% if kvm_forcestack %}
cmdline: {{ 'ip=dhcp6' if ':' in api_ip else 'ip=dhcp' }}
{% endif %}
{% if kubevirt_api_service %}
reservedns: true
{% endif %}
nets: {{ [network] + extra_networks }}
disks: {{ [arbiter_disk_size | default(disk_size, true)] }}
{% if coredns or ipv6 %}
files:
{% if coredns %}
- path: /etc/NetworkManager/dispatcher.d/99-kcli-forcedns
origin: 99-kcli-forcedns
mode: 755
- path: /etc/kubernetes/manifests/coredns.yml
origin: staticpods/coredns.yml
- path: /etc/kubernetes/Corefile
origin: Corefile
{% endif %}
{% if ipv6 %}
- path: /etc/NetworkManager/conf.d/kcli-ipv6.conf
origin: kcli-ipv6.conf.j2
{% endif %}
{% endif %}
{% if files|default([]) %}
extra_files: {{ files }}
{% endif %}
{% endfor %}
7 changes: 6 additions & 1 deletion kvirt/cluster/openshift/install-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,12 @@ compute:
controlPlane:
name: master
replicas: {{ 1 if sno or sno_vm else ctlplanes }}
{% if techpreview %}
{% if arbiters > 0 %}
arbiter:
name: arbiter
replicas: {{ arbiters }}
featureSet: TechPreviewNoUpgrade
{% elif techpreview %}
featureSet: TechPreviewNoUpgrade
{% elif ctlplanes == 2 %}
fencing:
Expand Down
5 changes: 5 additions & 0 deletions kvirt/cluster/openshift/kcli_default.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ api_ip:
ingress_ip:
ctlplanes: 3
workers: 0
arbiters: 0
ctlplane_schedulable: false
fips: false
cluster: myopenshift
Expand All @@ -43,14 +44,18 @@ flavor:
flavor_bootstrap:
flavor_ctlplane:
flavor_worker:
flavor_arbiter:
numcpus: 8
bootstrap_numcpus:
ctlplane_numcpus:
worker_numcpus:
arbiter_numcpus: 2
memory: 16384
bootstrap_memory: 8192
ctlplane_memory:
worker_memory:
arbiter_memory: 8192
arbiter_disk_size:
bgp: false
bgp_peers: []
bgp_extra_peers: []
Expand Down
2 changes: 1 addition & 1 deletion kvirt/common/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1198,7 +1198,7 @@ def ignition(name, keys=[], cmds=[], nets=[], gateway=None, dns=None, domain=Non
data['passwd']['users'].append({'name': vmuser, 'sshAuthorizedKeys': publickeys,
'groups': ['sudo', 'wheel']})
role = overrides.get('role')
if len(name.split('-')) >= 3 and name.split('-')[-2] in ['ctlplane', 'worker']:
if len(name.split('-')) >= 3 and name.split('-')[-2] in ['ctlplane', 'worker', 'arbiter']:
role = name.split('-')[-2]
elif len(name.split('-')) >= 2 and name.split('-')[-1] == 'bootstrap':
role = name.split('-')[-1]
Expand Down