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ả