티스토리 뷰

728x90
반응형

이번 포스팅에서는 Kubernetes Dashboard를 설치해 보겠습니다.

CLI 환경이 충분히 익숙한 많은 관리자, 운영자 분들이 있지만, 보다 유저 편의성을 강조하기 위한 Kubernetes 대시보드는 필수적인 컨포넌트라고 볼 수 있습니다.

지난 Master Node 설치 과정은 아래를 참고하세요.

 

[Container Management] Kubernetes Master Node 설치

 

# 참고 URL : Kubernetes 설치 메뉴얼

https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

Kubernetes Dashboard 설치

1) Dashboard 설치

- 설치는 kubernetes install을 위한 yaml파일로 손쉽게 진행할 수 있습니다.

[root@guruson ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta1/aio/deploy/recommended.yaml 
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/kubernetes-metrics-scraper created 
[root@guruson ~]# 

2) dashboard namespace 확인

- 다음과 같이 Kubernetes dashboard가 추가되었음을 확인할 수 있습니다.

 

[root@guruson ~]# kubectl get pods --all-namespaces
NAMESPACE              NAME                                          READY     STATUS    RESTARTS   AGE
kube-system            coredns-5c98db65d4-hvmnp                      1/1       Running   0          26m
kube-system            coredns-5c98db65d4-p72lb                      1/1       Running   0          26m
kube-system            etcd-guruson                                  1/1       Running   0          25m
kube-system            kube-apiserver-guruson                        1/1       Running   0          25m
kube-system            kube-controller-manager-guruson               1/1       Running   0          24m
kube-system            kube-proxy-7plbr                              1/1       Running   0          26m
kube-system            kube-scheduler-guruson                        1/1       Running   0          25m
kube-system            weave-net-9g2ng                               2/2       Running   0          21m
kubernetes-dashboard   kubernetes-dashboard-5c8f9556c4-2kvdw         1/1       Running   0          11m
kubernetes-dashboard   kubernetes-metrics-scraper-86456cdd8f-ppjv5   1/1       Running   0          11m
[root@guruson ~]# docker ps -a
CONTAINER ID        IMAGE                                                                                                            COMMAND                  CREATED             STATUS              PORTS               NAMES
8be33a0045e9        docker.io/kubernetesui/dashboard@sha256:be8b4e180f7325c721acb5adba366ee30a7fce36beea344dbadf6d0f8534b70e         "/dashboard --inse..."   11 minutes ago      Up 11 minutes                           k8s_kubernetes-dashboard_kubernetes-dashboard-5c8f9556c4-2kvdw_kubernetes-dashboard_dc89d589-dfab-408e-ac5c-d986ea5c6224_0
dfef7d934e1f        docker.io/kubernetesui/metrics-scraper@sha256:d62574b33b50e1af00ce5e6ec4301491ae97288f7b7167a46a49ee480a8250a4   "/metrics-sidecar"       11 minutes ago      Up 11 minutes                           k8s_kubernetes-metrics-scraper_kubernetes-metrics-scraper-86456cdd8f-ppjv5_kubernetes-dashboard_92e7c881-3ab1-429d-b4c3-b9dde0577431_0
650439dd19d1        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 11 minutes ago      Up 11 minutes                           k8s_POD_kubernetes-metrics-scraper-86456cdd8f-ppjv5_kubernetes-dashboard_92e7c881-3ab1-429d-b4c3-b9dde0577431_0
967b4fb56150        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 11 minutes ago      Up 11 minutes                           k8s_POD_kubernetes-dashboard-5c8f9556c4-2kvdw_kubernetes-dashboard_dc89d589-dfab-408e-ac5c-d986ea5c6224_0
d6bd6d76be83        eb516548c180                                                                                                     "/coredns -conf /e..."   21 minutes ago      Up 21 minutes                           k8s_coredns_coredns-5c98db65d4-p72lb_kube-system_5e5e524b-debf-4318-a0e0-0ce09bb2007d_0
f3f54a3e3264        eb516548c180                                                                                                     "/coredns -conf /e..."   21 minutes ago      Up 21 minutes                           k8s_coredns_coredns-5c98db65d4-hvmnp_kube-system_2b5eb15f-997a-4e22-ae7a-18e4aa63900e_0
a74676aa9002        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 21 minutes ago      Up 21 minutes                           k8s_POD_coredns-5c98db65d4-p72lb_kube-system_5e5e524b-debf-4318-a0e0-0ce09bb2007d_0
16e36b525775        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 21 minutes ago      Up 21 minutes                           k8s_POD_coredns-5c98db65d4-hvmnp_kube-system_2b5eb15f-997a-4e22-ae7a-18e4aa63900e_0
95f7065c7800        5ce48e0d813c                                                                                                     "/usr/bin/weave-npc"     21 minutes ago      Up 21 minutes                           k8s_weave-npc_weave-net-9g2ng_kube-system_7ca1b168-26e9-4e30-89c5-731fd4492a17_0
bf40f0aaca75        f04a043bb67a                                                                                                     "/home/weave/launc..."   21 minutes ago      Up 21 minutes                           k8s_weave_weave-net-9g2ng_kube-system_7ca1b168-26e9-4e30-89c5-731fd4492a17_0
c15a632910d4        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 21 minutes ago      Up 21 minutes                           k8s_POD_weave-net-9g2ng_kube-system_7ca1b168-26e9-4e30-89c5-731fd4492a17_0
553b2f5013c8        89a062da739d                                                                                                     "/usr/local/bin/ku..."   26 minutes ago      Up 26 minutes                           k8s_kube-proxy_kube-proxy-7plbr_kube-system_f946a39f-b320-4d7e-80be-8ade3a224eec_0
bd2e127e576c        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 26 minutes ago      Up 26 minutes                           k8s_POD_kube-proxy-7plbr_kube-system_f946a39f-b320-4d7e-80be-8ade3a224eec_0
8273ba04d071        b0b3c4c404da                                                                                                     "kube-scheduler --..."   26 minutes ago      Up 26 minutes                           k8s_kube-scheduler_kube-scheduler-guruson_kube-system_ecae9d12d3610192347be3d1aa5aa552_0
50819117a16c        68c3eb07bfc3                                                                                                     "kube-apiserver --..."   26 minutes ago      Up 26 minutes                           k8s_kube-apiserver_kube-apiserver-guruson_kube-system_771894cf22aa788ac60030c63ac93c0a_0
ef2e5b80418f        2c4adeb21b4f                                                                                                     "etcd --advertise-..."   26 minutes ago      Up 26 minutes                           k8s_etcd_etcd-guruson_kube-system_739bfe2c63b2d1d1b1e833c60fd75422_0
34dc84306624        d75082f1d121                                                                                                     "kube-controller-m..."   26 minutes ago      Up 26 minutes                           k8s_kube-controller-manager_kube-controller-manager-guruson_kube-system_1eef4eca35083fec456d0af4bccd851c_0
eb959a163fa1        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 26 minutes ago      Up 26 minutes                           k8s_POD_kube-scheduler-guruson_kube-system_ecae9d12d3610192347be3d1aa5aa552_0
3825e239a71e        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 26 minutes ago      Up 26 minutes                           k8s_POD_kube-controller-manager-guruson_kube-system_1eef4eca35083fec456d0af4bccd851c_0
0941ac568e1b        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 26 minutes ago      Up 26 minutes                           k8s_POD_etcd-guruson_kube-system_739bfe2c63b2d1d1b1e833c60fd75422_0
9014baf49b6c        k8s.gcr.io/pause:3.1                                                                                             "/pause"                 26 minutes ago      Up 26 minutes                           k8s_POD_kube-apiserver-guruson_kube-system_771894cf22aa788ac60030c63ac93c0a_0
[root@guruson ~]# docker images
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
kuard-build                                              latest              9fd8efe225a6        7 days ago          433 MB
<none>                                                   <none>              6fdfd14725b8        8 days ago          5.58 MB
k8s.gcr.io/kube-scheduler                                v1.15.1             b0b3c4c404da        13 days ago         81.1 MB
k8s.gcr.io/kube-controller-manager                       v1.15.1             d75082f1d121        13 days ago         159 MB
k8s.gcr.io/kube-proxy                                    v1.15.1             89a062da739d        13 days ago         82.4 MB
k8s.gcr.io/kube-apiserver                                v1.15.1             68c3eb07bfc3        13 days ago         207 MB
docker.io/golang                                         1.12-alpine         6b21b4c6e7a3        2 weeks ago         350 MB
docker.io/alpine                                         latest              b7b28af77ffe        2 weeks ago         5.58 MB
docker.io/kubernetesui/dashboard                         v2.0.0-beta1        4640949a39e6        3 weeks ago         64.6 MB
docker.io/weaveworks/weave-kube                          2.5.2               f04a043bb67a        2 months ago        148 MB
docker.io/weaveworks/weave-npc                           2.5.2               5ce48e0d813c        2 months ago        49.6 MB
docker.io/openshift/origin-node                          v3.11               14d965ab72d5        3 months ago        1.17 GB
docker.io/openshift/origin-control-plane                 v3.11               42f38837c3d6        3 months ago        829 MB
docker.io/openshift/origin-cli                           v3.11               3d6b03d3fd9c        3 months ago        384 MB
docker.io/openshift/origin-hyperkube                     v3.11               ba4772ad4b1e        3 months ago        509 MB
docker.io/openshift/origin-pod                           v3.11               91915f601106        3 months ago        262 MB
docker.io/openshift/origin-hypershift                    v3.11               dcab472bf75a        3 months ago        549 MB
docker.io/kubernetesui/metrics-scraper                   v1.0.0              44390ebe2b73        3 months ago        36.8 MB
k8s.gcr.io/coredns                                       1.3.1               eb516548c180        6 months ago        40.3 MB
k8s.gcr.io/etcd                                          3.3.10              2c4adeb21b4f        8 months ago        258 MB
docker.io/openshift/origin-service-serving-cert-signer   v3.11               47dadf9d43b6        9 months ago        276 MB
k8s.gcr.io/pause                                         3.1                 da86e6ba6ca1        19 months ago       742 kB
[root@guruson ~]# 

