mirror of
https://github.com/kubernetes-sigs/kubespray.git
synced 2026-01-09 23:12:10 -03:30
Adds the ability to configure the Kubernetes API server with a structured authorization configuration file. Structured AuthorizationConfiguration is a new feature in Kubernetes v1.29+ (GA in v1.32) that configures the API server's authorization modes with a structured configuration file. AuthorizationConfiguration files offer features not available with the `--authorization-mode` flag, although Kubespray supports both methods and authorization-mode remains the default for now. Note: Because the `--authorization-config` and `--authorization-mode` flags are mutually exclusive, the `authorization_modes` ansible variable is ignored when `kube_apiserver_use_authorization_config_file` is set to true. The two features cannot be used at the same time. Docs: https://kubernetes.io/docs/reference/access-authn-authz/authorization/#configuring-the-api-server-using-an-authorization-config-file Blog + Examples: https://kubernetes.io/blog/2024/04/26/multi-webhook-and-modular-authorization-made-much-easier/ KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3221-structured-authorization-configuration I tested this all the way back to k8s v1.29 when AuthorizationConfiguration was first introduced as an alpha feature, although v1.29 required some additional workarounds with `kubeadm_patches`, which I included in example comments. I also included some example comments with CEL expressions that allowed me to configure webhook authorizers without hitting kubeadm 1.29+ issues that block cluster creation and upgrades such as this one: https://github.com/kubernetes/cloud-provider-openstack/issues/2575. My workaround configures the webhook to ignore requests from kubeadm and system components, which prevents fatal errors from webhooks that are not available yet, and should be authorized by Node or RBAC anyway.
139 lines
4.3 KiB
YAML
139 lines
4.3 KiB
YAML
---
|
|
- name: Pre-upgrade control plane
|
|
import_tasks: pre-upgrade.yml
|
|
tags:
|
|
- k8s-pre-upgrade
|
|
|
|
- name: Create webhook token auth config
|
|
template:
|
|
src: webhook-token-auth-config.yaml.j2
|
|
dest: "{{ kube_config_dir }}/webhook-token-auth-config.yaml"
|
|
mode: "0640"
|
|
when: kube_webhook_token_auth | default(false)
|
|
|
|
- name: Create webhook authorization config
|
|
template:
|
|
src: webhook-authorization-config.yaml.j2
|
|
dest: "{{ kube_config_dir }}/webhook-authorization-config.yaml"
|
|
mode: "0640"
|
|
when: kube_webhook_authorization | default(false)
|
|
|
|
- name: Create structured AuthorizationConfiguration file
|
|
copy:
|
|
content: "{{ authz_config | to_nice_yaml(indent=2, sort_keys=false) }}"
|
|
dest: "{{ kube_config_dir }}/apiserver-authorization-config.yaml"
|
|
mode: "0640"
|
|
vars:
|
|
authz_config:
|
|
apiVersion: apiserver.config.k8s.io/{{ 'v1alpha1' if kube_version is version('v1.30.0', '<') else 'v1beta1' if kube_version is version('v1.32.0', '<') else 'v1' }}
|
|
kind: AuthorizationConfiguration
|
|
authorizers: "{{ kube_apiserver_authorization_config_authorizers }}"
|
|
when: kube_apiserver_use_authorization_config_file
|
|
|
|
- name: Create kube-scheduler config
|
|
template:
|
|
src: kubescheduler-config.yaml.j2
|
|
dest: "{{ kube_config_dir }}/kubescheduler-config.yaml"
|
|
mode: "0644"
|
|
|
|
- name: Apply Kubernetes encrypt at rest config
|
|
import_tasks: encrypt-at-rest.yml
|
|
when:
|
|
- kube_encrypt_secret_data
|
|
tags:
|
|
- kube-apiserver
|
|
|
|
- name: Install | Copy kubectl binary from download dir
|
|
copy:
|
|
src: "{{ downloads.kubectl.dest }}"
|
|
dest: "{{ bin_dir }}/kubectl"
|
|
mode: "0755"
|
|
remote_src: true
|
|
tags:
|
|
- kubectl
|
|
- upgrade
|
|
|
|
- name: Install kubectl bash completion
|
|
shell: "{{ bin_dir }}/kubectl completion bash >/etc/bash_completion.d/kubectl.sh"
|
|
when: ansible_os_family in ["Debian","RedHat", "Suse"]
|
|
tags:
|
|
- kubectl
|
|
ignore_errors: true # noqa ignore-errors
|
|
|
|
- name: Set kubectl bash completion file permissions
|
|
file:
|
|
path: /etc/bash_completion.d/kubectl.sh
|
|
owner: root
|
|
group: root
|
|
mode: "0755"
|
|
when: ansible_os_family in ["Debian","RedHat", "Suse"]
|
|
tags:
|
|
- kubectl
|
|
- upgrade
|
|
ignore_errors: true # noqa ignore-errors
|
|
|
|
- name: Set bash alias for kubectl
|
|
blockinfile:
|
|
path: /etc/bash_completion.d/kubectl.sh
|
|
block: |-
|
|
alias {{ kubectl_alias }}=kubectl
|
|
if [[ $(type -t compopt) = "builtin" ]]; then
|
|
complete -o default -F __start_kubectl {{ kubectl_alias }}
|
|
else
|
|
complete -o default -o nospace -F __start_kubectl {{ kubectl_alias }}
|
|
fi
|
|
state: present
|
|
marker: "# Ansible entries {mark}"
|
|
when:
|
|
- ansible_os_family in ["Debian","RedHat", "Suse"]
|
|
- kubectl_alias is defined and kubectl_alias != ""
|
|
tags:
|
|
- kubectl
|
|
- upgrade
|
|
ignore_errors: true # noqa ignore-errors
|
|
|
|
- name: Define nodes already joined to existing cluster and first_kube_control_plane
|
|
import_tasks: define-first-kube-control.yml
|
|
|
|
- name: Include kubeadm setup
|
|
import_tasks: kubeadm-setup.yml
|
|
|
|
- name: Include kubeadm etcd extra tasks
|
|
include_tasks: kubeadm-etcd.yml
|
|
when: etcd_deployment_type == "kubeadm"
|
|
|
|
- name: Include kubeadm secondary server apiserver fixes
|
|
include_tasks: kubeadm-fix-apiserver.yml
|
|
|
|
- name: Include kubelet client cert rotation fixes
|
|
include_tasks: kubelet-fix-client-cert-rotation.yml
|
|
when: kubelet_rotate_certificates
|
|
|
|
- name: Install script to renew K8S control plane certificates
|
|
template:
|
|
src: k8s-certs-renew.sh.j2
|
|
dest: "{{ bin_dir }}/k8s-certs-renew.sh"
|
|
mode: "0755"
|
|
|
|
- name: Renew K8S control plane certificates monthly 1/2
|
|
template:
|
|
src: "{{ item }}.j2"
|
|
dest: "/etc/systemd/system/{{ item }}"
|
|
mode: "0644"
|
|
validate: "sh -c '[ -f /usr/bin/systemd/system/factory-reset.target ] || exit 0 && systemd-analyze verify %s:{{item}}'"
|
|
# FIXME: check that systemd version >= 250 (factory-reset.target was introduced in that release)
|
|
# Remove once we drop support for systemd < 250
|
|
with_items:
|
|
- k8s-certs-renew.service
|
|
- k8s-certs-renew.timer
|
|
register: k8s_certs_units
|
|
when: auto_renew_certificates
|
|
|
|
- name: Renew K8S control plane certificates monthly 2/2
|
|
systemd_service:
|
|
name: k8s-certs-renew.timer
|
|
enabled: true
|
|
state: started
|
|
daemon_reload: "{{ k8s_certs_units is changed }}"
|
|
when: auto_renew_certificates
|