【问题标题】:How to create a Kubernetes ServiceAccount with token?如何使用令牌创建 Kubernetes ServiceAccount?
【发布时间】:2016-07-13 16:45:09
【问题描述】:

我正在尝试将 --admission-control=ServiceAccount 添加到我的 kube-apiserver 调用中,以便能够托管来自 kubernetes-ui 和 apiserver 的 https 连接。我在控制器管理器上得到这个。

Mar 25 18:39:51 master kube-controller-manager[1388]: I0325 18:39:51.425556 1388 event.go:211] Event(api.ObjectReference{Kind:"ReplicaSet", Namespace:"default", Name:"nginx4-3088538572", UID:"aefae1a6-f2b8-11e5-8269-0401bd450a01", APIVersion:"extensions", ResourceVersion:"252", FieldPath:""}): type: 'Warning' reason: 'FailedCreate' Error creating: pods "nginx4-3088538572-" is forbidden: no API token found for service account default/default, retry after the token is automatically created and added to the service account

现在我的默认服务帐户如下所示

cesco@desktop: ~/code/go/src/bitbucket.org/cescoferraro/cluster/terraform on master [+!?]
$ kubectl get serviceaccount default -o wide
NAME      SECRETS   AGE
default   0         2m
cesco@desktop: ~/code/go/src/bitbucket.org/cescoferraro/cluster/terraform on master [+!?]
$ kubectl get serviceaccount default -o json
{
    "kind": "ServiceAccount",
    "apiVersion": "v1",
    "metadata": {
        "name": "default",
        "namespace": "default",
        "selfLink": "/api/v1/namespaces/default/serviceaccounts/default",
        "uid": "eaa3c6e1-f2cd-11e5-973f-0401bd52ec01",
        "resourceVersion": "30",
        "creationTimestamp": "2016-03-25T21:09:52Z"
    }
}

我正在使用令牌对 Kubernetes 进行身份验证,并且整个集群都在 https 上运行。

控制器管理器

ExecStart=/opt/bin/kube-controller-manager \
                              --address=0.0.0.0 \
                              --root-ca-file=/home/core/ssl/ca.pem \
                              --service-account-private-key-file=/home/core/ssl/kube-key.pem  \
                              --master=https://${COREOS_PRIVATE_IPV4}:6443 \
                              --logtostderr=true \
                              --kubeconfig=/home/core/.kube/config  \
                              --cluster-cidr=10.132.0.0/16 \
                              --register-retry-count 100

APISERVER

ExecStart=/opt/bin/kube-apiserver \
                          --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota \
                          --logtostderr=true  \
                          --insecure-bind-address=${MASTER_PRIVATE} \
                          --insecure-port=8080  \
                          --bind-address=0.0.0.0  \
                          --secure-port=6443  \
                          --runtime-config=api/v1 \
                          --allow-privileged=true \
                          --service-cluster-ip-range=10.100.0.0/16 \
                          --advertise-address=${MASTER_PUBLIC} \
                          --token-auth-file=/data/kubernetes/token.csv \
                          --etcd-cafile=/home/core/ssl/ca.pem   \
                          --etcd-certfile=/home/core/ssl/etcd1.pem  \
                          --etcd-keyfile=/home/core/ssl/etcd1-key.pem \
                          --etcd-servers=https://${MASTER_PRIVATE}:2379,https://${DATABASE_PRIVATE}:2379 \
                          --cert-dir=/home/core/ssl \
                          --client-ca-file=/home/core/ssl/ca.pem \
                          --tls-cert-file=/home/core/ssl/kubelet.pem \
                          --tls-private-key-file=/home/core/ssl/kubelet-key.pem \
                          --kubelet-certificate-authority=/home/core/ssl/ca.pem \
                          --kubelet-client-certificate=/home/core/ssl/kubelet.pem \
                          --kubelet-client-key=/home/core/ssl/kubelet-key.pem \
                          --kubelet-https=true

.kube/config

ExecStart=/opt/bin/kubectl config set-cluster CLUSTER  \
                                        --server=https://${MASTER_PRIVATE}:6443 \
                                        --certificate-authority=/home/core/ssl/ca.pem
ExecStart=/opt/bin/kubectl config set-credentials admin  \
                                        --token=elezxaMiqXVcXXU7lRYZ4akrlAtxY5Za \
                                        --certificate-authority=/home/core/ssl/ca.pem \
                                        --client-key=/home/core/ssl/kubelet-key.pem \
                                        --client-certificate=/home/core/ssl/kubelet.pem
ExecStart=/opt/bin/kubectl config set-context default-system \
                                        --cluster=CLUSTER \
                                        --user=admin
ExecStart=/opt/bin/kubectl config use-context default-system

更新 1

根据@Jordan Liggitt 的回答,我在 apiserver 调用中添加了 --service-account-key-file=/home/core/ssl/kubelet-key.pem 但现在我得到了

Mar 26 11:19:30 master kube-apiserver[1874]: F0326 11:19:30.556591    1874 server.go:410] Invalid Authentication Config: asn1: structure error: tags don't match (16 vs {class:0 tag:2 length:1 isCompound:false}) {optional:false explicit:false application:false defaultValue:<nil> tag:<nil> stringType:0 set:false omitEmpty:false} tbsCertificate @2

【问题讨论】:

  • 不应该与传递给控制器​​管理器(kube-key.pem)的文件名匹配吗?
  • 我已经按照你说的方式测试过了,错误依旧。现在我在所有 kubernetes 守护进程的所有标志中使用相同的证书。并且错误仍然存​​在。
  • 现在知道了。现在我正在使用 cluster/saltbase/salt/generate-cert/make-ca-cert.sh 来制作证书,这些问题都消失了。我还没有完全让仪表板工作,但至少正在创建默认密钥并将其安装在每个 pod 上。

标签: kubernetes kubernetes-health-check


【解决方案1】:

使用 1.6 版本,如果您在创建服务帐户时提到它,您可以自动挂载令牌,如下所示:

apiVersion: v1 kind: ServiceAccount metadata: name: sysdig automountServiceAccountToken: true

【讨论】:

    【解决方案2】:

    确保使用服务帐户密钥(用于签署生成的服务帐户令牌)启动控制器管理器,并使用相应的公钥(用于在身份验证期间验证令牌)启动 API 服务器

    【讨论】:

    • Liggit 我用更多信息更新了我的问题。我正在使用 TOKEN=$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64 | tr 创建 --token-auth-file=/data/kubernetes/token.csv -d "=+/" | dd bs=32 count=1 2>/dev/null)
    • 令牌身份验证 CSV 文件与服务帐户令牌无关。我在 apiserver args 中没有看到服务帐户密钥 arg。
    • @JordanLiggitt 有没有办法将令牌生成器卸载到 Kube 中的某些外部 JWT 提供程序?我们正在寻求为此使用外部(联合)提供程序。看到这个issue
    猜你喜欢
    • 2022-06-16
    • 2021-02-11
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2021-09-30
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多