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:
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:
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.
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.
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.