Kubernetes: Dashboard’un Ubuntu 22.04/20.04’e Kurulumu

Bu adım adım kılavuz, Kubernetes kontrol panelini Ubuntu 22.04/20.04’e kurmanın kolay bir yolunu sunar. Kubernetes Dashboard’u Ubuntu 22.04/20.04’e yüklemek, Kubernetes kümelerinizi verimli bir şekilde yönetmenize ve izlemenize olanak tanıyan basit bir işlemdir.

Kubernetes Dashboard’u Ubuntu 22.04/20.04’e Kurmak

Önkoşullar

Kubernetes kontrol panelini kurmak için bir işlev Kubernetes kümesine sahip olmanız gerekir.

Ubuntu’da Kubernetes kümesinin nasıl kurulacağına ilişkin önceki kılavuzumuza göz atabilirsiniz.

 

Kubernetes Dashboard’u Küme Sunucusuna Yükleme

Çoklu bir kümeniz varsa Kubernetes kontrol panelini kontrol düzleminden kurmanız önerilir.

Bu nedenle K8s kümesi ana düğümünde Kubernetes kontrol panelini yüklemek için aşağıdaki komutu çalıştırın.

VER değişkeninin değerini Kubernetes kontrol panelinin geçerli yayın sürümüyle değiştirin.

VER=2.7.0
VER=2.7.0 && kubectl apply -f \
https://raw.githubusercontent.com/kubernetes/dashboard/v${VER}/aio/deploy/recommended.yaml

Örnek kurulum çıktısı;


namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created

Kontrol Paneli Kurulumunu Doğrulayın

Kontrol paneli yükleme komutu, kubernetes-dashboard adı verilen bir ad alanı altında Kubernetes kontrol paneli ve kontrol paneli ölçümleriyle ilgili Pod’lar oluşturacaktır.

kubectl get namespaces

NAME                   STATUS   AGE
calico-apiserver       Active   17h
calico-system          Active   17h
default                Active   18h
kube-node-lease        Active   18h
kube-public            Active   18h
kube-system            Active   18h
kubernetes-dashboard   Active   3m33s
tigera-operator        Active   17h

Bu ad alanındaki pod’ları aşağıdaki gibi görüntüleyebilirsiniz;

kubectl get pods -n kubernetes-dashboard

NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-5cb4f4bb9c-k2fjk   1/1     Running   0          2m46s
kubernetes-dashboard-6967859bff-qtm52        1/1     Running   0          2m46s

Bir bölmenin hangi düğümde çalıştığını öğrenmek istiyorsanız -o geniş seçeneğini kullanın.

kubectl get pods -n kubernetes-dashboard -o wide

NAME                                         READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
dashboard-metrics-scraper-5cb4f4bb9c-qj4cx   1/1     Running   0          44m   10.100.196.133   node01   <none>           <none>
kubernetes-dashboard-6967859bff-2ftjt        1/1     Running   0          44m   10.100.186.197   node03   <none>           <none>

Aşağıdaki komutu çalıştırarak Kubernetes kontrol paneli hakkında daha fazla ayrıntıya ulaşabilirsiniz;

kubectl describe pod kubernetes-dashboard-6967859bff-qtm52 -n kubernetes-dashboard

Name:             kubernetes-dashboard-6967859bff-qtm52
Namespace:        kubernetes-dashboard
Priority:         0
Service Account:  kubernetes-dashboard
Node:             node01/192.168.56.120
Start Time:       Sun, 21 May 2023 13:15:52 +0000
Labels:           k8s-app=kubernetes-dashboard
                  pod-template-hash=6967859bff
Annotations:      cni.projectcalico.org/containerID: 60184809005e6b9197f13b6587042b10ff659f6a55e5e56ff71c0d77aa5ab168
                  cni.projectcalico.org/podIP: 10.100.196.132/32
                  cni.projectcalico.org/podIPs: 10.100.196.132/32
Status:           Running
SeccompProfile:   RuntimeDefault
IP:               10.100.196.132
IPs:
  IP:           10.100.196.132
