Amaç: kube-apiserver'ı Keycloak'u OIDC Identity Provider olarak kullanacak şekilde yapılandırmak ve kubelogin tabanlı kubeconfig ile kubectl erişimini sağlamak.
Ortam / Topoloji
| Bileşen | Değer |
|---|---|
| Kubernetes VM (control-plane) |
<ip_adresi> (RKE2, single-node, static pod) |
| Keycloak | Helm ile keycloak namespace'inde |
| Rancher | Helm ile cattle-system namespace'inde |
| Ingress Controller |
kube-system içindeki rke2-ingress-nginx (hostPort 80/443) |
| Keycloak host | keycloak.example.com |
| Rancher host | rancher.example.com |
| Kubernetes API | <ip_adresi>:6443 |
keycloak.example.comverancher.example.comgerçek DNS'te yoksa istemci makinede/etc/hosts'a<ip_adresi> keycloak.example.comve<ip_adresi> rancher.example.comolarak eklenmelidir.
1. Keycloak TLS Sertifikası
Adım 1: CA oluştur
kc-ca.key ve kc-ca.crt üretildi. basicConstraints: CA:TRUE ve keyUsage: keyCertSign ile CA olarak işaretlendi.
Adım 2: SAN config
san.cnf oluşturuldu, subjectAltName olarak DNS.1 = keycloak.example.com eklendi.
Adım 3: Server sertifikası
keycloak.key ve keycloak.csr üretildi. CSR, kc-ca.crt ile imzalanarak keycloak.crt elde edildi.
Adım 4: Keycloak proxy/hostname ayarları
RKE2 ingress hostPort 443 üzerinden yayın yaptığı için issuer'ın port içermemesi gerekiyor. Bu yüzden KC_HOSTNAME şu şekilde set edildi:
KC_PROXY_HEADERS=xforwardedKC_HOSTNAME=https://keycloak.example.com
/.well-known/openid-configuration ile issuer URL doğrulandı.
2. Keycloak Realm / Client / User / Group
Tüm işlemler Keycloak pod'u içinde kcadm.sh ile yapılır. Container FS read-only olabildiği için HOME=/tmp set edilmeli.
Realm: kubernetes adıyla oluşturuldu.
Client: kubernetes client ID'siyle oluşturuldu. Browser'sız kubeconfig için directAccessGrantsEnabled açık olmalı (password grant).
Groups claim: Token içinde groups claim'i gelmesi için oidc-group-membership-mapper eklendi (claim name: groups).
Group, User, Membership: k8s-admins grubu oluşturuldu. Kullanıcı oluşturuldu, şifresi set edildi (Temporary: Off) ve gruba eklendi.
3. kube-apiserver OIDC Yapılandırması
Yeni Kubernetes sürümlerinde
--oidc-ca-fileyerine AuthenticationConfiguration daha stabil bir yol. Biz de AuthenticationConfiguration kullandık.
Adım 1: Auth config dosyası
/etc/kubernetes/oidc-auth-config.yaml oluşturuldu. apiVersion: apiserver.config.k8s.io/v1beta1, kind: AuthenticationConfiguration formatında; issuer URL, audiences, CA sertifikası ve claim mapping'leri (preferred_username, groups) içeriyor.
Önemli nokta: issuer URL port içermemeli ve Keycloak'ın .well-known içindeki issuer ile birebir aynı olmalı.
Adım 2: RKE2'de apiserver'a bağlama
RKE2 kube-apiserver manifest'ini direkt editlemek yerine /etc/rancher/rke2/config.yaml kullanılır. Biz şu argümanı ekledik:
authentication-config=/etc/kubernetes/oidc-auth-config.yaml
RKE2 bunu static pod manifest'ine yansıtır.
Adım 3: Doğrulama
kube-apiserver args içinde --authentication-config=/etc/kubernetes/oidc-auth-config.yaml göründüğünde ve loglarda OIDC/TLS hatası kalmadığında entegrasyon başarılı.
4. İstemci Tarafı: kubelogin + kubeconfig
kubelogin kurulumu: GitHub releases'ten Linux amd64 zip indirildi, /usr/local/bin/kubelogin olarak kuruldu.
CA kopyalama: kc-ca.crt (Keycloak CA) istemci makinede ~/.kube/keycloak-ca.crt olarak tutulur.
kubeconfig: Her kullanıcı için ~/.kube/<kullaniciadi>-kubeconfig oluşturulur. exec plugin olarak kubelogin get-token tanımlanır.
Kubernetes cluster CA'sı için istemciye server-ca.crt kopyalanabilir ve kubeconfig'te certificate-authority: ile kullanılabilir (base64 gömmek şart değil).
5. Kullanıcı Bazlı kubeconfig Dağıtımı
Her kullanıcı için Keycloak'ta hesap açılır, o kullanıcının bilgilerini içeren bir kubeconfig üretilir ve dosya kullanıcıya verilir. Kullanıcı sadece bu dosyayla kubectl kullanır, tarayıcı açılmaz, başka bir şey bilmesine de gerek yoktur.
Kullanıcı oluşturma:
Keycloak UI'dan kubernetes realm'ı altında Users -> Add user ile oluşturulur. Credentials sekmesinden şifre set edilir (Temporary: Off). Required Actions boş olmalıdır.
kubeconfig üretme:
~/.kube/<kullaniciadi>-kubeconfig dosyası oluşturulur. exec plugin olarak kubelogin get-token tanımlandı; --grant-type=password, --username, --password, --oidc-client-secret ve --certificate-authority argümanları verilir. interactiveMode: Never ile tarayıcı açılması engellenir.
RBAC:
Her kullanıcı Kubernetes loglarında kendi adıyla görünür. Gruba göre ClusterRoleBinding veya namespace bazlı RoleBinding ile yetkilendirilir.
Test:
KUBECONFIG=~/.kube/<kullaniciadi>-kubeconfig kubectl auth whoami ile kullanıcının doğru kimlikle bağlandığı doğrulanır.
Top comments (0)