52 Benutzerkonten erstellen und kubeconfig konfigurieren

52.1 Einführung

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.

52.2 Erstellen eines Service Accounts

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-namespace

Falls der Namespace noch nicht existiert, erstellen Sie ihn zuerst:

kubectl create namespace mein-namespace

52.3 Rechtevergabe mit RBAC

Nachdem der Service Account erstellt wurde, müssen diesem entsprechende Berechtigungen zugewiesen werden:

52.3.1 Erstellen einer Role oder ClusterRole

# 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"]

52.3.2 Erstellen eines RoleBinding oder ClusterRoleBinding

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.io

Oder 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.io

Anwenden 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.yaml

52.4 Token für den Service Account generieren

In 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
EOF

Das 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 $TOKEN

52.5 kubeconfig-Datei erstellen

Mit 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}
EOF

Alternativ 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}