Source code for saltext.kubernetes.modules.kubeadm

"""
Module for kubeadm
:maintainer:    Alberto Planas <aplanas@suse.com>
:maturity:      new
:depends:       None
:platform:      Linux
"""

import json
import logging
import re

import salt.utils.files
from salt.exceptions import CommandExecutionError

ADMIN_CFG = "/etc/kubernetes/admin.conf"

log = logging.getLogger(__name__)

__virtualname__ = "kubeadm"

# Define not exported variables from Salt, so this can be imported as
# a normal module
try:
    __salt__  # pylint:disable=used-before-assignment
except NameError:
    __salt__ = {}


def _api_server_endpoint(config=None):
    """
    Return the API server endpoint
    """
    config = config if config else ADMIN_CFG
    endpoint = None
    try:
        with salt.utils.files.fopen(config, "r") as fp_:
            endpoint = re.search(r"^\s*server: https?://(.*)$", fp_.read(), re.MULTILINE).group(1)
    except Exception:  # pylint:disable=broad-except
        # Any error or exception is mapped to None
        pass
    return endpoint


def _token(create_if_needed=False):
    """
    Return a valid bootstrap token
    """
    tokens = token_list()
    if not tokens and create_if_needed:
        token_create(description="Token created by kubeadm salt module")
        tokens = token_list()
    # We expect that the token is valid for authentication and signing
    return tokens[0]["token"] if tokens else None


def _discovery_token_ca_cert_hash():
    cmd = [
        "openssl",
        "x509",
        "-pubkey",
        "-in",
        "/etc/kubernetes/pki/ca.crt",
        "|",
        "openssl",
        "rsa",
        "-pubin",
        "-outform",
        "der",
        "2>/dev/null",
        "|",
        "openssl",
        "dgst",
        "-sha256",
        "-hex",
        "|",
        "sed",
        "'s/^.* //'",
    ]
    result = __salt__["cmd.run_all"](" ".join(cmd), python_shell=True)
    if result["retcode"]:
        raise CommandExecutionError(result["stderr"])

    return f'sha256:{result["stdout"]}'


