$ GITHUB_URL=https://github.com/kubernetes/dashboard/releases VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||') sudo k3s kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml
dashboard.admin-user.yml
파일 생성apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
dashboard.admin-user-role.yml
파일 생성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
admin-user
구성 배포sudo k3s kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml
admin-user
토큰 생성토큰은 잘 기록해 두자.
sudo k3s kubectl -n kubernetes-dashboard create token admin-user --duration=720h
위 방식으로 배포한 Kubernates Dashboard는 기본적으로 K3S 클러스터 내부에서만 접근할 수 있다. 만약 K3S 클러스터 외부에서 대시보드에 접근하고 싶다면, NodePort 설정을 하던가, Ingress를 이용하여 대시보드를 외부로 노출 시킬 수 있다.
K3S는 디폴트로 Traefik을 이용한다.
kubernetes-dashboard-ingress.yml
파일 생성아래 host에 들어가 있는 값인 [호스트명]
는 K3S가 실행되어 있는 우분투 VM의 호스트 명으로. http://[호스트명]
로 접속하면 kubernetes-dashboard 서비스의 9090 포트로 트래픽이 전달된다.
http://[호스트명]
처럼 호스트명으로 접근하기 위해 로컬 DNS 설정이 필요하다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard-ingress
namespace: kubernetes-dashboard
labels:
app: kubernetes-dashboard
annotations:
kubernetes.io/ingress.class: "traefik"
spec:
rules:
- host: [호스트명]
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 9090
자신의 로컬 환경(예를 들면, 내 맥미니)에서 우분투 VM 내부에서 구동되고 있는 K3S 대시보드에 접근하기 위해서, 로컬 환경의 /etc/hosts/
를 수정하여 host 이름으로 우분투 VM에 접근할 수 있도록 한다.
sudo vi /etc/hosts
에서 아래 라인은 추가한다.
192.168.0.44 [호스트명]
kubectl apply -f kubernetes-dashboard-ingress.yml
위처럼 배포한 뒤, http://vm-macmini로 접속하면, 404 page not found
가 나타날 것이다.
이것은 kubernetes-dashboard 서비스로 트래픽이 전달 되지 못했기 때문이다.
kubectl edit service kubernetes-dashboard -n kubernetes-dashboard
ports:
- port: 443 # 9090으로 수정
protocol: TCP
targetPort: 8443 # 9090으로 수정
kubectl edit deployment kubernetes-dashboard -n kubernetes-dashboard
- args:
- --auto-generate-certificates # 삭제
- --enable-skip-login=false # 추가
- --enable-insecure-login=true # 추가
- --namespace=kubernetes-dashboard
- --token-ttl=0 # 추가
image: kubernetesui/dashboard:v2.7.0
imagePullPolicy: Always
livenessProbe:
failureThreshold: 3
httpGet:
path: /
port: 8443 # 9090으로 수정
scheme: HTTPS # HTTP로 수정
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
name: kubernetes-dashboard
ports:
- containerPort: 8443 # 9090으로 수정
protocol: TCP
$ kubectl edit service kubernetes-dashboard -n 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:
creationTimestamp: "2023-04-07T14:20:56Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
resourceVersion: "9934611"
uid: 99e837e1-4047-470b-9bf9-0e2aa29214e2
spec:
clusterIP: 10.43.24.23
clusterIPs:
- 10.43.24.23
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- port: 9090 # 변경
protocol: TCP
targetPort: 9090 # 변경
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort # ClusterIP에서 NodePort로 변경
status:
loadBalancer: {}
위와 같이 수정 후, 디플로이먼트를 재시작 한다.
파드 수를 줄였다가 늘리는 방식으로 재시작
kubectl scale deploy kubernetes-dashboard --replicas 0 -n kubernetes-dashboard kubectl scale deploy kubernetes-dashboard --replicas 1 -n kubernetes-dashboard
그리고 아래 명령으로 서비스 객체에 열려있는 포트가 9090인지 확인한다.
kubectl get all -n kubernetes-dashboard
...
service/kubernetes-dashboard ClusterIP 10.43.116.244 <none> 9090/TCP 43m
...
http://[호스트명]/#/login 로 접속 해보면, 아래와 같은 경고 메시지와 함께 로그인이 불가능한 것을 알 수 있다.
이것은 경고 메시지 그대로 대시보드에 접속하기 위해서는, K3S 내부에서 localhost로 접근하거나, https 프로토콜을 이용해서 접근만 허용 가능하도록 만들어져 있기 때문이다.
하지만, http://[호스트명]/#/login 로 접속하면 위에서 기록해둔 토큰을 입력하면 로그인이 가능하다!
$ kubectl edit service kubernetes-dashboard -n 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:
creationTimestamp: "2023-04-07T14:20:56Z"
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
resourceVersion: "9934611"
uid: 99e837e1-4047-470b-9bf9-0e2aa29214e2
spec:
clusterIP: 10.43.24.23
clusterIPs:
- 10.43.24.23
externalTrafficPolicy: Cluster
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- nodePort: 32767 # 추가
port: 443
protocol: TCP
targetPort: 8443
selector:
k8s-app: kubernetes-dashboard
sessionAffinity: None
type: NodePort # ClusterIP에서 NodePort로 변경
status:
loadBalancer: {}
위와 같이 수정 후, 디플로이먼트를 재시작 한다.
파드 수를 줄였다가 늘리는 방식으로 재시작
$ kubectl scale deploy kubernetes-dashboard --replicas 0 -n kubernetes-dashboard $ kubectl scale deploy kubernetes-dashboard --replicas 1 -n kubernetes-dashboard