인프라/시스템 구축

[ EKS ] karpenter version 1.5.0

김붕어87 2025. 6. 19. 10:37
반응형
개요
karpenter 이란 ?
karpenter은 WorkerNode(노드)의 수를 조절하는 기능이다

- Watching : 예약 불가능한 (Pending) pod를 감시한다.
- Provisioning : Pending pod의 요구사항에 맞는 노드를 배포하고 배포된 노드에 pod를 스케쥴링 해준다.
- Removing : 노드가 더 이상 필요하지 않을 때 노드 제거한다.
- AWS 환경만 지원


ClusterAutoscaler(CA) 차이점 
- ClusterAutoscaler은 ASG를 사용하기 때문에 nodegroup을 구성/관리 해야하고, 노드 증설/축소 시 많은 단계가 필요해서 속도가 느리다.
- ClusterAutoscaler은 예약 불가능한 pod를 감시하고, AWS 리소스를 생성 요청하기 때문에 노드 확장하는대 시간이 오래 걸림.
- Karpenter은 ASG을 사용하지 않고 POD의 요구사항에 맞는 노드를 증설/축소 하기 때문에 속도가 빠르다.
   (group-less auto scaling)
- karpenter은  빠른 프로비저닝 가능


ClusterAutoscaler는 Node생성되는데 5분이상 걸림
Karpenter는                  Node생성되는데 1~2분 걸림

 

 

[ 아키텍처 ]

 

 

[ karpenter 프로세스 ]

Node Provisioning (Scale-out) 정책

  • Unschedulable pod, pending 상태의 POD가 발생하면 Resource Request량 기준으로 Node가 증설됨.
  • 신규 노드가 15분 동안 NotReady 상태면 종료하고 재생성.

Node Removing (Sale-in) 정책

  • 예약된 Pod가 없는 Node가 있으면 cordon & drain 이후 terminate 진행.
    • karpenter.sh/do-not-evict 설정으로 삭제 방지.

 

 


[ Required 작업 ]

  • AWS Infra 구성
    • EKS Cluster 설치
    • IAM OIDC 생성

 

 


[ 작업 순서 ]

1. Karpenter IAM 설정

  • KarpenterControllerRole 생성
  • KarpenterInstanceNodeRole 생성

2. 

 

 


[ karpenter IAM 설정 ]

 

IAM Role 내용 정리
- KarpenterControllerRole은 karpenter가 WorkerNode를 생성할 수 있는 AWS 권한 설정
- KarpenterInstanceNodeRole은 Karpenter가 생성한 WorkerNode가 EKS에 조인될 수 있는 Role 권한 설정

 

 

1. iam role 생성 - KarpenterInstanceNodeRole

  • "KarpenterInstanceNodeRole" IAM 역할 생성
    • KarpenterInstanceNodeRole 이란?
      • karpenter로 생성한 NODE에 연결 할 IAM 역할입니다.
      • EKS에서 NODE를 관리하기 위해서는 IAM 역할이 필요합니다.
echo '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}' > node-trust-policy.json

aws iam create-role --role-name KarpenterInstanceNodeRole \
    --assume-role-policy-document file://node-trust-policy.json

 

 

2. iam role에 policy 연결

  • "KarpenterInstanceNodeRole" IAM 역할에 Policy을 연결합니다.
    • AmazonEKSWorkerNodePolicy
    • AmazonEKS_CNI_Policy
    • AmazonEC2ContainerRegistryReadOnly
    • AmazonSSMManagedInstanceCore
aws iam attach-role-policy --role-name KarpenterInstanceNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy

aws iam attach-role-policy --role-name KarpenterInstanceNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy

aws iam attach-role-policy --role-name KarpenterInstanceNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly

aws iam attach-role-policy --role-name KarpenterInstanceNodeRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

 


