Sunday, January 19, 2025

[Kubernetes 16] Dashboard trong Kubernetes

-

Kubernetes Dashboard là công cụ trên nền Web, kết nối đến Kubernetes để thực hiện việc quản lý (giống kubectl), ưu điểm của nó là trực quan dễ sử dụng.

Dưới đây là link các phiên bản của dashboard.

https://github.com/kubernetes/dashboard/releases

Mình sử dụng phiên bản v2.7.0 nên mình sẽ download nó về bằng lệnh dưới

$ wget -O recommended.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

Sau khi download xong file, bạn mở file và chuyển đến phần Secret có tên kubernetes-dashboard-certs, tiến hành comment lại hoặc xoá bỏ chúng đi, đoạn cấu hình này để khởi tạo Secret cấu hình xác thực SSL khi truy cập Dashboard nhưng mình muốn tự chủ động tạo thủ công Secret có tên kubernetes-dashboard-certs thủ công từ certificates sinh ra từ OpenSSL.

# apiVersion: v1
# kind: Secret
# metadata:
#   labels:
#     k8s-app: kubernetes-dashboard
#   name: kubernetes-dashboard-certs
#   namespace: kubernetes-dashboard
# type: Opaque

Tìm đến service kubernetes-dashboard, chỗ spec thêm type: NodePort, nodePort: 30649 để chúng ta truy cập được từ mạng bên ngoài vào các pod.

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30649
  selector:
    k8s-app: kubernetes-dashboard

Sau khi thực hiện xong các thay đổi, ta triển khai nó

$ kubectl apply -f ./recommended.yaml 
Warning: resource namespaces/kubernetes-dashboard is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
namespace/kubernetes-dashboard configured
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard 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

Để lấy được port để truy cập url, ta get các services thuộc namespace kubernetes-dashboard, kết quả ta nhận được port được forward ra là port 30649

$ kubectl get svc -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.100.118.92   <none>        8000/TCP        4m56s
kubernetes-dashboard        NodePort    10.102.9.232    <none>        443:30649/TCP   4m57s

Vậy url của mình sẽ là

https://192.168.13.238:30649

Chúng ta sẽ tự tạo ra kubernetes-dashboard-certs bằng cách sau

Tạo thư mục chứa certs

$ mkdir -p /home/dashboard_certs/

Chạy đoạn mã đưới để lấy các file xác thực tls.key

$ openssl req -nodes -newkey rsa:2048 -keyout /home/dashboard_certs/tls.key -out /home/dashboard_certs/ca.csr -subj "/CN=dashboard.hoanghd.com"
Can't load /root/.rnd into RNG
140184557298112:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/root/.rnd
Generating a RSA private key
............+++++
..+++++
writing new private key to '/home/dashboard_certs/tls.key'
-----

Tiếp theo ta chạy lệnh sau để tạo ra file tls.crt

$ openssl x509 -req -sha256 -days 365 -in /home/dashboard_certs/ca.csr -signkey /home/dashboard_certs/tls.key -out /home/dashboard_certs/tls.crt
Signature ok
subject=CN = dashboard.hoanghd.com
Getting Private key

Kiểm ra các file ca.csr, tls.crt, tls.key đã được tạo

$ ls dashboard_certs/
ca.csr  tls.crt  tls.key

Tạo 1 namespace để triển khai Kubernetes dashboard

$ kubectl create namespace kubernetes-dashboard
namespace/kubernetes-dashboard created

Tạo kubernetes-dashboard-certs, nhớ trỏ đến thư mục chứa các file certs nhé, của mình là /home/dashboard_certs

$ kubectl create secret generic kubernetes-dashboard-certs --from-file=/home/dashboard_certs -n kubernetes-dashboard
secret/kubernetes-dashboard-certs created

Chúng ta có thể dùng lệnh describe để xác nhận lại kubernetes-dashboard-certs đã được tạo

$ kubectl describe secret/kubernetes-dashboard-certs --namespace kubernetes-dashboard
Name:         kubernetes-dashboard-certs
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
ca.csr:   907 bytes
tls.crt:  1025 bytes
tls.key:  1708 bytes

Hoặc cũng có thể dùng lệnh get secret để xác minh

$ kubectl get secret -n kubernetes-dashboard
NAME                         TYPE                                  DATA   AGE
default-token-6v6n9          kubernetes.io/service-account-token   3      110s
kubernetes-dashboard-certs   Opaque                                3      74s

Tạo ra file yaml như dưới để khởi tạo admin user

cat > /home/dashboard_certs/dashboard-adminuser.yaml << OEF
apiVersion: v1  
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
OEF

Ta triển khai nó

$ kubectl apply -f /home/dashboard_certs/dashboard-adminuser.yaml
serviceaccount/admin-user created

Tạo file dashboard_rbac.yaml với tác dụng để phân quyền cho admin user

cat > /home/dashboard_certs/dashboard_rbac.yaml << OEF
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
OEF

Triển khai file dashboard_rbac.yaml

$ kubectl apply -f /home/dashboard_certs/dashboard_rbac.yaml
clusterrolebinding.rbac.authorization.k8s.io/admin-user created

Dùng lệnh dưới để lấy Token đăng nhập trên trang dashboard nhé.

kubectl get secret -n kubernetes-dashboard $(kubectl get serviceaccount admin-user -n kubernetes-dashboard -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 --decode

Dùng trình duyệt truy cập url https://192.168.13.238:30649, chọn các đăng nhập bằng Token và nhập mã Token vào rồi bấm Sign in

Và đây là kết quả

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories