如何安装kubernetes机密?

时间:2019-08-21 17:47:27

标签: kubernetes

更新

很明显,此行为是由ServiceAccount引起的: https://kubernetes.io/docs/reference/access-authn-authz/service-accounts-admin/#service-account-admission-controller

使用AdmissionController之类的东西。我想我要寻找的是以下之一:

  • AdmissionController中找到一个设置,该设置在我的情况下跳过给定容器(initContainer)的秘密装入

  • 找到具有这种灵活性的AdmissionController的实现

  • 将秘密的位置从/ var / run / secrets更改为其他地方

原始

我有一个initContainer,它是pod的一部分,是statefulset的一部分。我正在安装一些直接的卷(以便我可以在我的应用容器启动之前创建路径/权限)。但是,一旦我检查了文件系统,就会看到一个嵌套的路径,其中似乎是kubernetes的秘密。

这是如何安装的?这是我们自己做的吗?为什么走这条路?我可以阻止秘密泄露吗?我可以更改安装路径吗?

$ kubectl logs nmnode-0-0 -n test -c prep-hadoop-paths
drwxrwsrwt 4 root root 80 Aug 21 03:52 /run
/run:
total 0
drwxrwsr-x 2 1000 root 40 Aug 21 03:52 configmaps
drwxr-sr-x 3 root root 60 Aug 21 03:52 secrets

/run/configmaps:
total 0

/run/secrets:
total 0
drwxr-sr-x 3 root root 60 Aug 21 03:52 kubernetes.io

/run/secrets/kubernetes.io:
total 0
drwxrwsrwt 3 root root 140 Aug 21 03:51 serviceaccount

/run/secrets/kubernetes.io/serviceaccount:
total 0
lrwxrwxrwx 1 root root 13 Aug 21 03:51 ca.crt -> ..data/ca.crt
lrwxrwxrwx 1 root root 16 Aug 21 03:51 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 12 Aug 21 03:51 token -> ..data/token

      initContainers:
      - command:
        - sh
        - -c
        - umask 002; ls -ld /run; ls -lR /run; mkdir -p /var/run/secrets/credentials
          ; mkdir -p /var/opt/hdfs ; mkdir -p /var/run/configmaps ; mkdir -p /var/run/secrets/certificates
          ; ls -lR /var;
        image: ubuntu:16.04
        imagePullPolicy: IfNotPresent
        name: prep-hadoop-paths
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /var/opt
          name: data
          subPath: hadoop/var/opt
        - mountPath: /var/log
          name: logs
          subPath: hadoop
        - mountPath: /var/run
          name: var-run
          subPath: hadoop

从initContainer规范中可以看到,没有地方可以指定或要求安装任何机密。但是无论如何它们都会出现

以下是广告连播的卷列表。


      volumes:
      - name: mssql-master-pool-secret
        secret:
          defaultMode: 420
          secretName: mssql-master-pool-secret
      - name: controller-internal-secret
        secret:
          defaultMode: 420
          secretName: controller-internal-secret
      - emptyDir:
          medium: Memory
        name: var-run
      - configMap:
          defaultMode: 420
          name: mssql-hadoop-storage-0-configmap
        name: hadoop-config-volume
      - name: nmnode-0-agent-secret
        secret:
          defaultMode: 420
          secretName: nmnode-0-agent-secret
      - configMap:
          defaultMode: 420
          name: cluster-configmap
        name: cluster-config-volume

如果您需要Yaml的更多部分,请告诉我。

3 个答案:

答案 0 :(得分:1)

您做对了,Admission controller是通过Kubernetes API实现各种功能的主要贡献者。如上所述,Service Account还随Kubernetes集群中的某些接纳功能一起传播,最初与称为ServiceAccount的特定接纳插件绑定。

根据官方的Kubernetes documentation--enable-admission-plugins configuration中包含特殊标志--disable-admission-pluginskube-apiserver,可用于启用或禁用准入插件。

默认情况下,启用ServiceAccount接纳控制器插件,如here所述。除其他操作外,此插件还将带有令牌数据和CA证书的卷装入跨K8s群集的每个Pod中,以达到authentication到apiserver的目的。

为了停用ServiceAccount接纳插件,您可以将--disable-admission-plugins=ServiceAccount注入kube-apiserver配置中。

否则,如果您想

  

将秘密的位置从/ var / run / secrets更改为其他地方

这是where,您可以将路径更改为所需的任何内容

答案 1 :(得分:0)

我相信每个pod都在服务帐户的上下文中运行。安装的那个秘密是服务帐户的令牌。您是否有理由不希望这种情况发生?

答案 2 :(得分:0)

如何安装?

Service Account Admission Controller为您安装了它。

这是我们自己做的吗?

否。

为什么要走这条路?

因为Kubernetes开发人员是这样说的?老实说,我不确定。

我可以阻止秘密公开吗?

是的,由于Kubernetes 1.6,您可以禁用此安装at either the Service Account or Pod level.

# a ServiceAccount manifest
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-robot
automountServiceAccountToken: false
# or in a Pod
# the Pod overrides the Service Account on conflict
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  serviceAccountName: build-robot
  automountServiceAccountToken: false

我可以更改安装路径吗?

您可以尝试如上所述禁用自动安装,然后在Pod规范中手动安装Secret:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: your-sa-token-secret