Skip to content
This repository was archived by the owner on Apr 25, 2023. It is now read-only.

Commit 8c31768

Browse files
authored
Merge branch 'master' into conroller_0_11_0
2 parents c22e251 + 9ec6713 commit 8c31768

File tree

37 files changed

+559
-141
lines changed

37 files changed

+559
-141
lines changed

.github/workflows/build-and-test.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ jobs:
1111

1212
- uses: actions/setup-go@v2
1313
with:
14-
go-version: '^1.17.6'
15-
14+
go-version: '~1.17'
1615
- name: Run tests
1716
run: |
1817
./hack/verify-docfiles.sh && echo "Skipping build - only doc files have changed!" || \

.github/workflows/test-and-push.yml

+1-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ jobs:
1616

1717
- uses: actions/setup-go@v2
1818
with:
19-
go-version: '^1.17.6'
20-
19+
go-version: '~1.17'
2120
- name: Run tests
2221
run: DOWNLOAD_BINARIES=y bash -x ./scripts/pre-commit.sh
2322

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Unreleased
22

3+
# v0.9.1
4+
- [#1490](https://github.com/kubernetes-sigs/kubefed/pull/1490)
5+
fix: Fix mutatingwebhookconfiguration CA cert when cert-manager is enabled
6+
37
# v0.9.0
48
- [#1460](https://github.com/kubernetes-sigs/kubefed/pull/1460)
59
feat: introduce informer cache sync timeout

charts/index.yaml

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
apiVersion: v1
22
entries:
33
kubefed:
4+
- apiVersion: v2
5+
created: "2022-02-15T10:39:01.477937005Z"
6+
dependencies:
7+
- condition: controllermanager.enabled
8+
name: controllermanager
9+
repository: https://localhost/
10+
version: 0.9.1
11+
description: KubeFed helm chart
12+
digest: a0100b39f82affb29601343214661cfebcc67c3f00fac7e38eb9983bb1359f88
13+
kubeVersion: '>= 1.16.0-0'
14+
name: kubefed
15+
urls:
16+
- https://github.com/kubernetes-sigs/kubefed/releases/download/v0.9.1/kubefed-0.9.1.tgz
17+
version: 0.9.1
418
- apiVersion: v2
519
created: "2021-11-18T10:24:18.266620592Z"
620
dependencies:
@@ -211,4 +225,4 @@ entries:
211225
urls:
212226
- https://github.com/kubernetes-sigs/kubefed/releases/download/v0.1.0-rc1/kubefed-0.1.0-rc1.tgz
213227
version: 0.1.0-rc1
214-
generated: "2021-11-18T10:24:18.264159378Z"
228+
generated: "2022-02-15T10:39:01.476784537Z"

charts/kubefed/Chart.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
apiVersion: v2
22
description: KubeFed helm chart
33
name: kubefed
4-
version: 0.0.4
4+
version: 0.0.5
55
kubeVersion: ">= 1.16.0-0"
66
dependencies:
77
- name: controllermanager
8-
version: 0.0.4
8+
version: 0.0.5
99
repository: "https://localhost/" # Required but unused.
1010
condition: controllermanager.enabled
1111

charts/kubefed/charts/controllermanager/Chart.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@ apiVersion: v2
22
appVersion: "0.8.1"
33
description: A Helm chart for KubeFed Controller Manager
44
name: controllermanager
5-
version: 0.0.4
5+
version: 0.0.5

charts/kubefed/charts/controllermanager/crds/crds.yaml

+9
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,8 @@ spec:
457457
kind: KubeFedCluster
458458
listKind: KubeFedClusterList
459459
plural: kubefedclusters
460+
shortNames:
461+
- kfc
460462
singular: kubefedcluster
461463
scope: Namespaced
462464
versions:
@@ -467,6 +469,9 @@ spec:
467469
- jsonPath: .status.conditions[?(@.type=='Ready')].status
468470
name: ready
469471
type: string
472+
- jsonPath: .status.kubernetesVersion
473+
name: kubernetes-version
474+
type: string
470475
name: v1beta1
471476
schema:
472477
openAPIV3Schema:
@@ -559,6 +564,10 @@ spec:
559564
- type
560565
type: object
561566
type: array
567+
kubernetesVersion:
568+
description: KubernetesVersion is the Kubernetes git version of the
569+
cluster.
570+
type: string
562571
region:
563572
description: Region is the name of the region in which all of the
564573
nodes in the cluster exist. e.g. 'us-east1'.

charts/kubefed/charts/controllermanager/templates/webhook.yaml

+4
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ metadata:
123123
{{- else }}
124124
name: mutation.core.kubefed.io
125125
{{- end }}
126+
annotations:
127+
{{- if .Values.certManager.enabled }}
128+
cert-manager.io/inject-ca-from: {{ printf "%s/%s%s" .Release.Namespace .Release.Name "-root-certificate" | quote }}
129+
{{- end }}
126130
webhooks:
127131
- name: kubefedconfigs.core.kubefed.io
128132
admissionReviewVersions:

cmd/controller-manager/app/leaderelection/leaderelection.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ import (
3636

3737
func NewKubeFedLeaderElector(opts *options.Options, fnStartControllers func(*options.Options, <-chan struct{})) (*leaderelection.LeaderElector, error) {
3838
const component = "kubefed-controller-manager"
39-
restclient.AddUserAgent(opts.Config.KubeConfig, "kubefed-leader-election")
40-
leaderElectionClient := kubeclient.NewForConfigOrDie(opts.Config.KubeConfig)
39+
kubeConfig := restclient.CopyConfig(opts.Config.KubeConfig)
40+
restclient.AddUserAgent(kubeConfig, "kubefed-leader-election")
41+
leaderElectionClient := kubeclient.NewForConfigOrDie(kubeConfig)
4142

4243
hostname, err := os.Hostname()
4344
if err != nil {

docs/cluster-registration.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,14 @@ Check the status of the joined clusters by using the following command.
3434
```bash
3535
kubectl -n kube-federation-system get kubefedclusters
3636

37-
NAME READY AGE
38-
cluster1 True 1m
39-
cluster2 True 1m
37+
NAME AGE READY KUBERNETES-VERSION
38+
cluster1 1m True v1.21.2
39+
cluster2 1m True v1.22.0
4040

4141
```
4242

43+
The Kubernetes version is checked periodically along with the cluster health check so that it would be automatically updated within the cluster health check period after a Kubernetes upgrade/downgrade of the cluster.
44+
4345
# Joining kind clusters on MacOS
4446

4547
A Kubernetes cluster deployed with [kind](https://sigs.k8s.io/kind) on Docker

pkg/apis/core/common/constants.go

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ const (
2424
ClusterReady ClusterConditionType = "Ready"
2525
// ClusterOffline means the cluster is temporarily down or not reachable
2626
ClusterOffline ClusterConditionType = "Offline"
27+
// ClusterConfigMalformed means the cluster's configuration may be malformed.
28+
ClusterConfigMalformed ClusterConditionType = "ConfigMalformed"
2729
)
2830

2931
const (

pkg/apis/core/v1alpha1/zz_generated.deepcopy.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/apis/core/v1beta1/kubefedcluster_types.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ type LocalSecretReference struct {
7070
type KubeFedClusterStatus struct {
7171
// Conditions is an array of current cluster conditions.
7272
Conditions []ClusterCondition `json:"conditions"`
73+
// KubernetesVersion is the Kubernetes git version of the cluster.
74+
// +optional
75+
KubernetesVersion string `json:"kubernetesVersion,omitempty"`
7376
// Zones are the names of availability zones in which the nodes of the cluster exist, e.g. 'us-east1-a'.
7477
// +optional
7578
Zones []string `json:"zones,omitempty"`
@@ -81,7 +84,8 @@ type KubeFedClusterStatus struct {
8184
// +kubebuilder:object:root=true
8285
// +kubebuilder:printcolumn:name=age,type=date,JSONPath=.metadata.creationTimestamp
8386
// +kubebuilder:printcolumn:name=ready,type=string,JSONPath=.status.conditions[?(@.type=='Ready')].status
84-
// +kubebuilder:resource:path=kubefedclusters
87+
// +kubebuilder:printcolumn:name=kubernetes-version,type=string,JSONPath=.status.kubernetesVersion
88+
// +kubebuilder:resource:path=kubefedclusters,shortName=kfc
8589
// +kubebuilder:subresource:status
8690

8791
// KubeFedCluster configures KubeFed to be aware of a Kubernetes

pkg/apis/core/v1beta1/validation/validation.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ func validateDisabledTLSValidations(disabledTLSValidations []v1beta1.TLSValidati
255255
func validateClusterCondition(cc *v1beta1.ClusterCondition, path *field.Path) field.ErrorList {
256256
var allErrs field.ErrorList
257257

258-
allErrs = append(allErrs, validateEnumStrings(path.Child("type"), string(cc.Type), []string{string(common.ClusterReady), string(common.ClusterOffline)})...)
258+
allErrs = append(allErrs, validateEnumStrings(path.Child("type"), string(cc.Type), []string{string(common.ClusterReady), string(common.ClusterOffline), string(common.ClusterConfigMalformed)})...)
259259
allErrs = append(allErrs, validateEnumStrings(path.Child("status"), string(cc.Status), []string{string(corev1.ConditionTrue), string(corev1.ConditionFalse), string(corev1.ConditionUnknown)})...)
260260

261261
if cc.LastProbeTime.IsZero() {

pkg/apis/core/v1beta1/zz_generated.deepcopy.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/apis/scheduling/v1alpha1/zz_generated.deepcopy.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/kubefedcluster/clusterclient.go

+41-17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package kubefedcluster
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"strings"
2223
"time"
2324

@@ -46,14 +47,16 @@ const (
4647
LabelZoneRegion = "failure-domain.beta.kubernetes.io/region"
4748

4849
// Common ClusterConditions for KubeFedClusterStatus
49-
ClusterReady = "ClusterReady"
50-
HealthzOk = "/healthz responded with ok"
51-
ClusterNotReady = "ClusterNotReady"
52-
HealthzNotOk = "/healthz responded without ok"
53-
ClusterNotReachableReason = "ClusterNotReachable"
54-
ClusterNotReachableMsg = "cluster is not reachable"
55-
ClusterReachableReason = "ClusterReachable"
56-
ClusterReachableMsg = "cluster is reachable"
50+
ClusterReady = "ClusterReady"
51+
HealthzOk = "/healthz responded with ok"
52+
ClusterNotReady = "ClusterNotReady"
53+
HealthzNotOk = "/healthz responded without ok"
54+
ClusterNotReachableReason = "ClusterNotReachable"
55+
ClusterNotReachableMsg = "cluster is not reachable"
56+
ClusterReachableReason = "ClusterReachable"
57+
ClusterReachableMsg = "cluster is reachable"
58+
ClusterConfigMalformedReason = "ClusterConfigMalformed"
59+
ClusterConfigMalformedMsg = "cluster's configuration may be malformed"
5760
)
5861

5962
// ClusterClient provides methods for determining the status and zones of a
@@ -67,21 +70,18 @@ type ClusterClient struct {
6770
// The kubeClient is used to configure the ClusterClient's internal client
6871
// with information from a kubeconfig stored in a kubernetes secret.
6972
func NewClusterClientSet(c *fedv1b1.KubeFedCluster, client generic.Client, fedNamespace string, timeout time.Duration) (*ClusterClient, error) {
73+
var clusterClientSet = ClusterClient{clusterName: c.Name}
7074
clusterConfig, err := util.BuildClusterConfig(c, client, fedNamespace)
7175
if err != nil {
72-
return nil, err
76+
return &clusterClientSet, err
7377
}
7478
clusterConfig.Timeout = timeout
75-
var clusterClientSet = ClusterClient{clusterName: c.Name}
76-
clusterClientSet.kubeClient = kubeclientset.NewForConfigOrDie((restclient.AddUserAgent(clusterConfig, UserAgentName)))
77-
if clusterClientSet.kubeClient == nil {
78-
return nil, nil
79-
}
80-
return &clusterClientSet, nil
79+
clusterClientSet.kubeClient, err = kubeclientset.NewForConfig(restclient.AddUserAgent(clusterConfig, UserAgentName))
80+
return &clusterClientSet, err
8181
}
8282

83-
// GetClusterHealthStatus gets the kubernetes cluster health status by requesting "/healthz"
84-
func (c *ClusterClient) GetClusterHealthStatus() (*fedv1b1.KubeFedClusterStatus, error) {
83+
// GetClusterStatus gets the kubernetes cluster's health and version status
84+
func (c *ClusterClient) GetClusterStatus() (*fedv1b1.KubeFedClusterStatus, error) {
8585
clusterStatus := fedv1b1.KubeFedClusterStatus{}
8686
currentTime := metav1.Now()
8787
clusterReady := ClusterReady
@@ -124,9 +124,26 @@ func (c *ClusterClient) GetClusterHealthStatus() (*fedv1b1.KubeFedClusterStatus,
124124
LastProbeTime: currentTime,
125125
LastTransitionTime: &currentTime,
126126
}
127+
clusterConfigMalformedReason := ClusterConfigMalformedReason
128+
clusterConfigMalformedMsg := ClusterConfigMalformedMsg
129+
newClusterConfigMalformedCondition := fedv1b1.ClusterCondition{
130+
Type: fedcommon.ClusterConfigMalformed,
131+
Status: corev1.ConditionTrue,
132+
Reason: &clusterConfigMalformedReason,
133+
Message: &clusterConfigMalformedMsg,
134+
LastProbeTime: currentTime,
135+
LastTransitionTime: &currentTime,
136+
}
137+
if c.kubeClient == nil {
138+
clusterStatus.Conditions = append(clusterStatus.Conditions, newClusterConfigMalformedCondition)
139+
metrics.RegisterKubefedClusterTotal(metrics.ClusterNotReady, c.clusterName)
140+
return &clusterStatus, nil
141+
}
127142
body, err := c.kubeClient.DiscoveryClient.RESTClient().Get().AbsPath("/healthz").Do(context.Background()).Raw()
128143
if err != nil {
129144
runtime.HandleError(errors.Wrapf(err, "Failed to do cluster health check for cluster %q", c.clusterName))
145+
msg := fmt.Sprintf("%s: %v", ClusterNotReachableMsg, err)
146+
newClusterOfflineCondition.Message = &msg
130147
clusterStatus.Conditions = append(clusterStatus.Conditions, newClusterOfflineCondition)
131148
metrics.RegisterKubefedClusterTotal(metrics.ClusterOffline, c.clusterName)
132149
} else {
@@ -136,6 +153,13 @@ func (c *ClusterClient) GetClusterHealthStatus() (*fedv1b1.KubeFedClusterStatus,
136153
} else {
137154
metrics.RegisterKubefedClusterTotal(metrics.ClusterReady, c.clusterName)
138155
clusterStatus.Conditions = append(clusterStatus.Conditions, newClusterReadyCondition)
156+
157+
version, err := c.kubeClient.DiscoveryClient.ServerVersion()
158+
if err != nil {
159+
runtime.HandleError(errors.Wrapf(err, "Failed to get Kubernetes version of cluster %q", c.clusterName))
160+
} else {
161+
clusterStatus.KubernetesVersion = version.GitVersion
162+
}
139163
}
140164
}
141165

pkg/controller/kubefedcluster/controller.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ func StartClusterController(config *util.ControllerConfig, clusterHealthCheckCon
9696
func newClusterController(config *util.ControllerConfig, clusterHealthCheckConfig *util.ClusterHealthCheckConfig) (*ClusterController, error) {
9797
kubeConfig := restclient.CopyConfig(config.KubeConfig)
9898
kubeConfig.Timeout = clusterHealthCheckConfig.Timeout
99-
client := genericclient.NewForConfigOrDieWithUserAgent(kubeConfig, "cluster-controller")
99+
restclient.AddUserAgent(kubeConfig, "cluster-controller")
100+
client := genericclient.NewForConfigOrDie(kubeConfig)
100101

101102
cc := &ClusterController{
102103
client: client,
@@ -175,18 +176,17 @@ func (cc *ClusterController) addToClusterSet(obj *fedv1b1.KubeFedCluster) {
175176
cc.mu.Lock()
176177
defer cc.mu.Unlock()
177178
clusterData := cc.clusterDataMap[obj.Name]
178-
if clusterData != nil && clusterData.clusterKubeClient != nil {
179+
if clusterData != nil && clusterData.clusterKubeClient.kubeClient != nil {
179180
return
180181
}
181182

182183
klog.V(1).Infof("ClusterController observed a new cluster: %v", obj.Name)
183184

184185
// create the restclient of cluster
185186
restClient, err := NewClusterClientSet(obj, cc.client, cc.fedNamespace, cc.clusterHealthCheckConfig.Timeout)
186-
if err != nil || restClient == nil {
187+
if err != nil || restClient.kubeClient == nil {
187188
cc.RecordError(obj, "MalformedClusterConfig", errors.Wrap(err, "The configuration for this cluster may be malformed"))
188-
klog.Errorf("The configuration for cluster %s may be malformed", obj.Name)
189-
return
189+
klog.Errorf("The configuration for cluster %q may be malformed: %v", obj.Name, err)
190190
}
191191
cc.clusterDataMap[obj.Name] = &ClusterData{clusterKubeClient: restClient, cachedObj: obj.DeepCopy()}
192192
}
@@ -217,7 +217,7 @@ func (cc *ClusterController) updateClusterStatus() error {
217217
cluster := obj.DeepCopy()
218218
clusterData := cc.clusterDataMap[cluster.Name]
219219
cc.mu.RUnlock()
220-
if clusterData == nil {
220+
if clusterData == nil || clusterData.clusterKubeClient.kubeClient == nil {
221221
// Retry adding cluster client
222222
cc.addToClusterSet(cluster)
223223
cc.mu.RLock()
@@ -243,7 +243,7 @@ func (cc *ClusterController) updateIndividualClusterStatus(cluster *fedv1b1.Kube
243243

244244
clusterClient := storedData.clusterKubeClient
245245

246-
currentClusterStatus, err := clusterClient.GetClusterHealthStatus()
246+
currentClusterStatus, err := clusterClient.GetClusterStatus()
247247
if err != nil {
248248
cc.RecordError(cluster, "RetrievingClusterHealthFailed", errors.Wrap(err, "Failed to retrieve health of the cluster"))
249249
klog.Errorf("Failed to retrieve health of the cluster %s: %v", cluster.Name, err)
@@ -279,7 +279,7 @@ func thresholdAdjustedClusterStatus(clusterStatus *fedv1b1.KubeFedClusterStatus,
279279
if storedData.resultRun < threshold {
280280
// Success/Failure is below threshold - leave the probe state unchanged.
281281
probeTime := clusterStatus.Conditions[0].LastProbeTime
282-
clusterStatus = storedData.clusterStatus
282+
clusterStatus.Conditions = storedData.clusterStatus.Conditions
283283
setProbeTime(clusterStatus, probeTime)
284284
} else if clusterStatusEqual(clusterStatus, storedData.clusterStatus) {
285285
// preserve the last transition time

pkg/controller/schedulingpreference/controller.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func newSchedulingPreferenceController(config *util.ControllerConfig, scheduling
137137
s.clusterDeliverer = util.NewDelayingDeliverer()
138138

139139
s.store, s.controller, err = util.NewGenericInformer(
140-
config.KubeConfig,
140+
kubeConfig,
141141
config.TargetNamespace,
142142
s.scheduler.ObjectType(),
143143
util.NoResyncPeriod,

pkg/controller/status/controller.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"time"
2626

2727
"k8s.io/apimachinery/pkg/util/wait"
28+
restclient "k8s.io/client-go/rest"
2829

2930
"github.com/pkg/errors"
3031
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -104,14 +105,16 @@ func newKubeFedStatusController(controllerConfig *util.ControllerConfig, typeCon
104105
return nil, errors.Errorf("Status collection is not supported for %q", federatedAPIResource.Kind)
105106
}
106107
userAgent := fmt.Sprintf("%s-controller", strings.ToLower(statusAPIResource.Kind))
107-
client := genericclient.NewForConfigOrDieWithUserAgent(controllerConfig.KubeConfig, userAgent)
108+
kubeConfig := restclient.CopyConfig(controllerConfig.KubeConfig)
109+
restclient.AddUserAgent(kubeConfig, userAgent)
110+
client := genericclient.NewForConfigOrDie(kubeConfig)
108111

109-
federatedTypeClient, err := util.NewResourceClient(controllerConfig.KubeConfig, &federatedAPIResource)
112+
federatedTypeClient, err := util.NewResourceClient(kubeConfig, &federatedAPIResource)
110113
if err != nil {
111114
return nil, err
112115
}
113116

114-
statusClient, err := util.NewResourceClient(controllerConfig.KubeConfig, statusAPIResource)
117+
statusClient, err := util.NewResourceClient(kubeConfig, statusAPIResource)
115118
if err != nil {
116119
return nil, err
117120
}

0 commit comments

Comments
 (0)