mirror of
https://github.com/kubernetes-sigs/kubespray.git
synced 2026-02-28 09:39:12 +03:00
Ensure correct AuthorizationConfiguration API version during upgrades (#12058)
* Ensure correct `AuthorizationConfiguration` API version during upgrades Fixes an issue where the wrong AuthorizationConfiguration API version could be used by kube-apiserver prematurely during upgrades. The `kubernets/control-plane` role writes configuration for the target version before control plane pods are upgraded. However, since the `AuthorizationConfiguration` file is reconciled continuously, this leads to a race condition where a new configuration version can be reconciled before kube-apiserver is upgraded to the compatible version. This solution ensures the correct configuration is available throughout the process by writing each api version to a different file path. Unused file versions are cleaned up post-upgrade for better hygiene. * Avoid from_json in cleanup task
This commit is contained in:
@@ -21,11 +21,11 @@
|
|||||||
- name: Create structured AuthorizationConfiguration file
|
- name: Create structured AuthorizationConfiguration file
|
||||||
copy:
|
copy:
|
||||||
content: "{{ authz_config | to_nice_yaml(indent=2, sort_keys=false) }}"
|
content: "{{ authz_config | to_nice_yaml(indent=2, sort_keys=false) }}"
|
||||||
dest: "{{ kube_config_dir }}/apiserver-authorization-config.yaml"
|
dest: "{{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml"
|
||||||
mode: "0640"
|
mode: "0640"
|
||||||
vars:
|
vars:
|
||||||
authz_config:
|
authz_config:
|
||||||
apiVersion: apiserver.config.k8s.io/{{ 'v1alpha1' if kube_version is version('1.30.0', '<') else 'v1beta1' if kube_version is version('1.32.0', '<') else 'v1' }}
|
apiVersion: apiserver.config.k8s.io/{{ kube_apiserver_authorization_config_api_version }}
|
||||||
kind: AuthorizationConfiguration
|
kind: AuthorizationConfiguration
|
||||||
authorizers: "{{ kube_apiserver_authorization_config_authorizers }}"
|
authorizers: "{{ kube_apiserver_authorization_config_authorizers }}"
|
||||||
when: kube_apiserver_use_authorization_config_file
|
when: kube_apiserver_use_authorization_config_file
|
||||||
@@ -105,6 +105,13 @@
|
|||||||
- name: Include kubeadm secondary server apiserver fixes
|
- name: Include kubeadm secondary server apiserver fixes
|
||||||
include_tasks: kubeadm-fix-apiserver.yml
|
include_tasks: kubeadm-fix-apiserver.yml
|
||||||
|
|
||||||
|
- name: Cleanup unused AuthorizationConfiguration file versions
|
||||||
|
file:
|
||||||
|
path: "{{ kube_config_dir }}/apiserver-authorization-config-{{ item }}.yaml"
|
||||||
|
state: absent
|
||||||
|
loop: "{{ ['v1alpha1', 'v1beta1', 'v1'] | reject('equalto', kube_apiserver_authorization_config_api_version) | list }}"
|
||||||
|
when: kube_apiserver_use_authorization_config_file
|
||||||
|
|
||||||
- name: Include kubelet client cert rotation fixes
|
- name: Include kubelet client cert rotation fixes
|
||||||
include_tasks: kubelet-fix-client-cert-rotation.yml
|
include_tasks: kubelet-fix-client-cert-rotation.yml
|
||||||
when: kubelet_rotate_certificates
|
when: kubelet_rotate_certificates
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ apiServer:
|
|||||||
anonymous-auth: "{{ kube_api_anonymous_auth }}"
|
anonymous-auth: "{{ kube_api_anonymous_auth }}"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kube_apiserver_use_authorization_config_file %}
|
{% if kube_apiserver_use_authorization_config_file %}
|
||||||
authorization-config: "{{ kube_config_dir }}/apiserver-authorization-config.yaml"
|
authorization-config: "{{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml"
|
||||||
{% else %}
|
{% else %}
|
||||||
authorization-mode: {{ authorization_modes | join(',') }}
|
authorization-mode: {{ authorization_modes | join(',') }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@@ -249,8 +249,8 @@ apiServer:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kube_apiserver_use_authorization_config_file %}
|
{% if kube_apiserver_use_authorization_config_file %}
|
||||||
- name: authorization-config
|
- name: authorization-config
|
||||||
hostPath: {{ kube_config_dir }}/apiserver-authorization-config.yaml
|
hostPath: {{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml
|
||||||
mountPath: {{ kube_config_dir }}/apiserver-authorization-config.yaml
|
mountPath: {{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kubernetes_audit or kubernetes_audit_webhook %}
|
{% if kubernetes_audit or kubernetes_audit_webhook %}
|
||||||
- name: {{ audit_policy_name }}
|
- name: {{ audit_policy_name }}
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ apiServer:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kube_apiserver_use_authorization_config_file %}
|
{% if kube_apiserver_use_authorization_config_file %}
|
||||||
- name: authorization-config
|
- name: authorization-config
|
||||||
value: "{{ kube_config_dir }}/apiserver-authorization-config.yaml"
|
value: "{{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml"
|
||||||
{% else %}
|
{% else %}
|
||||||
- name: authorization-mode
|
- name: authorization-mode
|
||||||
value: "{{ authorization_modes | join(',') }}"
|
value: "{{ authorization_modes | join(',') }}"
|
||||||
@@ -306,8 +306,8 @@ apiServer:
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kube_apiserver_use_authorization_config_file %}
|
{% if kube_apiserver_use_authorization_config_file %}
|
||||||
- name: authorization-config
|
- name: authorization-config
|
||||||
hostPath: {{ kube_config_dir }}/apiserver-authorization-config.yaml
|
hostPath: {{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml
|
||||||
mountPath: {{ kube_config_dir }}/apiserver-authorization-config.yaml
|
mountPath: {{ kube_config_dir }}/apiserver-authorization-config-{{ kube_apiserver_authorization_config_api_version }}.yaml
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if kubernetes_audit or kubernetes_audit_webhook %}
|
{% if kubernetes_audit or kubernetes_audit_webhook %}
|
||||||
- name: {{ audit_policy_name }}
|
- name: {{ audit_policy_name }}
|
||||||
|
|||||||
@@ -506,6 +506,7 @@ authorization_modes: ['Node', 'RBAC']
|
|||||||
## Examples: https://kubernetes.io/blog/2024/04/26/multi-webhook-and-modular-authorization-made-much-easier/
|
## 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
|
## KEP: https://github.com/kubernetes/enhancements/tree/master/keps/sig-auth/3221-structured-authorization-configuration
|
||||||
kube_apiserver_use_authorization_config_file: false
|
kube_apiserver_use_authorization_config_file: false
|
||||||
|
kube_apiserver_authorization_config_api_version: "{{ 'v1alpha1' if kube_version is version('1.30.0', '<') else 'v1beta1' if kube_version is version('1.32.0', '<') else 'v1' }}"
|
||||||
kube_apiserver_authorization_config_authorizers:
|
kube_apiserver_authorization_config_authorizers:
|
||||||
- type: Node
|
- type: Node
|
||||||
name: node
|
name: node
|
||||||
|
|||||||
Reference in New Issue
Block a user