很明显,此行为是由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的更多部分,请告诉我。
答案 0 :(得分:1)
您做对了,Admission controller是通过Kubernetes API实现各种功能的主要贡献者。如上所述,Service Account还随Kubernetes集群中的某些接纳功能一起传播,最初与称为ServiceAccount
的特定接纳插件绑定。
根据官方的Kubernetes documentation,--enable-admission-plugins
configuration中包含特殊标志--disable-admission-plugins
和kube-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