Skip to content

Commit 7f49a68

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 07c50c9 commit 7f49a68

File tree

10 files changed

+175
-191
lines changed

10 files changed

+175
-191
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"
@@ -144,8 +143,6 @@ func (disk *DISK) Run() {
144143

145144
// GlobalConfigSet set Global Config
146145
func GlobalConfigSet(m metadata.MetadataProvider) utils.Config {
147-
configMapName := "csi-plugin"
148-
149146
// Global Configs Set
150147
cfg, err := options.GetRestConfig()
151148
if err != nil {
@@ -162,13 +159,7 @@ func GlobalConfigSet(m metadata.MetadataProvider) utils.Config {
162159
klog.Fatalf("Error building kubernetes clientset: %s", err.Error())
163160
}
164161

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

173164
// Env variables
174165
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"
@@ -99,13 +100,13 @@ type FuseContainerConfig struct {
99100
Extra map[string]string
100101
}
101102

102-
func extractFuseContainerConfig(configmap *corev1.ConfigMap, name string) (config FuseContainerConfig) {
103+
func extractFuseContainerConfig(configmap *utils.Config, name string) (config FuseContainerConfig) {
103104
if configmap == nil {
104105
return
105106
}
106107
config.Resources.Requests = make(corev1.ResourceList)
107108
config.Resources.Limits = make(corev1.ResourceList)
108-
content := configmap.Data["fuse-"+name]
109+
content := configmap.Get("fuse-"+name, "", "")
109110
for _, line := range strings.Split(content, "\n") {
110111
line = strings.TrimSpace(line)
111112
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: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,22 @@ 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/features"
1211
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/nas/cloud"
1312
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/nas/interfaces"
1413
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/options"
14+
"github.com/kubernetes-sigs/alibaba-cloud-csi-driver/pkg/utils"
1515
corev1 "k8s.io/api/core/v1"
16-
apierrors "k8s.io/apimachinery/pkg/api/errors"
1716
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1817
"k8s.io/client-go/dynamic"
1918
"k8s.io/client-go/kubernetes"
2019
"k8s.io/klog/v2"
2120
)
2221

23-
const (
24-
configMapName = "csi-plugin"
25-
configMapNamespace = "kube-system"
26-
27-
defaultAlinasMountProxySocket = "/run/cnfs/alinas-mounter.sock"
28-
)
22+
const defaultAlinasMountProxySocket = "/run/cnfs/alinas-mounter.sock"
2923

3024
type ControllerConfig struct {
3125
// cluster info
@@ -53,26 +47,19 @@ func mustGetKubeClients() (kubernetes.Interface, cnfsv1beta1.CNFSGetter) {
5347

5448
func GetControllerConfig(meta *metadata.Metadata) (*ControllerConfig, error) {
5549
kubeClient, cnfsGetter := mustGetKubeClients()
50+
cm := utils.DefaultConfig()
51+
5652
config := &ControllerConfig{
5753
Region: metadata.MustGet(meta, metadata.RegionID),
5854
ClusterID: os.Getenv("CLUSTER_ID"),
5955
KubeClient: kubeClient,
6056
CNFSGetter: cnfsGetter,
6157
NasClientFactory: cloud.NewNasClientFactory(),
62-
}
6358

64-
cm, err := kubeClient.CoreV1().ConfigMaps(configMapNamespace).Get(context.Background(), configMapName, metav1.GetOptions{})
65-
if err != nil {
66-
if !apierrors.IsNotFound(err) {
67-
return nil, err
68-
}
69-
} else {
70-
config.SkipSubpathCreation, _ = parseBool(cm.Data["nas-fake-provision"])
59+
SkipSubpathCreation: cm.GetBool("nas-fake-provision", "NAS_FAKE_PROVISION", false),
60+
EnableSubpathFinalizer: cm.GetBool("nas-subpath-finalizer", "ENABLE_NAS_SUBPATH_FINALIZER", true),
61+
EnableRecycleBinCheck: cm.GetBool("nas-recyclebin-check", "ENABLE_NAS_RECYCLEBIN_CHECK", false),
7162
}
72-
73-
config.EnableSubpathFinalizer, _ = parseBool(os.Getenv("ENABLE_NAS_SUBPATH_FINALIZER"))
74-
config.EnableRecycleBinCheck, _ = parseBool(os.Getenv("ENABLE_NAS_RECYCLEBIN_CHECK"))
75-
7663
return config, nil
7764
}
7865

@@ -95,33 +82,19 @@ type NodeConfig struct {
9582

9683
func GetNodeConfig() (*NodeConfig, error) {
9784
kubeClient, cnfsGetter := mustGetKubeClients()
98-
config := &NodeConfig{
99-
// enable nfs port check by default
100-
EnablePortCheck: true,
101-
KubeClient: kubeClient,
102-
CNFSGetter: cnfsGetter,
103-
}
85+
cm := utils.DefaultConfig()
10486

105-
// check if enable nfs port check
106-
if value := os.Getenv("NAS_PORT_CHECK"); value != "" {
107-
config.EnablePortCheck, _ = parseBool(value)
87+
config := &NodeConfig{
88+
KubeClient: kubeClient,
89+
CNFSGetter: cnfsGetter,
90+
91+
EnablePortCheck: cm.GetBool("nas-port-check", "NAS_PORT_CHECK", true),
92+
EnableVolumeStats: cm.GetBool("nas-metric-enable", "NAS_METRIC_BY_PLUGIN", false),
93+
EnableEFCCache: cm.Get("cnfs-cache-properties", "", "") != "" ||
94+
cm.Get("nas-efc-cache", "", "") != "",
95+
EnableLosetup: cm.GetBool("nas-losetup-enable", "NAS_LOSETUP_ENABLE", false),
10896
}
10997

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

137110
// check if losetup enabled
138-
if value := os.Getenv("NAS_LOSETUP_ENABLE"); value != "" {
139-
config.EnableLosetup, _ = parseBool(value)
140-
}
141111
if config.EnableLosetup {
142112
klog.Info("enabled nas losetup mode")
143113
for _, addr := range node.Status.Addresses {
@@ -157,13 +127,3 @@ func GetNodeConfig() (*NodeConfig, error) {
157127

158128
return config, nil
159129
}
160-
161-
func parseBool(str string) (bool, error) {
162-
switch str {
163-
case "enable", "enabled", "yes":
164-
return true, nil
165-
case "no", "":
166-
return false, nil
167-
}
168-
return strconv.ParseBool(str)
169-
}

0 commit comments

Comments
 (0)