- 또한 Running 상태로 정상적으로 구동되어 있음을 알수 있습니다.

Dashboard에 접근하기 전 기본적으로 확인해야 하는 Cluster info를 먼저 확인하도록 하겠습니다.

[root@guruson ~]# kubectl cluster-info
Kubernetes master is running at https://222.234.124.110:6443
KubeDNS is running at https://222.234.124.110:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@guruson ~]# 

3) dashboard 기동 방법

- Proxy를 이용하는 방법

- NodePort를 이용하는 방법

- API Server를 이용하는방법

위와 같이 총 3가지 접속 방법이 있습니다.

각각의 접속 방법에 대해 살펴보겠습니다.

 

a) kubectl proxy를 기동하는 방법

먼저 Proxy를 이용한 기동 방식을 살펴보겠습니다.

기동 방법은 매우 간단합니다.

[root@guruson ~]# kubectl proxy --port=8001 &
[1] 29979
Starting to serve on 127.0.0.1:8001
[root@guruson ~]#

kubectl proxy --port=[접속 포트] --address=[Kubernetes Dashboard URL] --accept-hosts='^*$' &

다만 제약사항으로는 Kubernetes Dashboard에 접근할 수 있는 클라이언트 PC는 바로 자신 즉 localhost에서만 접속이 가능하다는 점입니다.

