可以使用 client-go 的 StatefulSet API 创建 StatefulSet 并设置 DefaultMode 为 0775,具体示例如下:
import (
"k8s.io/api/apps/v1"
)
...
statefulSetClient := kubernetesClient.AppsV1().StatefulSets(namespace)
statefulSet := &v1.StatefulSet{
ObjectMeta: metav1.ObjectMeta{
Name: "example-statefulset",
Namespace: namespace,
},
Spec: v1.StatefulSetSpec{
Replicas: &replicas,
ServiceName: serviceName,
Selector: &metav1.LabelSelector{
MatchLabels: labels,
},
Template: corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: labels,
},
Spec: corev1.PodSpec{
Containers: []corev1.Container{container},
SecurityContext: &corev1.PodSecurityContext{
FSGroup: &fsGroup, // 设置 fsGroup
},
Volumes: []corev1.Volume{volume}, // 添加 volume
},
},
VolumeClaimTemplates: []corev1.PersistentVolumeClaim{pvc}, // 添加 PVC 模板
},
}
// 设置 DefaultMode 为 0775
statefulSet.Spec.Template.Spec.Containers[0].SecurityContext = &corev1.SecurityContext{
RunAsUser: &runAsUser,
RunAsGroup: &runAsGroup,
FsGroup: &fsGroup,
}
for i, _ := range statefulSet.Spec.VolumeClaimTemplates {
statefulSet.Spec.VolumeClaimTemplates[i].Spec.AccessModes = []corev1.PersistentVolumeAccessMode{"ReadWriteOnce"}
statefulSet.Spec.VolumeClaimTemplates[i].Spec.StorageClassName = storageClassName
}
其中,最后一段代码通过设置 Pod 的 SecurityContext 来设置 DefaultMode,注意此处只设置了第一个容器的 SecurityContext。
另外,还可以为 Volume 设置默认权限:
volume := corev1.Volume{
Name: "data",
VolumeSource: corev1.VolumeSource{
PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
ClaimName: pvc.Name,
DefaultMode: &defaultMode, // 设置 DefaultMode 为 0775
},
},
}
以上示例中,创建的 Volume 使用了 PVC,并通过设置 DefaultMode 属性来指定了默认权限。