In Kubernetes können Benutzerkonten auf verschiedene Arten erstellt werden. Die zwei gängigsten Methoden sind: 1. Service Accounts mit Token-Authentifizierung 2. Zertifikatsbasierte Authentifizierung
Dieser Artikel beschreibt den praktischen Prozess zur Erstellung eines Benutzerkontos mittels Service Account und die Konfiguration einer entsprechenden kubeconfig-Datei mit Token-Authentifizierung.
Ein Service Account ist eine Identität, die Pod-Workloads und externen Benutzern zugewiesen werden kann.
# Erstellen eines Service Accounts in einem bestimmten Namespace
kubectl create serviceaccount benutzer-sa -n mein-namespaceFalls der Namespace noch nicht existiert, erstellen Sie ihn zuerst:
kubectl create namespace mein-namespaceNachdem der Service Account erstellt wurde, müssen diesem entsprechende Berechtigungen zugewiesen werden:
# rolle.yaml - für einen einzelnen Namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: benutzer-rolle
namespace: mein-namespace
rules:
- apiGroups: ["", "apps", "batch"]
resources: ["pods", "deployments", "services", "jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]Oder für clusterweiten Zugriff:
# clusterrolle.yaml - für clusterweiten Zugriff
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: benutzer-clusterrolle
rules:
- apiGroups: ["", "apps", "batch"]
resources: ["pods", "deployments", "services", "jobs", "namespaces"]
verbs: ["get", "list", "watch"]
- apiGroups: ["", "apps"]
resources: ["pods", "deployments", "services"]
verbs: ["create", "update", "patch", "delete"]Verbinden Sie den Service Account mit der erstellten Rolle:
# rolebinding.yaml - für einen einzelnen Namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: benutzer-rolebinding
namespace: mein-namespace
subjects:
- kind: ServiceAccount
name: benutzer-sa
namespace: mein-namespace
roleRef:
kind: Role
name: benutzer-rolle
apiGroup: rbac.authorization.k8s.ioOder für clusterweiten Zugriff:
# clusterrolebinding.yaml - für clusterweiten Zugriff
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: benutzer-clusterrolebinding
subjects:
- kind: ServiceAccount
name: benutzer-sa
namespace: mein-namespace
roleRef:
kind: ClusterRole
name: benutzer-clusterrolle
apiGroup: rbac.authorization.k8s.ioAnwenden der RBAC-Konfigurationen:
kubectl apply -f rolle.yaml
kubectl apply -f rolebinding.yaml
# oder für clusterweiten Zugriff
# kubectl apply -f clusterrolle.yaml
# kubectl apply -f clusterrolebinding.yamlIn Kubernetes 1.24 und höher werden Tokens für Service Accounts nicht mehr automatisch als langlebige Secrets erstellt. Stattdessen müssen Sie ein Token explizit generieren:
# Für temporäres Token (1 Stunde gültig)
kubectl create token benutzer-sa -n mein-namespace
# Für ein langlebiges Token
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: benutzer-sa-token
namespace: mein-namespace
annotations:
kubernetes.io/service-account.name: benutzer-sa
type: kubernetes.io/service-account-token
EOFDas Token für ein langlebiges Secret erhalten Sie so:
TOKEN=$(kubectl get secret benutzer-sa-token -n mein-namespace -o jsonpath='{.data.token}' | base64 --decode)
echo $TOKENMit dem generierten Token können wir nun eine kubeconfig-Datei erstellen:
# Cluster-Informationen abrufen
CLUSTER_NAME="mein-cluster"
API_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
CA_CERT=$(kubectl config view --minify --flatten -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
# Neue kubeconfig-Datei erstellen
cat <<EOF > benutzer-sa-kubeconfig
apiVersion: v1
kind: Config
clusters:
- name: ${CLUSTER_NAME}
cluster:
server: ${API_SERVER}
certificate-authority-data: ${CA_CERT}
contexts:
- name: benutzer-sa@${CLUSTER_NAME}
context:
cluster: ${CLUSTER_NAME}
namespace: mein-namespace
user: benutzer-sa
current-context: benutzer-sa@${CLUSTER_NAME}
users:
- name: benutzer-sa
user:
token: ${TOKEN}
EOFAlternativ können Sie die kubeconfig auch mit kubectl-Befehlen erstellen:
# Erstellen einer leeren kubeconfig
touch benutzer-kubeconfig
# Cluster hinzufügen
kubectl config --kubeconfig=benutzer-kubeconfig set-cluster ${CLUSTER_NAME} \
--server=${API_SERVER} \
--certificate-authority-data=${CA_CERT} \
--embed-certs=true
# Benutzer mit Token hinzufügen
kubectl config --kubeconfig=benutzer-kubeconfig set-credentials benutzer-sa \
--token=${TOKEN}
# Kontext hinzufügen
kubectl config --kubeconfig=benutzer-kubeconfig set-context benutzer-sa@${CLUSTER_NAME} \
--cluster=${CLUSTER_NAME} \
--user=benutzer-sa \
--namespace=mein-namespace
# Aktuellen Kontext setzen
kubectl config --kubeconfig=benutzer-kubeconfig use-context benutzer-sa@${CLUSTER_NAME}