2024년 7월 24일 수요일

쿠버네티스 대시보드 사용하기: user, role, kubectl -n kubernetes-dashboard create token, kubectl proxy

 

대시보드 UI 배포

대시보드 UI는 기본으로 배포되지 않는다. 배포하려면 다음 커맨드를 실행한다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

사용자 만들기

dashboard-adminuser.yaml 파일 생성

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

아래 명령 실행

kubectl apply -f dashboard-adminuser.yaml

>> serviceaccount/admin-user created

롤바인딩

dashboard-adminuser-role.yaml 파일 생성

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

아래 명령 실행

kubectl apply -f dashboard-adminuser-role.yaml

>> clusterrolebinding.rbac.authorization.k8s.io/admin-user created

토큰 생성

kubectl -n kubernetes-dashboard create token admin-user

eyJhbGciOiJSUzI1NiIsImtpZCI6IkVLTnV2WXZpeFJ1elY2S1VMZVYxVjZIeHVVeU43RXNkWVB3S2dtdXZFRnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiNzExMWI5Yy0wMWMxLTQ4OTktYTZhNS1mMmYwZDk5OTE5OWQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.EjBQcub0QvsKv5-TCxSF0ETX6gn4JL0wIFnE2iiCGmhcZjZW0FVA1xtmV_NSipdMAY-ZjWWRf7C1-y-aFm1QVBwk_fj8Pq9CEzcfWSs84X8ROxi8A54luC3_ywXFqhnQWSa7X8Aand0ajUsrn1nnlZJeAdAo3NtPpwVewlfGMBmsk-rpYyACyQkF84-dwwNkgE3xhvGXfK_jl0JH0F_fra1lgQ8WRxDiEvUyX_fId4pRO5Kpm9G9I9babyA5rAWyCqsRJfhNGqcYN-6as3-SuEDNs9IsCbTL5f3dYCymtpFPetc_FMuSk_KivCU8gBeYuyppvTOHvnLSYb0AMUoJTw

Secret 에 토큰 생성

  1. 대시보드 로그인 후 kubernetes-dashboard 네임스페이스에서 생성하거나
  2. 아래 내용으로 yaml 파일 생성 후 kubectl apply -f 실행
apiVersion: v1
kind: Secret
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin-user"   
type: kubernetes.io/service-account-token  

kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d

eyJhbGciOiJSUzI1NiIsImtpZCI6IkVLTnV2WXZpeFJ1elY2S1VMZVYxVjZIeHVVeU43RXNkWVB3S2dtdXZFRnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiNzExMWI5Yy0wMWMxLTQ4OTktYTZhNS1mMmYwZDk5OTE5OWQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.EjBQcub0QvsKv5-TCxSF0ETX6gn4JL0wIFnE2iiCGmhcZjZW0FVA1xtmV_NSipdMAY-ZjWWRf7C1-y-aFm1QVBwk_fj8Pq9CEzcfWSs84X8ROxi8A54luC3_ywXFqhnQWSa7X8Aand0ajUsrn1nnlZJeAdAo3NtPpwVewlfGMBmsk-rpYyACyQkF84-dwwNkgE3xhvGXfK_jl0JH0F_fra1lgQ8WRxDiEvUyX_fId4pRO5Kpm9G9I9babyA5rAWyCqsRJfhNGqcYN-6as3-SuEDNs9IsCbTL5f3dYCymtpFPetc_FMuSk_KivCU8gBeYuyppvTOHvnLSYb0AMUoJTw

커맨드 라인 프록시

kubectl 커맨드라인 도구를 이용해 다음 커맨드를 실행함으로써 대시보드로의 접속을 활성화할 수 있다.

kubectl proxy


대시보드 접속

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

UI는 오직 커맨드가 실행된 머신에서만 접근 가능하다. 상세 내용은 kubectl proxy --help 옵션을 확인한다.

PM2: Node.js 프로세스 관리: 무중단 ecosystem exec_mode cluster instances max

PM2는 Node.js 애플리케이션을 관리하는 데 사용되는 프로세스 관리자입니다. ecosystem.config.js 파일을 사용하여 PM2의 동작을 설정할 수 있습니다. 이 파일에서는 애플리케이션의 실행 환경, 클러스터 모드 및 인스턴스 수를 설정할 수 있습니다. 아래에 ecosystem.config.js 파일의 구성과 리퀘스트 처리량을 고려한 스레드 수 설정 방법을 설명합니다.

ecosystem.config.js 파일 설명

ecosystem.config.js 파일은 PM2 설정을 위한 JavaScript 파일입니다. 이 파일을 통해 애플리케이션을 어떻게 관리할지 설정할 수 있습니다.

기본 구성 예제

