Kubernetes

Kubernetes Dashboard 배포 Istio domain 설정

김 정출 2024. 10. 14. 15:36

Kubernetes Dashboard 배포

Kubernetes Dashboard는 클러스터 리소스를 시각적으로 관리하고 모니터링할 수 있는 웹 UI입니다. Kubernetes Dashboard를 배포하는 방법은 아래와 같습니다.

1. Kubernetes Dashboard 설치

  1. Helm으로 배포하기
helm repo add kubernetes-dashboard <https://kubernetes.github.io/dashboard/>

helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard

# Kong에서 8444 관련 에러 발생 시
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard --set kong.admin.tls.enabled=false

이 명령어는 Kubernetes Dashboard 관련 모든 리소스(Deployment, ServiceAccount, RoleBinding 등)를 클러스터에 배포합니다.

  1. Dashboard 상태 확인
  2. 설치 후, Dashboard가 제대로 동작하는지 확인합니다.
kubectl get pods -n kubernetes-dashboard

kubernetes-dashboard 네임스페이스에서 대시보드 관련 Pod들이 실행 중인지 확인합니다.

2. Service Account와 ClusterRoleBinding 설정

Kubernetes Dashboard에 접근하기 위해서는 적절한 권한을 가진 Service Account가 필요합니다. 다음 명령어로 admin-user Service Account를 만들고, 해당 계정에 클러스터 관리자 권한을 부여합니다.

  1. admin-user Service Account 생성
  2. 먼저 admin-user Service Account와 ClusterRoleBinding을 설정하는 YAML 파일을 만듭니다.
# dashboard-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
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

  1. Service Account 적용
  2. 위 YAML 파일을 클러스터에 적용합니다.
kubectl apply -f dashboard-admin.yaml

3. 토큰(Token) 발급

Dashboard에 접속할 때 사용될 인증 토큰을 발급받습니다. 다음 명령어로 admin-user의 토큰을 확인할 수 있습니다.

kubectl -n kubernetes-dashboard create token admin-user

이 명령어는 인증에 사용할 토큰을 출력합니다. 이 토큰은 Dashboard에 로그인할 때 필요합니다.

4. Kubernetes Dashboard 접근

Kubernetes Dashboard는 기본적으로 클러스터 내부에서만 접근이 가능합니다. 외부에서 접근하려면 kubectl proxy 명령어를 사용해야 합니다.

  1. kubectl proxy 명령어 실행
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 30443:443

2. 웹 브라우저에서 Dashboard 열기

웹 브라우저에서 다음 URL로 대시보드에 접근합니다.

<http://localhost:30443>

3.토큰 인증
로그인 화면에서 발급받은 토큰을 입력하고 로그인합니다.

5. 외부 접근 설정(Optional)

Dashboard에 외부에서 접근하려면 NodePort나 Ingress 설정을 추가해야 합니다. 기본적으로는 클러스터 내부 보안을 위해 kubectl proxy를 사용하는 것이 권장됩니다.

Istio 활용해서 도메인으로 배포하기

1. Service 설정

  • 80:8000 포트로 설정
spec:
  clusterIP: 10.110.207.132
  clusterIPs:
  - 10.110.207.132
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: kong-proxy-tls
    port: 443
    protocol: TCP
    targetPort: 8443
  - name: kong-proxy
    port: 80
    protocol: TCP
    targetPort: 8000

2. Deployment 설정하기

    spec:
      automountServiceAccountToken: false
      containers:
      - env:
        ...
        - name: KONG_PORT_MAPS
          value: 80:8000
        ...
        - name: KONG_PROXY_LISTEN
          value: 0.0.0.0:8000 http2, [::]:8000 http2
---
        name: proxy
        ports:
        - containerPort: 8443
          name: proxy-tls
          protocol: TCP
        - containerPort: 8000
          name: proxy
          protocol: TCP

3. VirtualService 설정하기

spec:
  gateways:
  - default/cluster-gateway
  hosts:
  - kubernetes-dashboard.ABC.com
  http:
  - corsPolicy:
      allowHeaders:
      - authorization
      - content-Type
      - accept
      allowMethods:
      - POST
      - GET
      - DELETE
      - PUT
      - OPTIONS
      allowOrigins:
      - regex: .*
      exposeHeaders:
      - authorization
      - location
      maxAge: 24h
    match:
    - uri:
        prefix: /
    route:
    - destination:
        host: kubernetes-dashboard-kong-proxy.kubernetes-dashboard.svc.cluster.local
        port:
          number: 80

4. Gateway 설정하기

spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    ...
    - kubernetes-dashboard.ABC.com
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      credentialName: istio-system/ABC-cert
      mode: SIMPLE

5. Certificate 설정하기

spec:
  commonName: ABC.com
  dnsNames:
  ...
  - kubernetes-dashboard.ABC.com
  duration: 2160h
  isCA: true
  issuerRef:
    kind: ClusterIssuer
    name: letsencrypt-prod-istio
  renewBefore: 360h
  secretName: ABC-cert

6. 도메인으로 접속하기