외부에서 해당 master server ip로 접근할 경우 로그인 화면은 표출되지만, 토큰 값을 넣어도 전혀 동작하지 않음을 볼 수 있습니다.

http://127.0.0.1:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login


 


http://222.234.124.110:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login


 

 

 


- Kubernetes Login 인증키 생성

Kubernetes는 접속방법이 두가지가 있는데 kubeconfig를 사용하는 방법과 Token을 사용하는 방법입니다.

지금부터는 Token을 생성하여 접속하는 과정에 대해 알아보겠습니다.

- 먼저 serviceaccount를 생성합니다.

[root@guruson ~]# cat <<EOF | kubectl create -f -
 apiVersion: v1
 kind: ServiceAccount
 metadata:
   name: admin-user
   namespace: kube-system
EOF
serviceaccount/admin-user created
[root@guruson ~]#

- 다음으로 ClusterRoleBinding을 생성합니다.

[root@guruson ~]# cat <<EOF | kubectl create -f -
 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: kube-system
EOF
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
[root@guruson ~]

- 사용자 계정의 토큰을 가져와서 대시보드에 입력합니다.

[root@guruson ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 
Name:         admin-user-token-p9ldd
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=041cb7ec-946a-49b6-8900-6dc90fc08464

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  11 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXA5bGRkIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwNDFjYjdlYy05NDZhLTQ5YjYtODkwMC02ZGM5MGZjMDg0NjQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.TJtTZh5c-DpbmGwEF5QJ3yS9lADpqRCLJRnsr-t0xLOGPY4u3gNGXq8F4C4vL__PpfY-u5xmFTv-H3Oe6jTmjBnduR_bFNP1BqWGl3T1si-FC08a_aNqKbmjUKJ_4SWsSe_DjgUZTawr04C5dtNcBd0o0clQG_nkQFk7Gko2tiFhF0PwdtgSOh29JjlhAj_vzpd-vUNxMUJ0Y1ulPEfSCAA0pmIjBYpl_oBVMOd8Xkszz3FYC9ij9WevttnFMjxsEL5x6hGQw62OYQkx_YsE-P7db3cG0ieHECScHFp_Z0rg_lXBnDYFtj6hyPlpS7EvcVSRRUBhasPr3GlqHoIycg
[root@guruson ~]#

- 위와 같이 토큰 생성 후 localhost와 외부 접속화면으로 각각 테스트를 진행해 보겠습니다.

[localhost ]


 


[222.234.124.110]


 

 


localhost와 master_server_ip로 각각 접속은 위와 같이 가능하지만, 실제로 master_server_로 접속할 경우 Sign In 버튼 클릭시에도 동작하지 않음을 볼 수 있습니다.

물론 skip 버튼을 활성화하여 누구나 admin이 될 수 있는 기능을 제공하긴 하지만, 권고하지 않습니다.

 

b) Node Port를 활용하는 방법

