Kubernetes Dashboard mit Keycloak OIDC: Unterschied zwischen den Versionen

Zur Navigation springen Zur Suche springen
K
keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
(23 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
__NOINDEX__
{{Infobox
{{Infobox
| Titel      = Test
| Titel      = Testumgebung
| Bildname  = Kubernetes_dashboard_with_metrics.png
| Bildname  =  
| Bildbreite =  
| Bildbreite =  
| Bildtext  =  
| Bildtext  =  
Zeile 12: Zeile 10:
| Style          =  
| Style          =  
| Feldstyle      =  
| Feldstyle      =  
| Feldname1 = OS    | Daten1 = AlmaLinux 8
| Feldname1 = OS    | Daten1 = AlmaLinux 8.7
| Feldname2 =     | Daten2 =  
| Feldname2 = Keycloak    | Daten2 = 20.0.2
| Feldname3 =     | Daten3 =  
| Feldname3 = Kubernetes    | Daten3 = 1.26.0
| Feldname4 = MetalLB    | Daten4 = 0.13.7
| Feldname5 = Ingress-Nginx    | Daten5 = 1.5.1
| Feldname6 = OAUTH2-Proxy    | Daten6 = 7.4.0
}}
}}


=== API-Server konfigurieren ===
=== API-Server konfigurieren ===
 
<syntaxhighlight lang="bash">
 
vi /etc/kubernetes/manifests/kube-apiserver.yaml
'# /etc/kubernetes/manifests/kube-apiserver.yaml<syntaxhighlight lang="yaml" line="1">
</syntaxhighlight><syntaxhighlight lang="yaml" line="1">
spec:
spec:
   containers:
   containers:
Zeile 35: Zeile 36:
'''Hinweis:'''
'''Hinweis:'''


''Wenn <code>oidc-username-claim</code> NICHT 'email' ist, wird standardmäßig die 'issuer-url' als Prefix benutzt (z.B. https://<my.keycloak.server>/realms/<Realm-Name>:<username>).''
''Wenn <code>oidc-username-claim</code> '''NICHT''' 'email' ist, wird standardmäßig die 'issuer-url' als Präfix vor den Benutzer gestellt (z.B. https://<my.keycloak.server>/realms/<Realm-Name>:<username>).''


''Um den Prefix zu dekativieren muss als Wert '-' angegeben werden.''
''Um den Präfix zu deaktivieren muss bei <code>oidc-username-prefix</code> der Wert '-' angegeben werden.''


=== Load Balancer installieren ===
=== Load Balancer installieren ===
Zeile 45: Zeile 46:


==== Ports in der Firewall öffnen ====
==== Ports in der Firewall öffnen ====
<syntaxhighlight lang="bash">
Sowohl auf dem Controller als auch den Worker-Nodes<syntaxhighlight lang="bash">
firewall-cmd --permanent --add-port=7472/tcp
firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/tcp
firewall-cmd --permanent --add-port=7946/udp
firewall-cmd --permanent --add-port=7946/udp
Zeile 54: Zeile 56:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml
</syntaxhighlight>address_pool.yaml<syntaxhighlight lang="yaml" line="1">
</syntaxhighlight>
address_pool.yaml
<syntaxhighlight lang="yaml" line="1">
apiVersion: metallb.io/v1beta1
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
kind: IPAddressPool
Zeile 81: Zeile 85:
</syntaxhighlight>
</syntaxhighlight>


=== Reverse Proxy installieren ===
=== Reverse Proxy installieren (ingress-nginx) ===
Reverse Proxy um mehrere Domains auf einer IP erreichbar zu machen.
Reverse Proxy um mehrere Domains auf einer IP erreichbar zu machen.


values.yaml<syntaxhighlight lang="yaml" line="1">
values.yaml
<syntaxhighlight lang="yaml" line="1">
controller:
controller:
   config:
   config:
     proxy-buffer-size: "16k"
     proxy-buffer-size: "8k"
</syntaxhighlight>Wenn header zu groß dann 50x Fehler. Deswegen auf 16k erhöhen<syntaxhighlight lang="bash">
   
    #extraArgs:
        #default-ssl-certificate: "default/my-tls-secret"
</syntaxhighlight>'''Hinweise:'''
 
''Bei Keycloak kann es vorkommen, dass mehr als 4 kb Daten über den Header gesendet werden.''
 
''Wenn der Header zu groß wird, bekommt man einen Fehler (502).''
 
''Deswegen erhöhen wir diesen direkt während der Installation auf 8 kb.''
 
 
 
''Für TLS benötigen wir ein 'Secret" mit dem "Privat Key" und dem "Public Certificate" für die Domain, die später für das Dashboard genutzt werden soll.''
 
''Dieses kann man als Standard, direkt in der Config für Ingress-Nginx hinerlegen oder später im Ingress definieren.''
 
 
'''Tipp:'''
 
Wenn man bei <code>default-ssl-certificate</code> ein Wildcard-Zertifikat (z.B. *.my-cluster.host) für den Cluster hinterlegt,
 
kann für jeden Ingress einfach eine Sub-Domain vergeben, die dann automatisch ein gültiges Zertifikat hat.
 
 
 
Installation starten:
<syntaxhighlight lang="bash">
helm upgrade --install ingress-nginx ingress-nginx \
helm upgrade --install ingress-nginx ingress-nginx \
   --repo https://kubernetes.github.io/ingress-nginx \
   --repo https://kubernetes.github.io/ingress-nginx \
Zeile 96: Zeile 128:




=== OAUTH2 Proxy installieren ===
Authentifizierung gegen Keyclok und Token Weiterleitung an Dashboard


 
values.yaml
'# oauth2-proxy installieren /
<syntaxhighlight lang="yaml" line="1">
 
=== OAUTH Proxy installieren ===
Authentifizierung gegen Keyclok und Token Weiterleitung an Dashboard
values.yaml<syntaxhighlight lang="yaml" line="1">
extraArgs:
extraArgs:
   provider: keycloak-oidc
   provider: keycloak-oidc
Zeile 122: Zeile 152:
   cookie-refresh: 4m # Zeit nach der ein neuer Access Token über den Refresh Token bezogen wird
   cookie-refresh: 4m # Zeit nach der ein neuer Access Token über den Refresh Token bezogen wird
   oidc-issuer-url: "https://<my.keycloak.server>/realms/<Realm-Name>"
   oidc-issuer-url: "https://<my.keycloak.server>/realms/<Realm-Name>"
   redirect-url: "https://<my.k8s.dashboard>/oauth2/callback"
   redirect-url: "https://<my.dashboard.url>/oauth2/callback"
   #whitelist-domain: ["*"]
   #whitelist-domain: ["*"]
   #allowed-group: ["*"]
   #allowed-group: ["*"]
Zeile 132: Zeile 162:
''Der Parameter <code>cookie-refresh</code> sollte kleiner als die "Access Token Lifespan" in Keycloak sein ("Realm Settings->Token").''
''Der Parameter <code>cookie-refresh</code> sollte kleiner als die "Access Token Lifespan" in Keycloak sein ("Realm Settings->Token").''


''<syntaxhighlight lang="bash">
 
Installation starten:
 
<syntaxhighlight lang="bash">
helm upgrade --install oauth2-proxy oauth2-proxy \
helm upgrade --install oauth2-proxy oauth2-proxy \
   --repo https://oauth2-proxy.github.io/manifests \
   --repo https://oauth2-proxy.github.io/manifests \
   --namespace kubernetes-dashboard \
   --namespace kubernetes-dashboard \
   -f values.yaml
   -f values.yaml
</syntaxhighlight>''
</syntaxhighlight>


=== Dem Keycloak Benutzer die Admin Rolle zuweisen ===
===Dem Keycloak Benutzer die Admin Rolle zuweisen===
oidc-role.yaml<syntaxhighlight lang="yaml">
oidc-role.yaml
<syntaxhighlight lang="yaml">
apiVersion: rbac.authorization.k8s.io/v1
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
kind: ClusterRoleBinding
Zeile 155: Zeile 189:
</syntaxhighlight>'''''Hinweis:'''''
</syntaxhighlight>'''''Hinweis:'''''


Der Benutzername (subjects.name) entspricht dem <code>oidc-username-claim</code> aus der "kube-apiserver.yaml".<syntaxhighlight lang="bash">
''Der Benutzername (subjects.name) entspricht dem'' <code>oidc-username-claim</code> ''aus der "kube-apiserver.yaml".''
<syntaxhighlight lang="bash">
kubectl apply -f oidc-role.yaml
kubectl apply -f oidc-role.yaml
</syntaxhighlight>
===Ingress erstellen===
<syntaxhighlight lang="yaml" line="1">
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
    nginx.ingress.kubernetes.io/auth-response-headers: "authorization"
  name: k8s-dashboard
  namespace: kubernetes-dashboard
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - my.dashboard.url
  rules:
  - host: my.dashboard.url
    http:
      paths:
      - backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443
        path: /
        pathType: Prefix
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-dashboard-oauth
  namespace: oauth2-proxy
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - my.dashboard.url
  rules:
  - host: my.dashboard.url
    http:
      paths:
      - backend:
          service:
            name: oauth2-proxy
            port:
              number: 80
        path: /oauth2
        pathType: Prefix
</syntaxhighlight><syntaxhighlight lang="bash">
kubectl apply -f ingress.yaml
</syntaxhighlight>
</syntaxhighlight>

Navigationsmenü