3. iam Policy 생성 - KarpenterControllerPolicy

  • "KarpenterControllerRole"  IAM 역할 생성
    • KarpenterControllerRole 이란?
      • karpenter가 AWS의 EC2(NODE)를 생성할 수 있는 권한을 설정합니다.

  • controller-policy.json 파일 생성
{
    "Statement": [
        {
            "Action": [
                "ssm:GetParameter",
                "ssm:GetParameters",
                "iam:PassRole",
                "iam:GetInstanceProfile",
                "iam:CreateInstanceProfile",
                "iam:TagInstanceProfile",
                "iam:AddRoleToInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:DeleteInstanceProfile",
                "ec2:DescribeImages",
                "ec2:RunInstances",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceTypes",
                "ec2:DescribeInstanceTypeOfferings",
                "ec2:DescribeAvailabilityZones",
                "ec2:DeleteLaunchTemplate",
                "ec2:CreateTags",
                "ec2:CreateLaunchTemplate",
                "ec2:CreateFleet",
                "ec2:DescribeSpotPriceHistory",
                "ec2:TerminateInstances",
                "eks:DescribeCluster",
                "pricing:GetProducts"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "Karpenter"
        },
        {
            "Action": "ec2:TerminateInstances",
            "Condition": {
                "StringLike": {
                    "ec2:ResourceTag/Name": "*karpenter*"
                }
            },
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "ConditionalEC2Termination"
        }
    ],
    "Version": "2012-10-17"
}

 

 

  • controller-policy.json 파일을 참조해서 IAM Policy 생성
aws iam create-policy --policy-name KarpenterControllerPolicy --policy-document file://controller-policy.json

 

4. iam Role 생성 - KarpenterControllerRole

  • oidc 추출
cluster=${eks-cluster}
aws eks describe-cluster --name $cluster --query "cluster.identity.oidc.issuer" --output text

 

  • rust-policy.json 파일 생성
    • xxx으로 되어 있는 값을 채워야합니다.
    • oidc, accountid
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::123xxx:oidc-provider/oidc.eks.ap-southeast-1.amazonaws.com/id/EXAM1234"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.ap-southeast-1.amazonaws.com/id/EXAM1234:sub": "system:serviceaccount:karpenter:karpenter",
                    "oidc.eks.ap-southeast-1.amazonaws.com/id/EXAM1234:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

 

  • Role 생성 - KarpenterControllerRole
    • trust-policy.json 파일을 참조해서 IAM Role 생성
aws iam create-role --role-name KarpenterControllerRole \
    --assume-role-policy-document file://trust-policy.json

 

 

  • IAM Role에 Policy 연결
    • "KarpenterControllerRole" IAM 역할에 Policy을 연결합니다.
      • KarpenterControllerPolicy
aws iam attach-role-policy --role-name KarpenterControllerRole \
    --policy-arn arn:aws:iam:xxx:aws:policy/KarpenterControllerPolicy

 

 


5. subnet에 TAG 추가

  • NODE에 설정된 subnet TAG 추가
    • Key = karpenter.sh/discovery
    • Value = ${Cluster-name}
# 공식 홈페이지에서 subnet에 자동으로 tag 넣기

for NODEGROUP in $(aws eks list-nodegroups --cluster-name ${CLUSTER_NAME} \
    --query 'nodegroups' --output text); do aws ec2 create-tags \
        --tags "Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}" \
        --resources $(aws eks describe-nodegroup --cluster-name ${CLUSTER_NAME} \
        --nodegroup-name $NODEGROUP --query 'nodegroup.subnets' --output text )
done

 

 

6. SecurityGroup에 TAG 추가

  • NODE에 연결된 SG TAG 추가
    • Key = karpenter.sh/discovery
    • Value = ${Cluster-name}
# If your EKS setup is configured to use only Cluster security group, then please execute -

SECURITY_GROUPS=$(aws eks describe-cluster \
    --name ${CLUSTER_NAME} --query "cluster.resourcesVpcConfig.clusterSecurityGroupId" --output text)

aws ec2 create-tags \
    --tags "Key=karpenter.sh/discovery,Value=${CLUSTER_NAME}" \
    --resources ${SECURITY_GROUPS}

 

 

7. EC2 Instance profile 생성 및 ROLE 연결

  • karpenter 설치할 때 Instance profile 지정이 필요합니다.
  • Instance profile은 karpenter가 NODE을 생성할 때 IAM Role을 설정이 필요합니다.
aws iam create-instance-profile \
    --instance-profile-name "KarpenterNodeInstanceProfile-${CLUSTER_NAME}"

aws iam add-role-to-instance-profile \
    --instance-profile-name "KarpenterNodeInstanceProfile-${CLUSTER_NAME}" \
    --role-name "KarpenterInstanceNodeRole"

 

 

 

 

8. ConfigMap "aws-auth" 내용 추가

  • karpenter가 만든 NODE가 EKS 권한을 얻을 수 있도록 "aws-auth"에 내용 추가
    • KarpenterInstanceNodeRole

data:

  mapRoles:

    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::xxx:role/KarpenterInstanceNodeRole
      username: system:node:{{EC2PrivateDNSName}}

 

kubectl edit cm aws-auth -n kube-system

apiVersion: v1
data:
  mapRoles: |
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::xxx:role/xxx-eks-node-group
      username: system:node:{{EC2PrivateDNSName}}
    - groups:
      - system:bootstrappers
      - system:nodes
      rolearn: arn:aws:iam::xxx:role/KarpenterInstanceNodeRole
      username: system:node:{{EC2PrivateDNSName}}
  mapUsers: |
    - groups:
      - system:masters
      userarn: arn:aws:iam::xxx:user/xxx@xxx.com
      username: xxx@xxx.com

... 중간 생략 ...

 

 

 

 


[ karpenter 설치 ]

 

 

1. karpenter 설치

설치 변수

  • ${KARPENTER_IAM_ROLE_ARN}
    • 위에서 생성한 KarpenterControllerRole 입력
    • arn:aws:iam::xxx:role/KarpenterControllerRole
  • ${CLUSTER_ENDPOINT}
    • clustern endpoint 정보
    • aws eks describe-cluster --name ${cluster_name} --query "cluster.endpoint" --output text
  • KarpenterNodeInstanceProfile-${CLUSTER_NAME}
    • KarpenterNodeInstanceProfile 정보 입력
KARPENTER_IAM_ROLE_ARN="arn:aws:iam::xxxx:role/KarpenterControllerRole"
CLUSTER_NAME="xx-eks-cluster"
CLUSTER_ENDPOINT="https://xxxxxx.gr7.ap-northeast-2.eks.amazonaws.com"

helm upgrade --install --namespace karpenter --create-namespace \
  karpenter oci://public.ecr.aws/karpenter/karpenter \
  --version 1.5.0 \
  --set "serviceAccount.annotations.eks\.amazonaws\.com/role-arn=${KARPENTER_IAM_ROLE_ARN}" \
  --set settings.clusterName=${CLUSTER_NAME} \
  --set replicas=1 \
  --wait

 

 

2. EC2NodeClass 설정

  • EC2NodeClass은 Karpenter가 Node를 생성할 때 참조하는 내용이 들어있다.
      • Node AMI 이미지
      • 인스턴스 프로파일, Role
      • subnet, SG그룹
      • Tag 등

기존에는 "Provisioner"으로 설정했는데

karpenter 1.5.0 버전 에서는 EC2NodeClass와 NodePool으로 설정파일이 변경되었습니다.

 

  • ec2nodeclass.yaml 파일 생성
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
  name: app-nodeclass
spec:
  amiFamily: AL2
  amiSelectorTerms:
#    - name: "amazon-eks-node-al2023-x86_64-standard-1.32-*"
    - name: "amazon-eks-node-1.32-*"
  role: htc-dev-KarpenterInstanceNode-role
  subnetSelectorTerms:
    - tags:
        karpenter.sh/discovery: xxx-eks-cluster
  securityGroupSelectorTerms:
    - tags:
        karpenter.sh/discovery: xxx-eks-cluster
  tags:
    karpenter.sh/discovery: xxx-eks-cluster

 

 

  • ec2nodeclass.yaml 파일 배포
kubectl apply -f ec2nodeclass.yaml

kubectl get ec2nodeclass app-nodeclass
kubectl describe ec2nodeclass app-nodeclass


NAME            READY   AGE
app-nodeclass   True    20h
# READY 상태값 True 확인

 

 

 

3. NodePool 설정

  • NodePool은 스케쥴러가 어떤 조건에 맞춰 노드를 만들지 정의하는 내용이 들어있습니다.
    • 어떤 NodeClass를 사용할지
    • 어떤 라벨, 테인트, 우선순위를 가진 파드를 위한 노드를 만들지
    • 몇 개까지 확장/축소할 수 있는지
    • 어떤 스케쥴링 전략을 따를지 등등

기존에는 "Provisioner"으로 설정했는데

karpenter 1.5.0 버전 에서는 EC2NodeClass와 NodePool으로 설정파일이 변경되었습니다.

 

 

  • karpenter-provisioner.yaml 파일 생성
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: app-nodepool
spec:
  template:
    metadata:
      labels:
        role: app
        Provisioner: karpenter
        nodegroupname: app
    spec:
      nodeClassRef:
        name: app-nodeclass
        group: karpenter.k8s.aws
        kind: EC2NodeClass
      requirements:
        - key: node.kubernetes.io/instance-type
          operator: In
          values: ["t2.small"]
        - key: topology.kubernetes.io/zone
          operator: In
          values: ["ap-northeast-2a", "ap-northeast-2c"]
        - key: karpenter.sh/capacity-type
          operator: In
          values: ["on-demand"]
  disruption:
    consolidateAfter: 30s

 

 

  • karpenter-provisioner.yaml 배포
kubectl apply -f app-nodepool

kubectl get nodepool app-nodepool
kubectl describe nodepool app-nodepool

NAME           NODECLASS       NODES   READY   AGE
app-nodepool   app-nodeclass   0       True    20h
# READY 상태가 True 인지 확인

 

 

 

[ 옵션 링크 ]

https://karpenter.sh/docs/concepts/nodeclasses/

https://karpenter.sh/docs/concepts/nodepools/

 


[ karpenter 테스트 ]

 

1. Pod 생성

  • php-apache pod 생성
  • nodeSelector을 "nodegroupname: app" 설정
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  replicas: 1
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
      nodeSelector:
        nodegroupname: app
      tolerations:
      - effect: NoSchedule
        key: node-role
        operator: Equal
        value: app
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: run
                operator: In
                values:
                - php-apache
            topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
  namespace: dw
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 3
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

 

 

  •  pod 배포 및 과부화 설정
kubectl apply -f php-apache.yaml

# wget 부하

kubectl run -i -n dw \
    --tty load-generator \
    --rm --image=busybox \
    --restart=Never \
    -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

 

 

 

2. Pod Pending

  • "nodegroupname: app" node가 존재하지 않아서 Pending 상태

 

  • 에러 메세지
    •   Warning  FailedScheduling  29m (x4 over 33m)     default-scheduler  0/14 nodes are available: 14 node(s) didn't match Pod's node affinity/selector.

 

 

3. Node 생성

 

  • karpenter가 node 생성 프로세스
    • karpenter가 Pending POD를 감지
    • Pending POD가 provisioner에 설정한 내용가 일치하면 Node 생성
    • Node NotReady 상태
    • Node Ready 상태
    • POD가 Node에 배포됨
    • node 생성 및 pod 배포까지 약 2분 30초 소요
 
  • karpenter log 메세지
{"level":"INFO","time":"2025-06-19T01:21:39.073Z","logger":"controller","message":"found provisionable pod(s)","commit":"9458bb5","controller":"provisioner","namespace":"","name":"","reconcileID":"aa5f7759-2dcb-486c-a835-d88ef1ad098e","Pods":"dw/php-apache-797445db87-qlcp6","duration":"21.161127ms"}
{"level":"INFO","time":"2025-06-19T01:21:39.074Z","logger":"controller","message":"computed new nodeclaim(s) to fit pod(s)","commit":"9458bb5","controller":"provisioner","namespace":"","name":"","reconcileID":"aa5f7759-2dcb-486c-a835-d88ef1ad098e","nodeclaims":1,"pods":1}
{"level":"INFO","time":"2025-06-19T01:21:39.087Z","logger":"controller","message":"created nodeclaim","commit":"9458bb5","controller":"provisioner","namespace":"","name":"","reconcileID":"aa5f7759-2dcb-486c-a835-d88ef1ad098e","NodePool":{"name":"app-nodepool"},"NodeClaim":{"name":"app-nodepool-hrc59"},"requests":{"cpu":"510m","memory":"368Mi","pods":"7"},"instance-types":"t2.small"}
{"level":"INFO","time":"2025-06-19T01:21:40.834Z","logger":"controller","message":"launched nodeclaim","commit":"9458bb5","controller":"nodeclaim.lifecycle","controllerGroup":"karpenter.sh","controllerKind":"NodeClaim","NodeClaim":{"name":"app-nodepool-hrc59"},"namespace":"","name":"app-nodepool-hrc59","reconcileID":"6c17bd79-6c1f-42c8-a265-f1df8bbd1717","provider-id":"aws:///ap-northeast-2c/i-0fa96b75022e39e6b","instance-type":"t2.small","zone":"ap-northeast-2c","capacity-type":"on-demand","allocatable":{"cpu":"940m","ephemeral-storage":"17Gi","memory":"1418Mi","pods":"11"}}
{"level":"INFO","time":"2025-06-19T01:22:27.997Z","logger":"controller","message":"registered nodeclaim","commit":"9458bb5","controller":"nodeclaim.lifecycle","controllerGroup":"karpenter.sh","controllerKind":"NodeClaim","NodeClaim":{"name":"app-nodepool-hrc59"},"namespace":"","name":"app-nodepool-hrc59","reconcileID":"fc9f1211-8269-4d1b-ad92-73519fd8f9a4","provider-id":"aws:///ap-northeast-2c/i-0fa96b75022e39e6b","Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"}}
{"level":"INFO","time":"2025-06-19T01:22:47.798Z","logger":"controller","message":"initialized nodeclaim","commit":"9458bb5","controller":"nodeclaim.lifecycle","controllerGroup":"karpenter.sh","controllerKind":"NodeClaim","NodeClaim":{"name":"app-nodepool-hrc59"},"namespace":"","name":"app-nodepool-hrc59","reconcileID":"7a7577bc-445c-440e-9fe2-9a61e220053f","provider-id":"aws:///ap-northeast-2c/i-0fa96b75022e39e6b","Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"},"allocatable":{"cpu":"940m","ephemeral-storage":"18242267924","hugepages-2Mi":"0","memory":"1518756Ki","pods":"11"}}

 

 

 

 