다음으로 NodePort를 활용한 접속 방법입니다.

NodePort로 접속하기 위해서는 다음과 같이 Kubernetes-Dashboard의 설정을 변경해야 합니다.

[root@guruson ~]# kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
# 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: 2019-08-02T07:53:31Z
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
  resourceVersion: "743"
  selfLink: /api/v1/namespaces/kubernetes-dashboard/services/kubernetes-dashboard
  uid: ce676471-4e08-4f46-b80f-08d1fbb088a7
spec:
  clusterIP: 10.105.252.142
  ports:
  - port: 443
    protocol: TCP
    targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  sessionAffinity: None
  type: ClusterIP ===============================> NodePort
status:
  loadBalancer: {}
[root@guruson ~]#

위와 같이 edit service를 통해 type: ClusterIP를 NodePort로 변경하고 저장합니다.

저장한 상태로 NodePort를 확인하는 방법은 다음과 같습니다.

[root@guruson ~]# kubectl -n kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.105.252.142   <none>        443/TCP   19m
[root@guruson ~]#

============> 위는 NodePort로 변경 전 kubernetes-dashboard 정보이며, 아래는 변경 후 정보입니다.

[root@guruson ~]# kubectl -n kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.105.252.142   <none>        443:30783/TCP   16m
[root@guruson ~]#

다음과 같이 NodePort로 변경하면 Kubernetes-dashboard는 32062라는 포트로 기동됩니다. 다만 해당 포트는 매번 기동 및 셋팅 시점마다 변경되는 Port로 Dashboard에 접근하기 위해서는 항상 확인 후 접속해야합니다.

 

c) API Server를 활용하는 방법 

마지막으로 가장 효과적인 방법이라 할 수 있는 kube-apiserver를 통해 접근하는 방식입니다.

접근하는 방법은 크게 두가지 스텝으로 나뉘어져 있는데 먼저 kube-apiserver에 접근하기 위한 인증서를 생성하고 이를 클라이언트 브라우저에 적용하는 것입니다.

먼저 인증서 생성 방법에 대해 알아보겠습니다.

먼저 .kube/config 파일의 client certificate와 client key를 추출하여 각각 kubecfg.crt와 kubecfg.key 파일로 생성합니다.