module.exports = {
  apps: [
    {
      name: 'cloud-album-backend',
      script: 'dist/main.js',  // 실행할 스크립트 경로
      instances: 'max',       // CPU 코어 수만큼 인스턴스를 실행
      exec_mode: 'cluster',   // 클러스터 모드 사용
      env: {
        NODE_ENV: 'development',
      },
      env_production: {
        NODE_ENV: 'production',
      },
      watch: true,            // 파일 변경 감지하여 재시작 (개발 환경에서 유용)
      max_memory_restart: '200M', // 메모리 사용량 초과 시 재시작
    },
  ],
};

주요 설정 옵션

  • name: 애플리케이션의 이름.
  • script: 실행할 스크립트 파일의 경로.
  • instances: 실행할 인스턴스의 수. max로 설정하면 CPU 코어 수만큼 인스턴스를 실행합니다.
  • exec_mode: 실행 모드. cluster 모드는 여러 인스턴스를 클러스터 모드로 실행하여 로드 분산을 합니다.
  • env: 기본 환경 변수 설정.
  • env_productionpm2 start ecosystem.config.js --env production 명령으로 실행 시 적용될 환경 변수 설정.
  • watch: 파일 시스템을 감시하여 파일이 변경되면 애플리케이션을 재시작합니다.
  • max_memory_restart: 설정된 메모리 사용량을 초과할 때 애플리케이션을 재시작합니다. 예: '200M' 또는 '1G'.

리퀘스트 처리량을 고려한 스레드 수 설정

스레드 수 설정 방법

  • 클러스터 모드 사용exec_mode를 'cluster'로 설정하고 instances를 'max'로 설정하면, PM2가 자동으로 CPU 코어 수에 따라 인스턴스를 생성합니다.
  • 인스턴스 수 지정: 특정 인스턴스 수를 지정할 수도 있습니다. 예를 들어, 4개의 인스턴스를 실행하고 싶다면 instances: 4로 설정할 수 있습니다.

CPU 및 메모리 사용 최적화

  • CPU 코어 수 파악:
    • 일반적으로 인스턴스 수를 CPU 코어 수와 일치시키는 것이 좋습니다. 이는 애플리케이션이 병렬로 실행되어 각 코어를 최대한 활용할 수 있게 합니다.
    • 코어 수가 많은 경우, 애플리케이션이 특정 한계점에서 성능 향상이 멈출 수 있으므로 실제로 사용량을 테스트하여 적정 수를 찾아야 합니다.
  • 메모리 제한 설정:
    • 메모리 사용량 감시max_memory_restart를 설정하여 메모리 사용량이 특정 임계값을 초과하면 프로세스를 재시작합니다.
    • : 메모리 사용량이 200M을 넘으면 재시작하도록 설정: 'max_memory_restart': '200M'.

환경에 따라 인스턴스 수를 조정하는 예제

module.exports = {
  apps: [
    {
      name: 'cloud-album-backend',
      script: 'dist/main.js',
      // 프로덕션에서는 모든 코어 사용, 개발에서는 1개 인스턴스 사용
      instances: process.env.NODE_ENV === 'production' ? 'max' : 1,
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'development',
      },
      env_production: {
        NODE_ENV: 'production',
      },
      watch: process.env.NODE_ENV !== 'production', // 프로덕션에서는 감시 비활성화
      max_memory_restart: '200M',
    },
  ],
};


PM2 설정 파일 및 실행 예제

ecosystem.config.js 전체

module.exports = {
  apps: [
    {
      name: 'cloud-album-backend',
      script: 'dist/main.js',
      // 프로덕션에서는 모든 코어 사용, 개발에서는 1개 인스턴스 사용
      instances: process.env.NODE_ENV === 'production' ? 'max' : 1, 
      exec_mode: 'cluster',
      env: {
        NODE_ENV: 'development',
        GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
        GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
        PORT: process.env.PORT || 3001,
      },
      env_production: {
        NODE_ENV: 'production',
        GOOGLE_CLIENT_ID: process.env.GOOGLE_CLIENT_ID,
        GOOGLE_CLIENT_SECRET: process.env.GOOGLE_CLIENT_SECRET,
        PORT: process.env.PORT || 3001,
      },
      watch: process.env.NODE_ENV !== 'production', // 프로덕션에서는 감시 비활성화
      //max_memory_restart: '200M',
      log_date_format: 'YYYY-MM-DD HH:mm Z', // 로그 타임스탬프 형식
      output: './logs/out.log', // 일반 로그 파일 경로
      error: './logs/error.log', // 에러 로그 파일 경로
      merge_logs: true, // 여러 인스턴스 로그 병합
    },
  ],
};


PM2를 사용한 실행 방법

# 설정 파일로 애플리케이션 실행 (기본 환경)
pm2 start ecosystem.config.js

# 프로덕션 환경으로 애플리케이션 실행
pm2 start ecosystem.config.js --env production

# 애플리케이션 상태 확인
pm2 status

# 애플리케이션 로그 확인
pm2 logs

# 애플리케이션 중지
pm2 stop cloud-album-backend

# 애플리케이션 재시작
pm2 restart cloud-album-backend

# PM2 실행 목록 저장
pm2 save

 

관련 사이트 및 블로그