4. POD Running
  • Karpenter가 Node 증설 후 POD가 배포됨

 

  • pod log 메세지

  Normal   Nominated         12m                 karpenter          Pod should schedule on node: ip-10-223-70-189.ap-southeast-1.compute.internal

 

 

5. Node 축소

 

  • POD를 삭제하면 karpenter가 생성한 node에 배포된 pod가 없어서 자동으로 축소됨

 

  • karpenter log 메세지
{"level":"INFO","time":"2025-06-19T01:44:32.666Z","logger":"controller","message":"disrupting node(s)","commit":"9458bb5","controller":"disruption","namespace":"","name":"","reconcileID":"f6490441-ccb7-42cd-a60c-1436d26d4f9a","command-id":"a3d5c445-c60a-47e2-8f2d-ef365c84c53a","reason":"empty","decision":"delete","disrupted-node-count":1,"replacement-node-count":0,"pod-count":0,"disrupted-nodes":[{"Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"},"NodeClaim":{"name":"app-nodepool-hrc59"},"capacity-type":"on-demand","instance-type":"t2.small"}],"replacement-nodes":[]}
{"level":"INFO","time":"2025-06-19T01:44:33.161Z","logger":"controller","message":"tainted node","commit":"9458bb5","controller":"node.termination","controllerGroup":"","controllerKind":"Node","Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"},"namespace":"","name":"ip-10-110-9-183.ap-northeast-2.compute.internal","reconcileID":"5eb78fe9-225d-41cf-ab8a-bc7e74ace8e4","NodeClaim":{"name":"app-nodepool-hrc59"},"taint.Key":"karpenter.sh/disrupted","taint.Value":"","taint.Effect":"NoSchedule"}
{"level":"INFO","time":"2025-06-19T01:45:10.120Z","logger":"controller","message":"deleted node","commit":"9458bb5","controller":"node.termination","controllerGroup":"","controllerKind":"Node","Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"},"namespace":"","name":"ip-10-110-9-183.ap-northeast-2.compute.internal","reconcileID":"d56ca5e0-d552-42a5-adaa-ee354c24034b","NodeClaim":{"name":"app-nodepool-hrc59"}}
{"level":"INFO","time":"2025-06-19T01:45:10.349Z","logger":"controller","message":"deleted nodeclaim","commit":"9458bb5","controller":"nodeclaim.lifecycle","controllerGroup":"karpenter.sh","controllerKind":"NodeClaim","NodeClaim":{"name":"app-nodepool-hrc59"},"namespace":"","name":"app-nodepool-hrc59","reconcileID":"18f2aadf-e67c-48b6-ba0e-c0dccabf2a8b","provider-id":"aws:///ap-northeast-2c/i-0fa96b75022e39e6b","Node":{"name":"ip-10-110-9-183.ap-northeast-2.compute.internal"}}

 

 

 

 


[ karpenter 테스트 ]

EC2가 만들어졌는데, EKS 조인이 안될경우

  • EC2 접속해서 에러 및 원인을 파악한다.
  • EC2 UserData 내용을 확인한다.

 

 

1. # EC2 접속해서 디버그

Karpenter가 EC2를 만들었는데 EKS에 조인이 안될경우, EC2에 접속해서 원인을 파악한다.

 

# EC2 접속

aws ssm start-session --target i-xxxxx (인스턴스ID)

ps -ef | grep bootstrap.sh
sudo cat /var/log/cloud-init-output.log | grep bootstrap
sudo cat /var/log/cloud-init.log
sudo cat /var/log/messages | grep bootstrap
sudo journalctl -u kubelet
sudo systemctl status kubelet
sudo systemctl start kubelet



반응형