[root@guruson ~]# grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
[root@guruson ~]# cat kubecfg.crt 
-----BEGIN CERTIFICATE-----
MIIC8jCCAdqgAwIBAgIIbvzqKy59RjswDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE
AxMKa3ViZXJuZXRlczAeFw0xOTA4MDMxMTI4NThaFw0yMDA4MDIxMTI5MDBaMDQx
FzAVBgNVBAoTDnN5c3RlbTptYXN0ZXJzMRkwFwYDVQQDExBrdWJlcm5ldGVzLWFk
bWluMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6Ha1Du1KM6LhNO6
04T4kJcub+7wGSBciKB2TEof/bO+RNGIq5WvL8EdrvyJhgeQ+X1EgpD2stKVGD+Z
oHL2YPbYjJCOzL+3BYmJG0v9Khn7cCQODFX1z4L0FuJJt1c4r1+8xeTWZ0Rllzpn
a6v4+71MiFprM2M1RvM+bS/b3LTSvPQLc4/6QJEjVxbxSuANJsYeNSyxYHCwIoQ5
RSANOMSVnynhgl7zOt28DYUPMYWYV0nfu87DQtsqcKfhO8VxU/mWpOpHUKB94Nj2
GCtRYO7OSRwim8+6x8DHrkvuCdTKdPRazqgMdWDkg3kinwK1FeiU/qHpazuMpx64
u1h/9QIDAQABoycwJTAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
AwIwDQYJKoZIhvcNAQELBQADggEBAHnGTlklZKpj9TcCHN+MHf2xgi3+yCaNOYX8
ltHJ0b2pK5TndOOh2WHmApIV6gQT2ZU3sxb3OWDmL8qAKnkufli4HsBeJ6eIIrHh
gqnf4g5VBgkOMZkPXUL4RlrOyUVN4A3WToMlCwZY0sET86/qrnVdOncUwfARAof8
+UQYzIwc5Ge0uCSWG7J8RXsF+14ynOqhLxzdtLJBmvazGwO6QrCOupFJT6SzQlos
vBYT3qID6v/l8ZcQgbQhlzsfYrkLc+Vi4FGNMkfNYwxHeI368sKgPQfrcccswylr
1iGmuaC+fKqdxKwU5qAqiNGfQAbEWQicTiVuGBU7Xxm9zzia6SI=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIC8jCCAdqgAwIBAgIIbvzqKy59RjswDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE
AxMKa3ViZXJuZXRlczAeFw0xOTA4MDMxMTI4NThaFw0yMDA4MDIxMTI5MDBaMDQx
FzAVBgNVBAoTDnN5c3RlbTptYXN0ZXJzMRkwFwYDVQQDExBrdWJlcm5ldGVzLWFk
bWluMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6Ha1Du1KM6LhNO6
04T4kJcub+7wGSBciKB2TEof/bO+RNGIq5WvL8EdrvyJhgeQ+X1EgpD2stKVGD+Z
oHL2YPbYjJCOzL+3BYmJG0v9Khn7cCQODFX1z4L0FuJJt1c4r1+8xeTWZ0Rllzpn
a6v4+71MiFprM2M1RvM+bS/b3LTSvPQLc4/6QJEjVxbxSuANJsYeNSyxYHCwIoQ5
RSANOMSVnynhgl7zOt28DYUPMYWYV0nfu87DQtsqcKfhO8VxU/mWpOpHUKB94Nj2
GCtRYO7OSRwim8+6x8DHrkvuCdTKdPRazqgMdWDkg3kinwK1FeiU/qHpazuMpx64
u1h/9QIDAQABoycwJTAOBgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUH
AwIwDQYJKoZIhvcNAQELBQADggEBAHnGTlklZKpj9TcCHN+MHf2xgi3+yCaNOYX8
ltHJ0b2pK5TndOOh2WHmApIV6gQT2ZU3sxb3OWDmL8qAKnkufli4HsBeJ6eIIrHh
gqnf4g5VBgkOMZkPXUL4RlrOyUVN4A3WToMlCwZY0sET86/qrnVdOncUwfARAof8
+UQYzIwc5Ge0uCSWG7J8RXsF+14ynOqhLxzdtLJBmvazGwO6QrCOupFJT6SzQlos
vBYT3qID6v/l8ZcQgbQhlzsfYrkLc+Vi4FGNMkfNYwxHeI368sKgPQfrcccswylr
1iGmuaC+fKqdxKwU5qAqiNGfQAbEWQicTiVuGBU7Xxm9zzia6SI=
-----END CERTIFICATE-----
[root@guruson ~]# grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
[root@guruson ~]# cat kubecfg.key
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAu6Ha1Du1KM6LhNO604T4kJcub+7wGSBciKB2TEof/bO+RNGI
q5WvL8EdrvyJhgeQ+X1EgpD2stKVGD+ZoHL2YPbYjJCOzL+3BYmJG0v9Khn7cCQO
DFX1z4L0FuJJt1c4r1+8xeTWZ0Rllzpna6v4+71MiFprM2M1RvM+bS/b3LTSvPQL
c4/6QJEjVxbxSuANJsYeNSyxYHCwIoQ5RSANOMSVnynhgl7zOt28DYUPMYWYV0nf
u87DQtsqcKfhO8VxU/mWpOpHUKB94Nj2GCtRYO7OSRwim8+6x8DHrkvuCdTKdPRa
zqgMdWDkg3kinwK1FeiU/qHpazuMpx64u1h/9QIDAQABAoIBADJvPzLtGbTuT/JU
N1PD2kyDVqgfwcn/OOBAwYugIRlAx1QYPnRgt8ZOUnxGxXCReBaX5WJzNNy8Xfc2
oUTPogpOT8b41GmU3s1OOtxrgJFgioWKK3yFXp14xcOg78+oUkRRp5xJ9pereuM7
f7EheLuyFnBQXaBiel+n4o/W3XJlcczNDyyWn8+D0edTafkz5SyswP3g1HVpXUMB
rvckp5s0GQowr/nMmXyBBPpU+1cwcdyFCCHoLENPTWY7aBIjPhgFPjV64qV+keT2
B5DinHSLixRXNgCN9H9voDoSzDNh5YCF3iOPVAg+DndAQtq9rQ5tSaOy9qKQ+KgA
VyXsa8ECgYEAwgMwUvIHbVG5vw/GmLq+wbpHQ83FPGBGZBoTjpdg1aN/rwuNnnl2
eiNr3TM2ezkrJa44Jzdr8d3+qdOw7AFF7+HPRamxzTTS4Dc9Koy6MTEKcR18EEEC
xtzZxU00in+OQK9aufG7WUagSIKqXYtzLgw8NdMN1zuGuBQ3zMvhI9sCgYEA95TP
ozTzj2bETgcP64/tsx4cEVsN54pPsXZvebja55mEUNx6ob+3IcQNK2sFBULR1Fx4
qF9pWuBkSAgGyy3HHf98iVOtUHuVAdNYpgJXlm8FJ3X/QL65lJ+9ZNM2dGyKiUWN
F4qmmjGDILFORjIDNQQs1fi08Ciez4+EHV7KHG8CgYAQUURXNZP6Vc1RjHofjlVM
5eXohf34vgAtmyPZ8lFqpn2us0IN+hlE3IXN7OjAJGbEnIqMgdTKWul4Tx2qO9Eu
A8fzC/qwT6kMwpiaY4ulZ4KBUQGGPHGHWDvYpE2u+Ft2hUkUKoifUZlZf+PkSj49
uTm3LTEU0STbhpfK2brt0QKBgQC+y15sbt0X8OFtJEIfjc5nz9dfhKUlf1BE+XmU
+2EvQ/5U9mRHDGCL0/M2N4Yp9MGRfyW407Z0QyLk49Kgd4nQU1hc2DBjKqm9O2tA
m+N12d7F90gbVB/eKnAhKCf59r+YZBIER2R2xZtA8YLZ06bnD22iA8UkopkoaXgt
ziPBXwKBgHLag6BfxZ++2X9WLKFGtiN4U0tQQMJu2hho4SYJgGFIG9V8dk0//4Ic
0N6Jm3xXIYyDS6uIPW/SBkcAy+cNCSIJncJiJUKB6MUIQigCdXALlN0Uw2fEzF7u
kd/05hs+HFDxXFBso6Fd/lfvMDrh6EYE39kIQJ0J2huT5SJsBmSV
-----END RSA PRIVATE KEY-----
[root@guruson ~]# 