[docs] def join_params(create_if_needed=False): """ .. versionadded:: 3001 Return the parameters required for joining into the cluster create_if_needed If the token bucket is empty and this parameter is True, a new token will be created. CLI Example: .. code-block:: bash salt '*' kubeadm.join_params salt '*' kubeadm.join_params create_if_needed=True """ params = { "api-server-endpoint": _api_server_endpoint(), "token": _token(create_if_needed), "discovery-token-ca-cert-hash": _discovery_token_ca_cert_hash(), } return params
[docs] def version(kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Return the version of kubeadm kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.version """ cmd = ["kubeadm", "version"] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) cmd.extend(["--output", "json"]) return json.loads(__salt__["cmd.run_stdout"](cmd))
def _cmd(cmd): """Utility function to run commands.""" result = __salt__["cmd.run_all"](cmd) if result["retcode"]: raise CommandExecutionError(result["stderr"]) return result["stdout"]
[docs] def token_create( token=None, config=None, description=None, groups=None, ttl=None, usages=None, kubeconfig=None, rootfs=None, ): """ .. versionadded:: 3001 Create bootstrap tokens on the server token Token to write, if None one will be generated. The token must match a regular expression, that by default is [a-z0-9]{6}.[a-z0-9]{16} config Path to kubeadm configuration file description A human friendly description of how this token is used groups List of extra groups that this token will authenticate, default to ['system:bootstrappers:kubeadm:default-node-token'] ttl The duration defore the token is automatically deleted (1s, 2m, 3h). If set to '0' the token will never expire. Default value is 24h0m0s usages Describes the ways in which this token can be used. The default value is ['signing', 'authentication'] kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.token_create salt '*' kubeadm.token_create a1b2c.0123456789abcdef salt '*' kubeadm.token_create ttl='6h' salt '*' kubeadm.token_create usages="['signing']" """ cmd = ["kubeadm", "token", "create"] if token: cmd.append(token) parameters = [ ("config", config), ("description", description), ("groups", groups), ("ttl", ttl), ("usages", usages), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: if parameter in ("groups", "usages"): cmd.extend([f"--{parameter}", json.dumps(value)]) else: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def token_delete(token, kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Delete bootstrap tokens on the server token Token to write, if None one will be generated. The token must match a regular expression, that by default is [a-z0-9]{6}.[a-z0-9]{16} kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.token_delete a1b2c salt '*' kubeadm.token_create a1b2c.0123456789abcdef """ cmd = ["kubeadm", "token", "delete", token] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return bool(_cmd(cmd))
[docs] def token_generate(kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Generate and return a bootstrap token, but do not create it on the server kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.token_generate """ cmd = ["kubeadm", "token", "generate"] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def token_list(kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 List bootstrap tokens on the server kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.token_list """ cmd = ["kubeadm", "token", "list"] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) lines = _cmd(cmd).splitlines() tokens = [] if lines: # Find the header and parse it. We do not need to validate # the content, as the regex will take care of future changes. header = lines.pop(0) header = [i.lower() for i in re.findall(r"(\w+(?:\s\w+)*)", header)] for line in lines: # TODO(aplanas): descriptions with multiple spaces can # break the parser. values = re.findall(r"(\S+(?:\s\S+)*)", line) if len(header) != len(values): log.error("Error parsing line: '%s'", line) continue tokens.append(dict(zip(header, values))) return tokens
[docs] def alpha_certs_renew(rootfs=None): """ .. versionadded:: 3001 Renews certificates for a Kubernetes cluster rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.alpha_certs_renew """ cmd = ["kubeadm", "alpha", "certs", "renew"] parameters = [("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def alpha_kubeconfig_user( client_name, apiserver_advertise_address=None, apiserver_bind_port=None, cert_dir=None, org=None, token=None, rootfs=None, ): """ .. versionadded:: 3001 Outputs a kubeconfig file for an additional user client_name The name of the user. It will be used as the CN if client certificates are created apiserver_advertise_address The IP address the API server is accessible on apiserver_bind_port The port the API server is accessible on (default 6443) cert_dir The path where certificates are stored (default "/etc/kubernetes/pki") org The organization of the client certificate token The token that show be used as the authentication mechanism for this kubeconfig, instead of client certificates rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.alpha_kubeconfig_user client_name=user """ cmd = ["kubeadm", "alpha", "kubeconfig", "user", "--client-name", client_name] parameters = [ ("apiserver-advertise-address", apiserver_advertise_address), ("apiserver-bind-port", apiserver_bind_port), ("cert-dir", cert_dir), ("org", org), ("token", token), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def alpha_kubelet_config_download(kubeconfig=None, kubelet_version=None, rootfs=None): """ .. versionadded:: 3001 Downloads the kubelet configuration from the cluster ConfigMap kubelet-config-1.X kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf kubelet_version The desired version for the kubelet rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.alpha_kubelet_config_download salt '*' kubeadm.alpha_kubelet_config_download kubelet_version='1.14.0' """ cmd = ["kubeadm", "alpha", "kubelet", "config", "download"] parameters = [ ("kubeconfig", kubeconfig), ("kubelet-version", kubelet_version), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def alpha_kubelet_config_enable_dynamic( node_name, kubeconfig=None, kubelet_version=None, rootfs=None ): """ .. versionadded:: 3001 Enables or updates dynamic kubelet configuration for a node node_name Name of the node that should enable the dynamic kubelet configuration kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf kubelet_version The desired version for the kubelet rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.alpha_kubelet_config_enable_dynamic node-1 """ cmd = [ "kubeadm", "alpha", "kubelet", "config", "enable-dynamic", "--node-name", node_name, ] parameters = [ ("kubeconfig", kubeconfig), ("kubelet-version", kubelet_version), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def alpha_selfhosting_pivot( cert_dir=None, config=None, kubeconfig=None, store_certs_in_secrets=False, rootfs=None, ): """ .. versionadded:: 3001 Converts a static Pod-hosted control plane into a selt-hosted one cert_dir The path where certificates are stored (default "/etc/kubernetes/pki") config Path to kubeadm configuration file kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf store_certs_in_secrets Enable storing certs in secrets rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.alpha_selfhost_pivot """ cmd = ["kubeadm", "alpha", "selfhosting", "pivot", "--force"] if store_certs_in_secrets: cmd.append("--store-certs-in-secrets") parameters = [ ("cert-dir", cert_dir), ("config", config), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_images_list( config=None, feature_gates=None, kubernetes_version=None, kubeconfig=None, rootfs=None, ): """ .. versionadded:: 3001 Print a list of images kubeadm will use config Path to kubeadm configuration file feature_gates A set of key=value pairs that describe feature gates for various features kubernetes_version Choose a specifig Kubernetes version for the control plane (default "stable-1") kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_images_list """ cmd = ["kubeadm", "config", "images", "list"] parameters = [ ("config", config), ("feature-gates", feature_gates), ("kubernetes-version", kubernetes_version), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd).splitlines()
[docs] def config_images_pull( config=None, cri_socket=None, feature_gates=None, kubernetes_version=None, kubeconfig=None, rootfs=None, ): """ .. versionadded:: 3001 Pull images used by kubeadm config Path to kubeadm configuration file cri_socket Path to the CRI socket to connect feature_gates A set of key=value pairs that describe feature gates for various features kubernetes_version Choose a specifig Kubernetes version for the control plane (default "stable-1") kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_images_pull """ cmd = ["kubeadm", "config", "images", "pull"] parameters = [ ("config", config), ("cri-socket", cri_socket), ("feature-gates", feature_gates), ("kubernetes-version", kubernetes_version), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) prefix = "[config/images] Pulled " return [(line.replace(prefix, "")) for line in _cmd(cmd).splitlines()]
[docs] def config_migrate(old_config, new_config=None, kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Read an older version of the kubeadm configuration API types from a file, and output the similar config object for the newer version old_config Path to the kubeadm config file that is usin the old API version and should be converted new_config Path to the resulting equivalent kubeadm config file using the new API version. If not specified the output will be returned kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_migrate /oldconfig.cfg """ cmd = ["kubeadm", "config", "migrate", "--old-config", old_config] parameters = [ ("new-config", new_config), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_print_init_defaults(component_configs=None, kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Return default init configuration, that can be used for 'kubeadm init' component_config A comma-separated list for component config API object to print the default values for (valid values: KubeProxyConfiguration, KubeletConfiguration) kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_print_init_defaults """ cmd = ["kubeadm", "config", "print", "init-defaults"] parameters = [ ("component-configs", component_configs), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_print_join_defaults(component_configs=None, kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Return default join configuration, that can be used for 'kubeadm join' component_config A comma-separated list for component config API object to print the default values for (valid values: KubeProxyConfiguration, KubeletConfiguration) kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_print_join_defaults """ cmd = ["kubeadm", "config", "print", "join-defaults"] parameters = [ ("component-configs", component_configs), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_upload_from_file(config, kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 Upload a configuration file to the in-cluster ConfigMap for kubeadm configuration config Path to a kubeadm configuration file kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_upload_from_file /config.cfg """ cmd = ["kubeadm", "config", "upload", "from-file", "--config", config] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_upload_from_flags( apiserver_advertise_address=None, apiserver_bind_port=None, apiserver_cert_extra_sans=None, cert_dir=None, cri_socket=None, feature_gates=None, kubernetes_version=None, node_name=None, pod_network_cidr=None, service_cidr=None, service_dns_domain=None, kubeconfig=None, rootfs=None, ): """ .. versionadded:: 3001 Create the in-cluster configuration file for the first time using flags apiserver_advertise_address The IP address the API server will advertise it's listening on apiserver_bind_port The port the API server is accessible on (default 6443) apiserver_cert_extra_sans Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate cert_dir The path where to save and store the certificates (default "/etc/kubernetes/pki") cri_socket Path to the CRI socket to connect feature_gates A set of key=value pairs that describe feature gates for various features kubernetes_version Choose a specifig Kubernetes version for the control plane (default "stable-1") node_name Specify the node name pod_network_cidr Specify range of IP addresses for the pod network service_cidr Use alternative range of IP address for service VIPs (default "10.96.0.0/12") service_dns_domain Use alternative domain for services (default "cluster.local") kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_upload_from_flags """ cmd = ["kubeadm", "config", "upload", "from-flags"] parameters = [ ("apiserver-advertise-address", apiserver_advertise_address), ("apiserver-bind-port", apiserver_bind_port), ("apiserver-cert-extra-sans", apiserver_cert_extra_sans), ("cert-dir", cert_dir), ("cri-socket", cri_socket), ("feature-gates", feature_gates), ("kubernetes-version", kubernetes_version), ("node-name", node_name), ("pod-network-cidr", pod_network_cidr), ("service-cidr", service_cidr), ("service-dns-domain", service_dns_domain), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def config_view(kubeconfig=None, rootfs=None): """ .. versionadded:: 3001 View the kubeadm configuration stored inside the cluster kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.config_view """ cmd = ["kubeadm", "config", "view"] parameters = [("kubeconfig", kubeconfig), ("rootfs", rootfs)] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
[docs] def init( apiserver_advertise_address=None, apiserver_bind_port=None, apiserver_cert_extra_sans=None, cert_dir=None, certificate_key=None, control_plane_endpoint=None, config=None, cri_socket=None, experimental_upload_certs=False, upload_certs=False, feature_gates=None, ignore_preflight_errors=None, image_repository=None, kubernetes_version=None, node_name=None, pod_network_cidr=None, service_cidr=None, service_dns_domain=None, skip_certificate_key_print=False, skip_phases=None, skip_token_print=False, token=None, token_ttl=None, rootfs=None, ): """ .. versionadded:: 3001 Command to set up the Kubernetes control plane apiserver_advertise_address The IP address the API server will advertise it's listening on apiserver_bind_port The port the API server is accessible on (default 6443) apiserver_cert_extra_sans Optional extra Subject Alternative Names (SANs) to use for the API Server serving certificate cert_dir The path where to save and store the certificates (default "/etc/kubernetes/pki") certificate_key Key used to encrypt the control-plane certificates in the kubeadm-certs Secret config Path to a kubeadm configuration file control_plane_endpoint Specify a stable IP address or DNS name for the control plane cri_socket Path to the CRI socket to connect experimental_upload_certs Upload control-plane certificate to the kubeadm-certs Secret. ( kubeadm version =< 1.16 ) upload_certs Upload control-plane certificate to the kubeadm-certs Secret. ( kubeadm version > 1.16 ) feature_gates A set of key=value pairs that describe feature gates for various features ignore_preflight_errors A list of checks whose errors will be shown as warnings image_repository Choose a container registry to pull control plane images from kubernetes_version Choose a specifig Kubernetes version for the control plane (default "stable-1") node_name Specify the node name pod_network_cidr Specify range of IP addresses for the pod network service_cidr Use alternative range of IP address for service VIPs (default "10.96.0.0/12") service_dns_domain Use alternative domain for services (default "cluster.local") skip_certificate_key_print Don't print the key used to encrypt the control-plane certificates skip_phases List of phases to be skipped skip_token_print Skip printing of the default bootstrap token generated by 'kubeadm init' token The token to use for establishing bidirectional trust between nodes and control-plane nodes. The token must match a regular expression, that by default is [a-z0-9]{6}.[a-z0-9]{16} token_ttl The duration defore the token is automatically deleted (1s, 2m, 3h). If set to '0' the token will never expire. Default value is 24h0m0s rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.init pod_network_cidr='10.244.0.0/16' """ cmd = ["kubeadm", "init"] if experimental_upload_certs: cmd.append("--experimental-upload-certs") if upload_certs: cmd.append("--upload-certs") if skip_certificate_key_print: cmd.append("--skip-certificate-key-print") if skip_token_print: cmd.append("--skip-token-print") parameters = [ ("apiserver-advertise-address", apiserver_advertise_address), ("apiserver-bind-port", apiserver_bind_port), ("apiserver-cert-extra-sans", apiserver_cert_extra_sans), ("cert-dir", cert_dir), ("certificate-key", certificate_key), ("config", config), ("control-plane-endpoint", control_plane_endpoint), ("cri-socket", cri_socket), ("feature-gates", feature_gates), ("ignore-preflight-errors", ignore_preflight_errors), ("image-repository", image_repository), ("kubernetes-version", kubernetes_version), ("node-name", node_name), ("pod-network-cidr", pod_network_cidr), ("service-cidr", service_cidr), ("service-dns-domain", service_dns_domain), ("skip-phases", skip_phases), ("token", token), ("token-ttl", token_ttl), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
# TODO(aplanas): # * init_phase_addon_all # * init_phase_addon_coredns # * init_phase_addon_kube_proxy # * init_phase_bootstrap_token # * init_phase_certs_all # * init_phase_certs_apiserver # * init_phase_certs_apiserver_etcd_client # * init_phase_certs_apiserver_kubelet_client # * init_phase_certs_ca # * init_phase_certs_etcd_ca # * init_phase_certs_etcd_healthcheck_client # * init_phase_certs_etcd_peer # * init_phase_certs_etcd_server # * init_phase_certs_front_proxy_ca # * init_phase_certs_front_proxy_client # * init_phase_certs_sa # * init_phase_control_plane_all # * init_phase_control_plane_apiserver # * init_phase_control_plane_controller_manager # * init_phase_control_plane_scheduler # * init_phase_etcd_local # * init_phase_kubeconfig_admin # * init_phase_kubeconfig_all # * init_phase_kubeconfig_controller_manager # * init_phase_kubeconfig_kubelet # * init_phase_kubeconfig_scheduler # * init_phase_kubelet_start # * init_phase_mark_control_plane # * init_phase_preflight # * init_phase_upload_certs # * init_phase_upload_config_all # * init_phase_upload_config_kuneadm # * init_phase_upload_config_kubelet
[docs] def join( api_server_endpoint=None, apiserver_advertise_address=None, apiserver_bind_port=None, certificate_key=None, config=None, cri_socket=None, discovery_file=None, discovery_token=None, discovery_token_ca_cert_hash=None, discovery_token_unsafe_skip_ca_verification=False, experimental_control_plane=False, control_plane=False, ignore_preflight_errors=None, node_name=None, skip_phases=None, tls_bootstrap_token=None, token=None, rootfs=None, ): """ .. versionadded:: 3001 Command to join to an existing cluster api_server_endpoint IP address or domain name and port of the API Server apiserver_advertise_address If the node should host a new control plane instance, the IP address the API Server will advertise it's listening on apiserver_bind_port If the node should host a new control plane instance, the port the API Server to bind to (default 6443) certificate_key Use this key to decrypt the certificate secrets uploaded by init config Path to a kubeadm configuration file cri_socket Path to the CRI socket to connect discovery_file For file-based discovery, a file or URL from which to load cluster information discovery_token For token-based discovery, the token used to validate cluster information fetched from the API Server discovery_token_ca_cert_hash For token-based discovery, validate that the root CA public key matches this hash (format: "<type>:<value>") discovery_token_unsafe_skip_ca_verification For token-based discovery, allow joining without 'discovery-token-ca-cert-hash' pinning experimental_control_plane Create a new control plane instance on this node (kubeadm version =< 1.16) control_plane Create a new control plane instance on this node (kubeadm version > 1.16) ignore_preflight_errors A list of checks whose errors will be shown as warnings node_name Specify the node name skip_phases List of phases to be skipped tls_bootstrap_token Specify the token used to temporarily authenticate with the Kubernetes Control Plane while joining the node token Use this token for both discovery-token and tls-bootstrap-token when those values are not provided rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.join 10.160.65.165:6443 token='token' """ cmd = ["kubeadm", "join"] if api_server_endpoint: cmd.append(api_server_endpoint) if discovery_token_unsafe_skip_ca_verification: cmd.append("--discovery-token-unsafe-skip-ca-verification") if experimental_control_plane: cmd.append("--experimental-control-plane") if control_plane: cmd.append("--control-plane") parameters = [ ("apiserver-advertise-address", apiserver_advertise_address), ("apiserver-bind-port", apiserver_bind_port), ("certificate-key", certificate_key), ("config", config), ("cri-socket", cri_socket), ("discovery-file", discovery_file), ("discovery-token", discovery_token), ("discovery-token-ca-cert-hash", discovery_token_ca_cert_hash), ("ignore-preflight-errors", ignore_preflight_errors), ("node-name", node_name), ("skip-phases", skip_phases), ("tls-bootstrap-token", tls_bootstrap_token), ("token", token), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
# TODO(aplanas): # * join_phase_control_plane_join_all # * join_phase_control_plane_join_etcd # * join_phase_control_plane_join_mark_control_plane # * join_phase_control_plane_join_update_status # * join_phase_control_plane_prepare_all # * join_phase_control_plane_prepare_certs # * join_phase_control_plane_prepare_control_plane # * join_phase_control_plane_prepare_download_certs # * join_phase_control_plane_prepare_kubeconfig # * join_phase_kubelet_start # * join_phase_preflight
[docs] def reset( cert_dir=None, cri_socket=None, ignore_preflight_errors=None, kubeconfig=None, rootfs=None, ): """ .. versionadded:: 3001 Revert any changes made to this host by 'kubeadm init' or 'kubeadm join' cert_dir The path to the directory where the certificates are stored (default "/etc/kubernetes/pki") cri_socket Path to the CRI socket to connect ignore_preflight_errors A list of checks whose errors will be shown as warnings kubeconfig The kubeconfig file to use when talking to the cluster. The default values in /etc/kubernetes/admin.conf rootfs The path to the real host root filesystem CLI Example: .. code-block:: bash salt '*' kubeadm.join 10.160.65.165:6443 token='token' """ cmd = ["kubeadm", "reset", "--force"] parameters = [ ("cert-dir", cert_dir), ("cri-socket", cri_socket), ("ignore-preflight-errors", ignore_preflight_errors), ("kubeconfig", kubeconfig), ("rootfs", rootfs), ] for parameter, value in parameters: if value: cmd.extend([f"--{parameter}", str(value)]) return _cmd(cmd)
# TODO(aplanas): # * upgrade_apply # * upgrade_diff # * upgrade_node # * upgrade_plan