Skip to content

Commit 4ac6cfc

Browse files
committed
Read configmap from volume mount
Avoid RBAC permission to configmap and save some APIServer call. The permission to get ack-cluster-profile is moved to a separate role, not assuming we are installed in kube-system.
1 parent f93986b commit 4ac6cfc

File tree

10 files changed

+174
-190
lines changed

10 files changed

+174
-190
lines changed

deploy/chart/templates/rbac.yaml

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
---
2+
kind: Role
3+
apiVersion: rbac.authorization.k8s.io/v1
4+
metadata:
5+
namespace: kube-system
6+
name: alibabacloud-csi-kube-system
7+
rules:
8+
- apiGroups: [""]
9+
resources: ["configmaps"]
10+
resourceNames: ["ack-cluster-profile"]
11+
verbs: ["get"]
12+
113
{{- if .Values.controller.enabled -}}
214
# csi-provisioner
315
---
@@ -101,10 +113,6 @@ rules:
101113
- apiGroups: ["coordination.k8s.io"]
102114
resources: ["leases"]
103115
verbs: ["get", "watch", "list", "delete", "update", "create"]
104-
- apiGroups: [""]
105-
resources: ["configmaps"]
106-
resourceNames: ["csi-plugin", "ack-cluster-profile"]
107-
verbs: ["get"]
108116
{{- if .Values.csi.oss.enabled }}
109117
# TODO: remove this in the future
110118
# Need this for oss driver compatibility.
@@ -136,6 +144,20 @@ roleRef:
136144
kind: Role
137145
name: alicloud-csi-provisioner
138146
apiGroup: rbac.authorization.k8s.io
147+
---
148+
kind: RoleBinding
149+
apiVersion: rbac.authorization.k8s.io/v1
150+
metadata:
151+
name: alibabacloud-csi-provisioner-kube-system
152+
namespace: kube-system
153+
subjects:
154+
- kind: ServiceAccount
155+
name: alicloud-csi-provisioner
156+
namespace: {{ .Release.Namespace }}
157+
roleRef:
158+
kind: Role
159+
name: alibabacloud-csi-kube-system
160+
apiGroup: rbac.authorization.k8s.io
139161

140162
{{- if .Values.csi.oss.enabled }}
141163
---
@@ -175,10 +197,6 @@ rules:
175197
resources: ["endpoints"]
176198
resourceNames: ["cnfs-cache-ds-service"]
177199
verbs: ["get"]
178-
- apiGroups: [""]
179-
resources: ["configmaps"]
180-
resourceNames: ["csi-plugin", "ack-cluster-profile"]
181-
verbs: ["get"]
182200
- apiGroups: [""]
183201
resources: ["services"]
184202
resourceNames: ["storage-monitor-service"]
@@ -249,6 +267,20 @@ subjects:
249267
name: alicloud-csi-node
250268
namespace: {{ .Release.Namespace }}
251269
---
270+
kind: RoleBinding
271+
apiVersion: rbac.authorization.k8s.io/v1
272+
metadata:
273+
name: alibabacloud-csi-node-kube-system
274+
namespace: kube-system
275+
subjects:
276+
- kind: ServiceAccount
277+
name: alicloud-csi-node
278+
namespace: {{ .Release.Namespace }}
279+
roleRef:
280+
kind: Role
281+
name: alibabacloud-csi-kube-system
282+
apiGroup: rbac.authorization.k8s.io
283+
---
252284
apiVersion: rbac.authorization.k8s.io/v1
253285
kind: ClusterRoleBinding
254286
metadata:

pkg/disk/disk.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/options"
3535
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
3636
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/version"
37-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3837
"k8s.io/client-go/kubernetes"
3938
"k8s.io/klog/v2"
4039
"k8s.io/utils/clock"
@@ -142,8 +141,6 @@ func (disk *DISK) Run() {
142141

143142
// GlobalConfigSet set Global Config
144143
func GlobalConfigSet(m metadata.MetadataProvider) utils.Config {
145-
configMapName := "csi-plugin"
146-
147144
// Global Configs Set
148145
cfg, err := options.GetRestConfig()
149146
if err != nil {
@@ -160,13 +157,7 @@ func GlobalConfigSet(m metadata.MetadataProvider) utils.Config {
160157
klog.Fatalf("Error building kubernetes clientset: %s", err.Error())
161158
}
162159

163-
csiCfg := utils.Config{}
164-
configMap, err := kubeClient.CoreV1().ConfigMaps("kube-system").Get(context.Background(), configMapName, metav1.GetOptions{})
165-
if err != nil {
166-
klog.Infof("Not found configmap named as csi-plugin under kube-system, with: %v", err)
167-
} else {
168-
csiCfg.ConfigMap = configMap.Data
169-
}
160+
csiCfg := utils.DefaultConfig()
170161

171162
// Env variables
172163
avmfe := os.Getenv("ADDON_VM_FATAL_EVENTS")

pkg/mounter/fuse_pod_manager.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"strings"
1010
"time"
1111

12+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
1213
corev1 "k8s.io/api/core/v1"
1314
"k8s.io/apimachinery/pkg/api/resource"
1415
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -98,13 +99,13 @@ type FuseContainerConfig struct {
9899
Extra map[string]string
99100
}
100101

101-
func extractFuseContainerConfig(configmap *corev1.ConfigMap, name string) (config FuseContainerConfig) {
102+
func extractFuseContainerConfig(configmap *utils.Config, name string) (config FuseContainerConfig) {
102103
if configmap == nil {
103104
return
104105
}
105106
config.Resources.Requests = make(corev1.ResourceList)
106107
config.Resources.Limits = make(corev1.ResourceList)
107-
content := configmap.Data["fuse-"+name]
108+
content := configmap.Get("fuse-"+name, "", "")
108109
for _, line := range strings.Split(content, "\n") {
109110
line = strings.TrimSpace(line)
110111
if line == "" {

pkg/mounter/fuse_pod_manager_test.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
11
package mounter
22

33
import (
4+
"os"
45
"testing"
56

7+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
68
"github.com/stretchr/testify/assert"
79
corev1 "k8s.io/api/core/v1"
810
"k8s.io/apimachinery/pkg/api/resource"
911
)
1012

1113
func Test_extractFuseContainerConfig(t *testing.T) {
12-
configmap := &corev1.ConfigMap{
13-
Data: map[string]string{
14-
"fuse-ossfs": `
15-
image=ossfs:latest
16-
cpu-request=100m
17-
cpu-limit=1
18-
memory-request=500Mi
19-
memory-limit=2Gi
20-
dbglevel=info
21-
mime-support=false
22-
annotations={"anno1": "val1", "anno2": "val2"}
23-
labels={"label1": "val1", "label2": "val2"}
24-
`,
25-
},
26-
}
27-
config := extractFuseContainerConfig(configmap, "ossfs")
14+
dir := t.TempDir()
15+
assert.NoError(t, os.WriteFile(dir+"/fuse-ossfs", []byte(`
16+
image=ossfs:latest
17+
cpu-request=100m
18+
cpu-limit=1
19+
memory-request=500Mi
20+
memory-limit=2Gi
21+
dbglevel=info
22+
mime-support=false
23+
annotations={"anno1": "val1", "anno2": "val2"}
24+
labels={"label1": "val1", "label2": "val2"}
25+
`), 0644))
26+
27+
configmap := utils.Config{Path: dir}
28+
config := extractFuseContainerConfig(&configmap, "ossfs")
2829
expected := FuseContainerConfig{
2930
Resources: corev1.ResourceRequirements{
3031
Limits: corev1.ResourceList{

pkg/mounter/ossfs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ var ossfsDbglevels = map[string]string{
6262

6363
const defaultDbglevel = DebugLevelError
6464

65-
func NewFuseOssfs(configmap *corev1.ConfigMap, m metadata.MetadataProvider) FuseMounterType {
65+
func NewFuseOssfs(configmap *utils.Config, m metadata.MetadataProvider) FuseMounterType {
6666
config := extractFuseContainerConfig(configmap, "ossfs")
6767
// set default image
6868
if config.Image == "" {

pkg/nas/internal/config.go

Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,20 @@ import (
44
"context"
55
"errors"
66
"os"
7-
"strconv"
87

98
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/cloud/metadata"
109
cnfsv1beta1 "github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/cnfs/v1beta1"
1110
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/nas/cloud"
1211
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/nas/interfaces"
1312
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/options"
13+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
1414
corev1 "k8s.io/api/core/v1"
15-
apierrors "k8s.io/apimachinery/pkg/api/errors"
1615
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1716
"k8s.io/client-go/dynamic"
1817
"k8s.io/client-go/kubernetes"
1918
"k8s.io/klog/v2"
2019
)
2120

22-
const (
23-
configMapName = "csi-plugin"
24-
configMapNamespace = "kube-system"
25-
)
26-
2721
type ControllerConfig struct {
2822
// cluster info
2923
Region string
@@ -50,26 +44,19 @@ func mustGetKubeClients() (kubernetes.Interface, cnfsv1beta1.CNFSGetter) {
5044

5145
func GetControllerConfig(meta *metadata.Metadata) (*ControllerConfig, error) {
5246
kubeClient, cnfsGetter := mustGetKubeClients()
47+
cm := utils.DefaultConfig()
48+
5349
config := &ControllerConfig{
5450
Region: metadata.MustGet(meta, metadata.RegionID),
5551
ClusterID: os.Getenv("CLUSTER_ID"),
5652
KubeClient: kubeClient,
5753
CNFSGetter: cnfsGetter,
5854
NasClientFactory: cloud.NewNasClientFactory(),
59-
}
6055

61-
cm, err := kubeClient.CoreV1().ConfigMaps(configMapNamespace).Get(context.Background(), configMapName, metav1.GetOptions{})
62-
if err != nil {
63-
if !apierrors.IsNotFound(err) {
64-
return nil, err
65-
}
66-
} else {
67-
config.SkipSubpathCreation, _ = parseBool(cm.Data["nas-fake-provision"])
56+
SkipSubpathCreation: cm.GetBool("nas-fake-provision", "NAS_FAKE_PROVISION", false),
57+
EnableSubpathFinalizer: cm.GetBool("nas-subpath-finalizer", "ENABLE_NAS_SUBPATH_FINALIZER", true),
58+
EnableRecycleBinCheck: cm.GetBool("nas-recyclebin-check", "ENABLE_NAS_RECYCLEBIN_CHECK", false),
6859
}
69-
70-
config.EnableSubpathFinalizer, _ = parseBool(os.Getenv("ENABLE_NAS_SUBPATH_FINALIZER"))
71-
config.EnableRecycleBinCheck, _ = parseBool(os.Getenv("ENABLE_NAS_RECYCLEBIN_CHECK"))
72-
7360
return config, nil
7461
}
7562

@@ -92,33 +79,19 @@ type NodeConfig struct {
9279

9380
func GetNodeConfig() (*NodeConfig, error) {
9481
kubeClient, cnfsGetter := mustGetKubeClients()
95-
config := &NodeConfig{
96-
// enable nfs port check by default
97-
EnablePortCheck: true,
98-
KubeClient: kubeClient,
99-
CNFSGetter: cnfsGetter,
100-
}
82+
cm := utils.DefaultConfig()
10183

102-
// check if enable nfs port check
103-
if value := os.Getenv("NAS_PORT_CHECK"); value != "" {
104-
config.EnablePortCheck, _ = parseBool(value)
84+
config := &NodeConfig{
85+
KubeClient: kubeClient,
86+
CNFSGetter: cnfsGetter,
87+
88+
EnablePortCheck: cm.GetBool("nas-port-check", "NAS_PORT_CHECK", true),
89+
EnableVolumeStats: cm.GetBool("nas-metric-enable", "NAS_METRIC_BY_PLUGIN", false),
90+
EnableEFCCache: cm.Get("cnfs-cache-properties", "", "") != "" ||
91+
cm.Get("nas-efc-cache", "", "") != "",
92+
EnableLosetup: cm.GetBool("nas-losetup-enable", "NAS_LOSETUP_ENABLE", false),
10593
}
10694

107-
// get csi-plugin configmap
108-
cm, err := kubeClient.CoreV1().ConfigMaps(configMapNamespace).Get(context.Background(), configMapName, metav1.GetOptions{})
109-
if err != nil {
110-
if !apierrors.IsNotFound(err) {
111-
return nil, err
112-
}
113-
} else {
114-
if value := cm.Data["nas-metric-enable"]; value != "" {
115-
config.EnableVolumeStats, _ = parseBool(value)
116-
}
117-
config.EnableEFCCache = cm.Data["cnfs-cache-properties"] != "" || cm.Data["nas-efc-cache"] != ""
118-
}
119-
if value := os.Getenv("NAS_METRIC_BY_PLUGIN"); value != "" {
120-
config.EnableVolumeStats, _ = parseBool(value)
121-
}
12295
if config.EnableVolumeStats {
12396
klog.Info("enabled nas volume stats")
12497
}
@@ -132,9 +105,6 @@ func GetNodeConfig() (*NodeConfig, error) {
132105
config.NodeName = nodeName
133106

134107
// check if losetup enabled
135-
if value := os.Getenv("NAS_LOSETUP_ENABLE"); value != "" {
136-
config.EnableLosetup, _ = parseBool(value)
137-
}
138108
if config.EnableLosetup {
139109
klog.Info("enabled nas losetup mode")
140110
for _, addr := range node.Status.Addresses {
@@ -150,13 +120,3 @@ func GetNodeConfig() (*NodeConfig, error) {
150120

151121
return config, nil
152122
}
153-
154-
func parseBool(str string) (bool, error) {
155-
switch str {
156-
case "enable", "enabled", "yes":
157-
return true, nil
158-
case "no", "":
159-
return false, nil
160-
}
161-
return strconv.ParseBool(str)
162-
}

0 commit comments

Comments
 (0)