다음으로 생성한 키를 기반으로 p12 인증서 파일을 생성합니다.

[root@guruson ~]# openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-admin"
Enter Export Password:
Verifying - Enter Export Password:
[root@guruson ~]# ls -la kubecfg.p12 
-rw-r--r-- 1 root root 3262 Aug  3 22:49 kubecfg.p12
[root@guruson ~]#

인증서 암호를 결정하여 입력하고 생성된 파일을 확인합니다.

클라이언트 브라우저에 인증서를 반영하기 위해서는 총 2개의 파일이 필요한데 하나는 바로 생성한 kubecfg.p12 파일이고 다른 하나는 /etc/kubernetes/pki/ca.crt 인증서입니다.

두개의 파일을 로컬로 다운로드 받도록 합니다.

다음으로 다운로드 받은 인증서를 클라이언트에게 적용하는 방법입니다.

먼저 신뢰할 수 있는 루트 인증 기관 인증서를 적용합니다. (certutil.exe -addstore "Root" D:\cert\ca.crt)

 

 

다음으로 개인용 인증서를 적용합니다. (certutil.exe -p [인증키 생성시 PW] -user -importPFX D:\cert\kubecfg.p12)

위 명령어 입력 시 아래와 같은 인증서 설치 여부를 묻게 되며 예를 선택하면 모든 준비가 완료됩니다.

 

 

