K8S中若要挂载其他命名空间中的 Secret

在Kubernetes(k8s)里,若要挂载其他命名空间中的Secret,你可以通过创建一个 SecretServiceAccountRoleBinding 来实现对其他命名空间 Secret 的访问,接着在 Pod 中挂载这个 Secret。下面是详细的步骤和示例代码:

步骤

  1. 创建 ServiceAccount:在要挂载 Secret 的命名空间里创建一个 ServiceAccount
  2. 创建 RoleRoleBinding:在包含 Secret 的命名空间创建一个 Role 以及 RoleBinding,以此赋予 ServiceAccount 访问 Secret 的权限。
  3. Pod 中使用 ServiceAccount 并挂载 Secret:在 Pod 定义里运用 ServiceAccount,并且挂载 Secret

示例代码

下面是一系列的 YAML 文件,用来实现上述步骤。

1. 创建 ServiceAccount

在要挂载 Secret 的命名空间(假设为 target-namespace)创建 ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:
  name: secret-reader
  namespace: target-namespace
2. 创建 RoleRoleBinding

在包含 Secret 的命名空间(假设为 source-namespace)创建 RoleRoleBinding

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-reader-role
  namespace: source-namespace
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "watch", "list"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: secret-reader-rolebinding
  namespace: source-namespace
subjects:
- kind: ServiceAccount
  name: secret-reader
  namespace: target-namespace
roleRef:
  kind: Role
  name: secret-reader-role
  apiGroup: rbac.authorization.k8s.io
3. 在 Pod 中使用 ServiceAccount 并挂载 Secret

target-namespace 里创建一个 Pod,使用 ServiceAccount 并挂载 Secret

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: target-namespace
spec:
  serviceAccountName: secret-reader
  containers:
  - name: my-container
    image: nginx
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secret"
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: my-secret
      namespace: source-namespace

解释

  • ServiceAccount:在 target-namespace 创建的 secret-reader ServiceAccount 用于给 Pod 授予访问权限。
  • RoleRoleBinding:在 source-namespace 创建的 RoleRoleBinding 赋予 secret-reader ServiceAccount 访问 Secret 的权限。
  • Pod:在 target-namespace 创建的 Pod 使用 secret-reader ServiceAccount,并且挂载 source-namespace 中的 my-secret Secret

操作步骤

  1. 把上述 YAML 文件保存为不同的文件,例如 serviceaccount.yamlrole.yamlpod.yaml
  2. 依次执行以下命令:
kubectl apply -f serviceaccount.yaml
kubectl apply -f role.yaml
kubectl apply -f pod.yaml

这样,Pod 就能成功挂载其他命名空间中的 Secret 了。

Elasticsearch 可以通过 Kubernetes命名空间(Namespace)进行数据隔离,以下是具体的步骤: 1. 创建 Kubernetes 命名空间(例如,名为 elasticsearch)。 2. 创建 Kubernetes ConfigMap,用于包含 Elasticsearch 的配置文件。可以通过以下命令创建 ConfigMap: ``` kubectl create configmap elasticsearch-config --from-file=<path_to_elasticsearch_config_directory> ``` 其中,`<path_to_elasticsearch_config_directory>` 为 Elasticsearch 配置文件目录的路径。 3. 创建 Kubernetes Secret,用于包含 Elasticsearch 的密码等敏感信息。可以通过以下命令创建 Secret: ``` kubectl create secret generic elasticsearch-secret --from-literal=<key>=<value> ``` 其中,`<key>` 是密码等敏感信息的键,`<value>` 是密码等敏感信息的值。 4. 创建 Elasticsearch StatefulSet,指定 Kubernetes 命名空间、ConfigMap 和 Secret。可以通过以下 YAML 文件模板创建 StatefulSet: ``` apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: elasticsearch spec: serviceName: elasticsearch replicas: 3 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: containers: - name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2 imagePullPolicy: IfNotPresent env: - name: ES_JAVA_OPTS value: -Xms512m -Xmx512m ports: - containerPort: 9200 name: http - containerPort: 9300 name: transport volumeMounts: - name: elasticsearch-config mountPath: /usr/share/elasticsearch/config - name: elasticsearch-data mountPath: /usr/share/elasticsearch/data - name: elasticsearch-secret mountPath: /usr/share/elasticsearch/config/elasticsearch.keystore subPath: elasticsearch.keystore readOnly: true readinessProbe: httpGet: path: /_cluster/health?wait_for_status=yellow&timeout=1s port: http initialDelaySeconds: 10 periodSeconds: 10 livenessProbe: httpGet: path: /_cluster/health?wait_for_status=yellow&timeout=1s port: http initialDelaySeconds: 120 periodSeconds: 10 volumes: - name: elasticsearch-config configMap: name: elasticsearch-config - name: elasticsearch-data persistentVolumeClaim: claimName: elasticsearch-data - name: elasticsearch-secret secret: secretName: elasticsearch-secret volumeClaimTemplates: - metadata: name: elasticsearch-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi ``` 其中,`metadata.name` 和 `metadata.namespace` 分别为 StatefulSet 的名称和所在的命名空间,`spec.serviceName` 为 StatefulSet 创建的服务名称,`spec.replicas` 为 StatefulSet 副本数,`spec.selector.matchLabels` 为 StatefulSet 所选择的 Pod 的标签,`spec.template.metadata.labels` 为 StatefulSet 创建的 Pod 的标签,`spec.template.spec.containers.name` 为 StatefulSet 创建的容器名称,`spec.template.spec.containers.image` 为 StatefulSet 创建的容器所使用的镜像,`spec.template.spec.containers.env` 为 StatefulSet 创建的容器所需的环境变量,`spec.template.spec.containers.ports` 为 StatefulSet 创建的容器所需的端口,`spec.template.spec.containers.volumeMounts` 为 StatefulSet 创建的容器所需的挂载卷,`spec.template.spec.containers.readinessProbe` 和 `spec.template.spec.containers.livenessProbe` 分别为 StatefulSet 创建的容器的就绪探针和存活探针,`spec.template.spec.volumes` 为 StatefulSet 创建的 Pod 所需的卷,`spec.volumeClaimTemplates` 为 StatefulSet 创建的持久卷声明。 5. 创建 Kubernetes Service,指定 Kubernetes 命名空间和 StatefulSet 创建的服务名称。可以通过以下 YAML 文件模板创建 Service: ``` apiVersion: v1 kind: Service metadata: name: elasticsearch namespace: elasticsearch spec: selector: app: elasticsearch ports: - name: http port: 9200 targetPort: http - name: transport port: 9300 targetPort: transport clusterIP: None ``` 其中,`metadata.name` 和 `metadata.namespace` 分别为 Service 的名称和所在的命名空间,`spec.selector` 为 Service 所选择的 Pod 的标签,`spec.ports` 为 Service 所开放的端口,`spec.clusterIP` 为 Service 所使用的 IP 地址。 通过以上步骤,就可以在 Kubernetes 中实现 Elasticsearch 的数据隔离。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网络飞鸥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值