티스토리 뷰

728x90
SMALL

이번 포스팅에서는 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


728x90

 


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 ]


728x90

 


[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 값을 로그인창에 입력하면

 

 

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

728x90

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

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

728x90
LIST
댓글
  • 프로필사진 개발자 좋은글 감사합니다. 덕분에 잘 따라 배우고있어요 2019.12.17 20:31
  • 프로필사진 와스프로 GodNR 도움이 되셨다니 기쁘네요 ^^b 2019.12.20 18:09 신고
  • 프로필사진 웅아웅아 안녕하세요. 지금 minikube 설치했고 Dashboard 붙이려고 합니다. Local 접속해보려고 하니 안되어 구글링하다가 쥔장님 봤는데요. 가뭄의 단비같아요.^^

    여러 방법있다고 하셨는데 맨 아래 세번째 방식도 minikube 에서도 적용이 잘 되는지가 궁금합니다.
    2020.01.10 08:07
  • 프로필사진 와스프로 GodNR 물론 가능합니다.
    minikube 역시 인증키가 생성되고, apiserver가 기동될테니까요^^
    try 해보세요!
    2020.01.10 08:22 신고
  • 프로필사진 웅아웅아 참 다행입니다. 오늘 시도해봐야겠네요! 감사합니다.
    사막의 오아시스를 만난 격이랍니다 제게는.ㅎㅎ
    뭐 쿠버 설명이 그닥 케이스바이케이스까진 안나오다보니까요.
    2020.01.10 09:19
  • 프로필사진 와스프로 GodNR ㅎㅎ 도움이 되셨다면 다행이네요!
    자주 찾아와주세요! ㅋㅋ
    2020.01.10 09:22 신고
  • 프로필사진 웅아웅아 와스프로님,
    일단 Proxy 방식은 좀 그래서 NodePort 방식으로 진행하고자 합니다. (물론 Api G/W 방식도 있지마는)

    kubernetes-dashboard.yaml 파일에서 'NodePort'로 바꾼 이후에, 하기 cmd 로 포트 확인한 후
    root@xxxxx /]# kubectl -n kubernetes-dashboard get service kubernetes-dashboard
    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes-dashboard NodePort 10.99.101.47 <none> 443:30564/TCP 22m

    https://xxx.xxx.xxx.xxx:30564 로 접근하면 접속이 안됩니다. Chrome : "사이트에 접속할 수 없음."
    그래서 해당 Master 에서 firewall-cmd 로 8443 port 를 열어주고 (firewall --reload 로 변경 반영) 접속하여도 동일합니다.

    그런데 하기 cmd 로 접근하면 kubernetes-dashboard 가 설치된 node 가 master 가 아닌 Worker node 에 설치가 돼 있더군요. 이래도 되는 건가요?
    [root@xxx /]# kubectl get pods --all-namespaces -o wide
    ... 중략...
    kubernetes-dashboard dashboard-metrics-scraper-76585494d8-mggfw 1/1 Running 0 28m 192.168.211.76 Master node <none> <none>
    kubernetes-dashboard kubernetes-dashboard-5996555fd8-7647r 1/1 Running 0 28m 192.168.114.71 "Worker Node" <none> <none>

    주변에 물어보니까 일단 Dashboard 가 worker node에 깔리면, 외부에서 해당 IP로 접근이 안되니, NodeSelector 를 통해서 MasterNode 에 dashboard 가 설치되도록 조정해주어야 한다는데..
    Master 1, worker node 2개로 운용중인데 보통 dashboard 서비스가 Node에서 Running 되있는게 일반적인가요?

    어디를 어떻게 손봐야할 지 감이 안옵니다.



    2020.02.10 11:46
  • 프로필사진 와스프로 GodNR 먼저 일반적으로 초기 구성이외의 POD는 Master Node에 구성하지 않습니다.
    즉 Worker Node에 Dashboard가 기동 된것이 올바른 상태입니다.
    (master node에 application pod가 배치되지 않도록 기본으로 taint가 설정되어 있습니다.)
    Worker Node의 Pod에 접근하기 위해 Ingress Controller를 통한 접근을 구성(Cluster Ip)해야 하지만 부득이하게 NodePort를 사용하고자 할 경우 특정 worker node에 Label을 부여하고 해당 worker node에 기동 되도록 구성하는 것을 추천합니다.

    https://waspro.tistory.com/m/582
    블로그를 참고해서 특정 worker node에 label부여 및 nodeselector로 해당 worker node로 접근하도록 구성하고
    worker_node_ip:node_port 형태로 호출해 보세요
    2020.02.10 14:00 신고
  • 프로필사진 웅아웅아 소중한 답변 감사합니다.
    최초 설치 버전은 아래버전이었습니다.
    /v2.0.0-beta8/aio/deploy/recommended.yaml

    답변이 오는 사이에 하기 사이트에서 dashboard 버전 차이일 수 있다고 하여, dashboard -v2.0.0-rc5 을 재설치했습니다.
    https://github.com/kubernetes-sigs/kubespray/issues/5347

    그런데, NodePort 로 변경하고 Https://<master-ip>:<port> 로 접근시 예의 아래 메시지가 저를 반겨줍니다.
    --> "Client sent an HTTP request to an HTTPS server"

    특이사항은 dashboard v2.0.0-rc5 버전의 경우 dashboard service 가 master 에 설치가 되더라구요.
    [root@xxx~]# kubectl get pods --all-namespaces -o wide
    NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
    .. 중략 ..
    kubernetes-dashboard dashboard-metrics-scraper-7b8b58dc8b-64p92 1/1 Running 0 47m 192.168.211.80 "Master" <none> <none>
    kubernetes-dashboard kubernetes-dashboard-866f987876-4k57j 1/1 Running 0 47m 192.168.211.79 "Master" <none> <none>

    describe 로 조회하면 pod 조회가 안됩니다.
    [root@~]# kubectl describe pods kubernetes-dashboard-866f987876-4k57j
    Error from server (NotFound): pods "kubernetes-dashboard-866f987876-4k57j" not found
    [root@~]# kubectl describe pod kubernetes-dashboard-866f987876-4k57j
    Error from server (NotFound): pods "kubernetes-dashboard-866f987876-4k57j" not found
    [root@~]# kubectl logs kubernetes-dashboard-866f987876-4k57j --namespace=kube-system
    Error from server (NotFound): pods "kubernetes-dashboard-866f987876-4k57j" not found

    그런데 v2.0.0 -rc5 왜 저는 dashboard 설치했을때 untaint 되어 dashboard 가 master 에 설치가 된 걸까요?
    그리고 와스프로님처럼 손쉽게 NodePort 로 해결돼야 할 텐데 왜 접근이 계속 안되는 것인지 도통 모르겠네요.
    (dashboard v2.0.0-beta8로 했을떄 api gw 방식도 해봤습니다만 마찬가지였습니다.)

    2020.02.10 15:31
  • 프로필사진 와스프로 GodNR 조회가 안되는건 namespace를 넣지 않아서 입니다.
    kubectl describe pod -n [namespace] [podname] 으로 조회해보세용
    2020.02.10 15:48 신고
  • 프로필사진 웅아웅우 NodeSelector 설정을 통해서 볼 경우에...
    정말 궁금한 것이 NodeSelector 를 설정하려면 기본적으로 host 에 .yml 파일이 잇어야 하지 않습니까?
    그런데
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc5/aio/deploy/recommended.yaml
    하여 설정 파일을 통해 받아오는데, 어떻게 yaml 파일을 edit 하는지요?

    일단 dashboard 를 위 url 통해 설치를 한 연후에
    kubernetes-dashboard.yaml 파일을 편집하여 NodeSelector 셋업한 연후,
    이전에 생성된 pod 를 지우고 나면 다시 pod 생성을 할 테니 그런 말씀이신지요?

    Dashboard 하나 띄우는 데 이렇게 복잡한 지 참 의문입니다.
    2020.02.10 15:35
  • 프로필사진 와스프로 GodNR 일단 recommanded.yaml 파일을 wget으로 받아서 kubectl create -f recommanded.yaml로 적용 하셔도 되구요.
    또는 kubectl edit deployment -n namespace kubernetes-dashboard로 편집하셔도 됩니다.
    2020.02.10 15:52 신고
  • 프로필사진 웅아웅아 제가 이미 dashboard v2.0.0-rc5 버전을 설치했거든요.

    나오는 error message 가 'Client sent an HTTP request to an HTTPS server' 인 지라
    네트워크 이슈 같아 보이는데,,
    NodeSelector 를 써본다는 거는 Dashboard service 가 다른 Worker 에 설치된 경우일텐데,
    2.0.0-rc5 경우는 master 에 설치가 이미 돼 있거든요.

    정말 완전 삽질하는 거 같아요.. T T
    2020.02.10 16:11
  • 프로필사진 와스프로 GodNR 그리고 NodePort로 expose 된 포트가 listen 하고있는지 서버에서 netstat으로 확인도 해보세요. 2020.02.10 15:49 신고
  • 프로필사진 웅아웅아 네 31560 port 로 잘 떠 있습니다.

    [root@~]# netstat -tulpn
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1940/master
    tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 11964/kubelet
    tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 16688/kube-proxy
    tcp 0 0 127.0.0.1:9099 0.0.0.0:* LISTEN 17778/calico-node
    tcp 0 0 169.56.84.211:2379 0.0.0.0:* LISTEN 16664/etcd
    tcp 0 0 127.0.0.1:2379 0.0.0.0:* LISTEN 16664/etcd
    tcp 0 0 169.56.84.211:2380 0.0.0.0:* LISTEN 16664/etcd
    tcp 0 0 127.0.0.1:2381 0.0.0.0:* LISTEN 16664/etcd
    tcp 0 0 127.0.0.1:10257 0.0.0.0:* LISTEN 16567/kube-controll
    tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 17884/bird
    tcp 0 0 127.0.0.1:10259 0.0.0.0:* LISTEN 16566/kube-schedule
    tcp 0 0 127.0.0.1:42422 0.0.0.0:* LISTEN 11964/kubelet
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1938/sshd
    tcp6 0 0 :::3000 :::* LISTEN 21876/docker-proxy
    tcp6 0 0 :::8089 :::* LISTEN 3939/java
    tcp6 0 0 ::1:25 :::* LISTEN 1940/master
    tcp6 0 0 :::8090 :::* LISTEN 3925/java
    tcp6 1 0 :::31560 :::* LISTEN 16688/kube-proxy
    tcp6 0 0 :::10250 :::* LISTEN 11964/kubelet
    tcp6 0 0 :::10251 :::* LISTEN 16566/kube-schedule
    tcp6 0 0 :::6443 :::* LISTEN 16673/kube-apiserve
    tcp6 0 0 :::10252 :::* LISTEN 16567/kube-controll
    tcp6 0 0 :::8080 :::* LISTEN 3923/java
    tcp6 0 0 :::10256 :::* LISTEN 16688/kube-proxy
    tcp6 0 0 :::8081 :::* LISTEN 3927/java
    tcp6 0 0 :::8082 :::* LISTEN 3933/java
    tcp6 0 0 :::8083 :::* LISTEN 3930/java
    tcp6 0 0 :::8084 :::* LISTEN 3936/java
    tcp6 0 0 :::22 :::* LISTEN 1938/sshd
    udp 0 0 127.0.0.1:323 0.0.0.0:* 1149/chronyd
    udp6 0 0 ::1:323 :::* 1149/chronyd
    [root@ ~]#
    2020.02.10 16:13
  • 프로필사진 웅아웅아 아래 pod 정보를 보니 뭔가 힌트가 있을 것 같은데 말이죠...

    [root@~]# kubectl describe pods kubernetes-dashboard-866f987876-4k57j --namespace=kubernetes-dashboard

    Name: kubernetes-dashboard-866f987876-4k57j
    Namespace: kubernetes-dashboard
    Priority: 0
    Node: Master/202.xxx.xxx
    Start Time: Mon, 10 Feb 2020 14:30:56 +0900
    Labels: k8s-app=kubernetes-dashboard
    pod-template-hash=866f987876
    Annotations: cni.projectcalico.org/podIP: 192.168.211.79/32
    Status: Running
    IP: 192.168.211.79
    IPs:
    IP: 192.168.211.79
    Controlled By: ReplicaSet/kubernetes-dashboard-866f987876
    Containers:
    kubernetes-dashboard:
    Container ID: docker://63cac7fb0c078cc4ab710d073e60df9f4e71eb286ea7cbecd9a412457730735e
    Image: kubernetesui/dashboard:v2.0.0-rc5
    Image ID: docker-pullable://kubernetesui/dashboard@sha256:a7732141bfec2bcdefe377fab23d2fb923ad31be0fd6e0b4e05d02f710bf7854
    Port: 8443/TCP
    Host Port: 0/TCP
    Args:
    --auto-generate-certificates
    --namespace=kubernetes-dashboard
    State: Running
    Started: Mon, 10 Feb 2020 14:31:05 +0900
    Ready: True
    Restart Count: 0
    Liveness: http-get https://:8443/ delay=30s timeout=30s period=10s #success=1 #failure=3
    Environment: <none>
    Mounts:
    /certs from kubernetes-dashboard-certs (rw)
    /tmp from tmp-volume (rw)
    /var/run/secrets/kubernetes.io/serviceaccount from kubernetes-dashboard-token-z4949 (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: <unset>
    kubernetes-dashboard-token-z4949:
    Type: Secret (a volume populated by a Secret)
    SecretName: kubernetes-dashboard-token-z4949
    Optional: false
    QoS Class: BestEffort
    Node-Selectors: beta.kubernetes.io/os=linux
    Tolerations: node-role.kubernetes.io/master:NoSchedule
    node.kubernetes.io/not-ready:NoExecute for 300s
    node.kubernetes.io/unreachable:NoExecute for 300s
    Events: <none>

    헌데, 제가 이전에 minikube 를 깔아서 돌리고 있는 별도 host 에서
    [root@aks-graph /]# kubectl describe pods kubernetes-dashboard-xxxx --namespace=kubernetes-dashboard
    명령어로 묘사해보니 별 차이가 없어요.
    걘 NodePort 방식으루, dashboard 잘 올라오는 아이입니다.
    단지 차이라면,
    kubernetest-dashboard: args:
    값에 --enable-skip-login
    --disable-settings-authorizer
    이 minikube의 dashboard 엔 있고,
    이번 full stack (v1.17.2) 의 경우에는
    Args:
    --auto-generate-certificates
    --namespace=kubernetes-dashboard
    이 다른점이라면 다른 점입니다.

    바쁘신데 이렇게 도와주시는데 꼭 성공으로 보답해야할진대..
    2020.02.10 16:24
  • 프로필사진 와스프로 GodNR 일단 https가 아닌 http://로도 해보신거죠??
    접근은 되야 할텐데요..
    OS Firewalld등을 내려보시고 해보세요.
    특이 사항은 없어보이는데.. ㅜㅜ
    2020.02.10 16:39 신고
  • 프로필사진 웅아웅아 될때까지 삽질할 예정입니다.
    Minikube machine 은 잘 서비스하고 잇으므로 그 환경 정보와 비교하고 있는데요.

    minikube 의 dashboard 을 describe 해보면,
    [root@~] kubectl -n kubernetes-dashboard get service kubernetes-dashboard
    ... 중략...

    Selector: k8s-app=kubernetes-dashboard
    Type: NodePort
    IP: 10.96.43.153
    Port: <unset> 80/TCP
    TargetPort: 9090/TCP
    NodePort: <unset> 32313/TCP
    Endpoints: 172.17.0.4:9090
    Session Affinity: None
    External Traffic Policy: Cluster
    Events: <none>
    와 같습니다.

    그리고 minikube host 는 firewall 을 제가 다 내려놓은 상태이구요.

    이번에 k8s full stack 까는 호스트는 선별적으로 port open 했지요. 와스프로님 사이트도 참고하고 말이죠.

    다음처럼 https 도 열려있긴 합니다.

    [full stack 깔려는 host]# firewall-cmd --get-services
    RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
    2020.02.10 17:17
  • 프로필사진 웅아웅아 방화벽 내렸음에도 똑같습니다.!

    "Client sent an HTTP request to an HTTPS server."

    ㅠㅠㅠㅠ
    차라리 잘 됐죠. 방화벽 이슈는 아닌거 같으니.
    2020.02.10 17:46
  • 프로필사진 와스프로 GodNR 헐.. 누군가요.. 지인이 ㅎㅎ
    사실 댓글로 답변 드리기가 애매해서.. 폰으로 보는 중이라.. ㅠ.ㅠ
    2020.02.10 17:52 신고
  • 프로필사진 웅아웅아 위 지저분한 log 는 나중에 다 삭제할께요. 잘 정리된 사이트 제가 너무 더럽히는 듯요.

    누군지는 일단 dashboard 붙이고 나서요.. ㅎ

    그리고 silver bullet 이라는 이 방법까지는 쓰고 싶잖네요.ㅎㅎ
    https://medium.com/@sondnpt00343/deploying-a-publicly-accessible-kubernetes-dashboard-v2-0-0-betax-8e39680d4067
    2020.02.10 17:55
  • 프로필사진 와스프로 GodNR 일단 지금까지 상태로 보면 원인은 명확해요.
    Kubernetes Dashboard가 https로 expose 되어 있는데 http로 요청을 해서 위와 같은 에러가 발생한거구요.
    https로 요청하기 위해서는 인증서를 브라우저에 등록해 주어야 합니다.
    인증서 등록은 해주셨나요?
    2020.02.10 18:09 신고
  • 프로필사진 웅아웅아 참고로 저도 inform 하나 드리면요.

    kubernetes dashboard release 에 들가서 확인하니, 이전에 설치했던 dashboard v.2.0.0-beta8은 kubernetes v1.16까지만 fully 지원한다고 적시돼있네요.
    https://github.com/kubernetes/dashboard/releases

    제 경우는 k8s full stack v1.17.2 이니 dashboard 를 최소 rc4 이상을 깔아줘야 할 것 같습니다!
    2020.02.10 18:18
  • 프로필사진 웅아웅아 NodePort 로 접근할 시에도 https 사용하니까 인증서가 필요하다...
    그런데 http 로 하면 (주의요함)<ip address>:<32xxx> 이렇게 '주의요함' 이라고하고 떠야하지 않나요?

    말씀하신대로 그럼 인증서가 필요할텐데 제가 여기서 굉장히 헛갈리는데요.
    ..Dashboard 보는 세 가지 방식중
    그럼 첫번째로 언급하신 Proxy 방식을 사용하라는 것인가요?
    아님, 세번째인 API G/W 방식의 인증서/개인키를 발급하여 browser 에 추가해서 결국 API G/W port 로 접근하는 방법을 이용하는 부분을 언급하시는 건가요?

    세번째 방식이면 NodePort 방식은 사용하지 말자는 것 아닌가요?
    아니면, API G/W <port> 로 접근하지는 않더라도 NodePort 방식으로 접근하더라도 인증서는 필요하다? 는 말씀이신건지요.
    2020.02.10 18:26
  • 프로필사진 와스프로 GodNR 답을 드리자면...
    - apiserver 방식은 가장 자주 사용하는 일반적인 방식입니다.
    - kubectl edit kubernetes-dashboard 정보를 보시면, port & targetport & nodeport를 확인할 수 있을텐데, nodePort는 클러스터 외부 사용자가 접근하능하도록 하는 포트이고, port 는 서비스 포트 그리고 targetport는 pods의 포트입니다. 이때, 브라우저에서 http로 요청을 했는데 서비스에서는 443 서비스포트로 요청을 받으려고 하니 위와 같은 에러가 발생하는 것이구요. 이를 해결하기 위해서는 nodeport 역시 ssl이 적용된 https 요청이 되어야 합니다.

    #참조
    nodeport(브라우저) -> port(service port) -> targetport(pod expose)
    2020.02.10 18:30 신고
  • 프로필사진 와스프로 GodNR 네 맞습니다. nodePort를 사용하더라도 https를 사용하는 요청은 당연히 인증서가 필요합니다.
    이를 해결하려면, http를 제공하는 kubernetes dashboard를 찾아 적용하는 방법도 있을 것이고 직접 도커 이미지를 커스터 마이징하는 방법도 있을 것입니다.
    https에 인증서가 적용되지 않아 주의요함을 요청하는 것과 http를 https로 요청하는 것은 요청을 후킹하여 조작한다고 브라우저가 판단할 수 있습니다. 이로 인해 결과가 다를수 있습니다.
    2020.02.10 18:34 신고
  • 프로필사진 웅아웅아 와스프로님! 이 기쁨을 와스프로님과함께 나누고 싶습니다.
    일러주신대로 인증서를 생성해서 Browser 에 적용해서 dashboard 화면을 띄우는데 Success! 했습니다^^ 아 너무 감사하고 감사할따름입니다.~

    그런데 몇 가지 짚을 대목이 있습니다.
    1) kubectl cluster-info 에서 언급되는 url 로 접근하면 접근이 안되더라구요.
    [root@~]# kubectl cluster-info
    Kubernetes master is running at https://xxxx:6443
    KubeDNS is running at https://xxxx:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    로 나오는데, 이 주소로 접근하면 'kuberconfig | token 선택 창이 뜨질 않아요.

    와스프로님이 위에 언급하신 주소로 해야 나오더군요.
    https://<master-ip>:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

    --> 이 주소는 어디서 얻으신 건가요?

    2. api gw 방식으로 dashboard 접근할 때
    - 매일 로긴할때마다 위처럼 token 값 매번 넣어주는 방식이 맞는 것인가요? 다른 방식이 없을 것 같긴 한데.
    - 주소를 북마크 해놓긴 햇지만 짧은 주소가 안 먹더이다..
    - 매번 이렇게 접근해야만 하는 거죠? token 값을 메모장에다가 copy 해놔야겠네요.;ㅎㅎ

    3. NodePort 방식으로 dashboard 접근할 때
    - 인증서를 브라우저에 등록했는데도 https://<master-ip>:<nodeport> 로 접근하니 동일하게 나옵니다.
    "Client sent an HTTP request to an HTTPS server."
    - NodePort 방식이 편한데 이 방식은 여전히 안된답니다. .

    위 부분 마지막으로 가르쳐 주시면 고맙겠습니다.

    일단 Dashboard 화면을 보고 퇴근할 수 있어 맘이 아주 뿌듯합니다.
    이 은혜를 어떻게 갚아야할지요. 쿠버 공부하는데 나라님의 포스팅이 엄청 도움이 됩니다.

    p.s.위에 언급했던 아스프로안다는 분은 제가 비밀글로 알려드리죠.ㅎ

    2020.02.10 20:07
  • 프로필사진 와스프로 GodNR 1. URL은 말그대로 현재 DASHBOARD 정보를 입력해야 합니다.
    kubernetes-dashboard가 namespace & service로 잡혀 있어서 url을 다르게 접근해야합니다.
    2. token skip하는 방법도 있는데 최근 대시보드에서는 지원하지 않는것으로 알고 있고 스킵은 추천하지도 않습니다.
    또는 kubeconfig 파일을 넣으셔도 가능합니다. 위치는 .kube/config 파일입니다.
    3. 노드포트 방식은 여전히 인증서가 등록이 안되어있거나 yaml파일에 tls 설정이 안되어 있을수 있습니다.
    2020.02.11 10:56 신고
  • 프로필사진 웅아웅아 와스프로님, 그런데요.. 인증서 방식의 경우 아래와 같은 메시지가 자꾸 발생하네요.
    Unauthorized (401): You have been logged out because your token has expired.

    token expired 됐다고요. 하루도 못가는데요?

    2020.02.11 10:40
  • 프로필사진 와스프로 GodNR kubeadm token list
    로 토큰 상태를 확인하세요
    2020.02.11 11:00 신고
  • 프로필사진 비밀댓글입니다 2020.02.11 14:47
  • 프로필사진 비밀댓글입니다 2020.02.11 14:49
  • 프로필사진 조수형 완벽합니다... 외국글에서도 이런글 못봤는데,, nginx로 reverse proxy설정하려고 삽질한거 생각하면TT,, 원격에서 접속되네요^0^ 2021.01.07 22:46
  • 프로필사진 무지언니 구글에 나와있는 블로그중에 대시보드 설치 제일 잘나와있는거 같습니다. 이거보고 잘 설치했습니다. 감사합니다~!! 2021.03.30 09:31
댓글쓰기 폼