혹시나 인증서를 갱신하거나 정보가 변경되어 삭제해야 할 필요가 있을 경우에는 certmgr.msc 명령어를 이용하여 인증서를 확인할 수 있습니다.

 

 

위와 같이 명령어 입력시 아래와 같은 창이 뜨며 해당 서버에 적용된 인증서를 확인할 수 있습니다.

 

 

Kubernetes 용 인증서는 개인용 인증서와 신뢰할 수 있는 루트 인증 기관 인증서이며 각각 다음과 같은 파일로 추가되어 있습니다.

[개인용 인증서]

 

 

[신뢰할 수 있는 루트 인증 기관 인증서]

 

 

갱신 또는 삭제가 필요할 경우 이를 적용하여 반영합니다.

자 인증서 적용이 완료되었으니, dashboard에 접근해 보도록 하겠습니다.

접근 URL은 위에서 확인한 cluster-info 기반 정보이며, 

https://[master_ip]:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

접근 시 아래와 같이 추가한 인증서 적용 여부를 확인하게 됩니다.

 

 

확인을 누르면 아래와 같이 대시보드에 접근하게됩니다.

 

 

이후 과정은 위와 같이 kubectl proxy 방식과 동일하게 Token 키를 생성하여 접근하면됩니다.

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
[root@guruson ~]# cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
EOF
serviceaccount/admin-user created
[root@guruson ~]# cat <<EOF | kubectl create -f -
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: kube-system 
EOF
clusterrolebinding.rbac.authorization.k8s.io/admin-user created
[root@guruson ~]# kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}') 
Name:         admin-user-token-qjmhg
Namespace:    kube-system
Labels:       <none>
Annotations:  kubernetes.io/service-account.name=admin-user
              kubernetes.io/service-account.uid=0cb364d9-d6a2-420d-b79f-265d024f20b7

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXFqbWhnIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiIwY2IzNjRkOS1kNmEyLTQyMGQtYjc5Zi0yNjVkMDI0ZjIwYjciLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.XF3r080O0kdrYXODGSOK2qoawxZ4ZpOtLJxI1W1W0b0nVdNS_wWZaCYFakQZWfx9MEyA-TTPcGgEx2iarH9G59MUUeenFnmQfyLVi5dQbrdRCaa0_H3kNwdM4XCDe4aS9ozHSrSClz1LUX5BmzstHPDWat7OpT2moX8r5iTentqWYzNu6P1zjkEFOB90jqE-C9_eteRI7G4gwOSa1c-E4tlDPtwgeUuyax3jKm-ka-01on3-Sq6gNL6cnydMvBfNea4akOFQqunR_x2GV44ZTrED5OXHkiX6bS5_PA5fwykQ6sdxY28VTi-ooTSwLjuVj4KLLVeULW5j1GMKvLuy0Q
ca.crt:     1025 bytes
namespace:  11 bytes
[root@guruson ~]#

위 Token 값을 로그인창에 입력하면

 

 

위와 같이 대시보드에 접근할 수 있습니다.

지금까지 다양한 Kubernetes Dashboard 구성 방법에 대해 알아보았습니다. 대시보드를 통해 다양한 작업을 진행하고 모니터링할 수 있으며, 이를 통해 보다 편리한 Kubernetes 환경 구성이 가능해 졌습니다.

다음시간에는 Master Node와 연결되는 Worker Node를 생성하고 이를 Master Node와 연결하는 과정에 대해 살펴보겠습니다.

728x90
반응형