Kubernetes 1.20 breaking changes
There is a small point in the Release Notes of Kubernetes 1.20 which could break a cluster that using Metallb and/or NFS client provisioner.
A feature called selfLink (which is deprecated since 1.16) will finally be removed in 1.21 and needs to be activated manually for Version 1.20 by a feature-gate switch of the kube-apiserver.
Add the following switch to kube-apiserver.yaml:
- --feature-gates=RemoveSelfLink=false
This setting will be overwritten with Kubernetes version upgrades. To keep the setting during upgrade, modify the kubeadm-config configMap in the kube-system namespace and add the following line to the 'extraArgs:' section:
feature-gates: RemoveSelfLink=false
Keep in mind that this is only a workaround and won't work anymore with Kubernetes 1.21. The only solution is to wait and hope that affected applications and Kubernetes extensions are updated to the actual Kubernetes API and Go version.
Some background information:
After investigating this problem a bit deeper, I realized that some of the affected extensions using old Kubernetes API references which itself base on old versions of the Go programming language.
The problems are already adressed with issues in Github here and here.
Based on a PR by petermicuch I pulled an own fork of the nfs-subdir-external-provisioner with full CI pipeline. It automatically creates a multi-platform Docker image on Docker hub at: groundhog2k/nfs-subdir-external-provisioner Tags - Docker Hub.
This image works for Kubernetes >= 1.19 and will bring back full compatibility without having to set an additional feature-gate switch.
At the moment I'm working at a similar update for MetallLB - which is a bit harder because of internal dependencies in the code.
Stay tuned...
:-)
UPDATE
MetallLB (>=0.96) and also the nfs-subdir-external-provisioner (>=0.4.0) were updated and now fully support the newer Kubernetes API >=1.20.