Controlled By:  ReplicaSet/kubernetes-dashboard-6967859bff
Containers:
  kubernetes-dashboard:
    Container ID:  containerd://f6055806fbe4dcbcd94c30201b3c8bfab1c536e4b5ba5e5dc17cfbf247e8ae46
    Image:         kubernetesui/dashboard:v2.7.0
    Image ID:      docker.io/kubernetesui/dashboard@sha256:2e500d29e9d5f4a086b908eb8dfe7ecac57d2ab09d65b24f588b1d449841ef93
    Port:          8443/TCP
    Host Port:     0/TCP
    Args:
      --auto-generate-certificates
      --namespace=kubernetes-dashboard
    State:          Running
      Started:      Sun, 21 May 2023 13:16:45 +0000
    Ready:          True
    Restart Count:  0
    Liveness:       http-get https://:8443/ delay=30s timeout=30s period=10s #success=1 #failure=3
    Environment:    
    Mounts:
      /certs from kubernetes-dashboard-certs (rw)
      /tmp from tmp-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-667hl (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kubernetes-dashboard-certs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  kubernetes-dashboard-certs
    Optional:    false
  tmp-volume:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  
  kube-api-access-667hl:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              kubernetes.io/os=linux
Tolerations:                 node-role.kubernetes.io/master:NoSchedule
                             node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  6m6s   default-scheduler  Successfully assigned kubernetes-dashboard/kubernetes-dashboard-6967859bff-qtm52 to node01
  Normal  Pulling    6m4s   kubelet            Pulling image "kubernetesui/dashboard:v2.7.0"
  Normal  Pulled     5m13s  kubelet            Successfully pulled image "kubernetesui/dashboard:v2.7.0" in 50.912542693s (50.912558356s including waiting)
  Normal  Created    5m13s  kubelet            Created container kubernetes-dashboard
  Normal  Started    5m13s  kubelet            Started container kubernetes-dashboard

Harici Erişim için Kubernetes Kontrol Panelini Açığa Çıkarın

Kubernetes kontrol panelinin kurulumu aynı zamanda Kubernetes kontrol paneli uygulamasının ağda gösterilmesinden sorumlu olan bir hizmet de oluşturur.

kubectl get services -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
dashboard-metrics-scraper   ClusterIP   10.109.231.10    <none>        8000/TCP   12m
kubernetes-dashboard        ClusterIP   10.110.200.227   <none>        443/TCP    12m

Kubernetes hizmetinin ağdaki bir uygulamayı kullanıma sunmasının farklı yolları vardır. En yaygın olanları;

  • ClusterIP – Bu, varsayılan hizmet türüdür ve uygulamayı kümedeki dahili bir IP adresinde kullanıma sunar. Bu tür hizmete yalnızca küme içinden erişilebilir.
  • NodePort – Bu hizmet türü, uygulamayı NAT kullanarak kümedeki seçilen her Düğümün aynı bağlantı noktasında kullanıma sunar. Bu, <NodeIP>:<NodePort> kullanılarak hizmetin küme dışından erişilebilir olmasını sağlar. Varsayılan NodePort aralığı 30000-32767’dir.
  • LoadBalancer – Bu hizmet türü, mevcut bulutta (destekleniyorsa) harici bir yük dengeleyici oluşturur ve hizmete sabit, harici bir IP atar. Bu, hizmete harici IP adresi kullanılarak küme dışından erişilebilmesini sağlar. Harici IP adresi bulut sağlayıcı tarafından atanır ve Kubernetes tarafından yönetilmez.

Varsayılan olarak Kubernetes kontrol paneli, ClusterIP hizmet türü aracılığıyla kullanıma sunulur ve bu nedenle yalnızca küme içinden erişilebilir.

Kubernetes kontrol paneline kolayca erişebilmek için, uygulamayı NodePort hizmet türü aracılığıyla gösterecek şekilde hizmeti yeniden yapılandıracağım.

kubectl edit service kubernetes-dashboard -n kubernetes-dashboard

Varsayılan olarak Kubernetes kontrol paneli bu şekilde ayarlanır;


# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"k8s-app":"kubernetes-dashboard"},"name":"kubernetes-dashboard","namespace":"kubernetes-dashboard"},"spec":{"ports":[{"port":443,"targetPort":8443}],"selector":{"k8s-app":"kubernetes-dashboard"}}}
  creationTimestamp: "2023-05-21T13:15:52Z"
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "28313"
  uid: c70844c4-3795-4491-9986-3dab8c1090d2
spec:
  clusterIP: 10.110.200.227
  clusterIPs:
  - 10.110.200.227
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

Bu hizmeti güncelleyeceğiz ve hizmet türünü ClusterIP’den NodePort’a değiştirip statik Node bağlantı noktasına bağlayacağız.

Spec: bölümünün altına şunu ekledik;

  • nodePort: 30001 under ports.
  • changed type: ClusterIP to type: NodePort.

...
spec:
  clusterIP: 10.110.200.227
  clusterIPs:
  - 10.110.200.227
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
    nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

Kümedeki bir hizmet tarafından halihazırda kullanılmakta olan bir düğüm bağlantı noktasını atamadığınızdan emin olun.

Aşağıdaki komutu kullanarak şu anda hangi Node portlarının kullanımda olduğunu kontrol edebilirsiniz;

kubectl get services --all-namespaces -o jsonpath='{range .items[*]}{.spec.ports[*].nodePort}{"\n"}{end}'

Hizmeti kaydedin ve çıkın.

Değişiklikler otomatik olarak uygulanacaktır. Hizmeti tekrar kontrol ederek onaylayabilirsiniz;

kubectl get services -n kubernetes-dashboard

NAME                        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.109.231.10    <none>        8000/TCP        44m
kubernetes-dashboard        NodePort    10.110.200.227   <none>        443:30001/TCP   44m

Tür artık NodePort olarak değiştirildi ve dahili bağlantı noktası 443, herhangi bir küme düğümünün IP’leri aracılığıyla erişilebilen bağlantı noktası 30001/tcp ile eşlendi.

Kubernetes Kontrol Paneli Yönetici Kullanıcı Hesabı Oluşturun

Kullanıcı oluşturun ve yönetici dosyalarını atayın

Kubernetes kontrol paneli varsayılan kullanıcı hesabıyla birlikte gelmez. Yönetici kullanıcı hesabı oluşturmak için aşağıdaki gibi bir hizmet hesabı manifest dosyası oluşturun;

vim kubernetes-dashboard-admin-user.yml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

Hesabı oluşturun;

kubectl apply -f kubernetes-dashboard-admin.yml

Aşağıdaki komutu kullanarak hizmet hesaplarını listeleyebilirsiniz;

kubectl get serviceaccounts -n kubernetes-dashboard

Erişim Token Oluşturma

Hizmet hesabı, Kubernetes kontrol panelinde oturum açmak için kullanılabilecek bir belirteç gerektirir. Yukarıda oluşturduğumuz dashadmin servis hesabına token oluşturmak için aşağıdaki komutu çalıştırın;

kubectl create token admin-user -n kubernetes-dashboard

Böyle bir dize elde edeceksiniz;

eyJhbGciOiJSUzI1NiIsImtpZCI6IkVad2xuTHZFb0RSZ3VxazJObHRUeUpTV1cya0l6a21KRERvSmZTNG9aQzgifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNjg0NzM3MjYzLCJpYXQiOjE2ODQ3MzM2NjMsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiOGJhZWVkYjQtMGMyOC00MDY1LTgxZDctZjY4MTk2YzBiNWFjIn19LCJuYmYiOjE2ODQ3MzM2NjMsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn0.u_rFMGQPfWKybODPMfnZNnB8HeycXo5cTfB1ga4RXNE4YMZcmRv6nTseNtz4CvgQEvAMAGdgG0BaZSdUPMx1aiUTNwf4mxF3O8n9E4P7z_6kE0NnbWDg14j9jJpAKfN7G_EIY7fngTQ4_5L94teLWKBYKnwlSL2aZCVPtTQ5IlCcO8YHM8AZaoHxMdBICMY_doiWwxLRsXVMNc3FcdQN6W88ALupB9r8RPIEkqyxFcQLK0pofCsX2QImSyV4VNxyiMhQ9x-ONJIYyz0pVehiXQUGqWHUI8y05VAYZzjWIMOEEjn3oA00zc3gvp01Z17t-vAh9JMYfqE92zBruSFc2w

Kubernetes Kontrol Paneline Erişim

Artık Kubernetes kontrol panelinize, 30001/tcp bağlantı noktasındaki kümedeki herhangi bir düğüm IP’sini ve HTTPS, https://Node-IP:30001’i kullanarak tarayıcınızdan erişebilirsiniz.

Elbette güvenli olmayan SSL sertifikası kullanımını kabul edin ve devam edin.

Token’ı seçin ve yukarıda oluşturulan token’ı yapıştırın ve oturum açmaya devam edin.

Ve işte gidiyorsun! Kubernetes kontrol paneline iniş,

Artık kümenizi Kubernetes kontrol panelinden yönetebilmelisiniz. Daha fazlasını keşfedin!

 

 

Yazının orijinalini buradan okuyabilirsiniz.