개요
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분 걸림
- https://aws.amazon.com/ko/blogs/korea/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/
- https://aws.amazon.com/ko/about-aws/whats-new/2021/11/aws-karpenter-v0-5/
- https://aws.amazon.com/ko/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/
- https://karpenter.sh/v0.27.1/getting-started/
[ 아키텍처 ]

[ 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 역할이 필요합니다.
- KarpenterInstanceNodeRole 이란?
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)를 생성할 수 있는 권한을 설정합니다.
- karpenter가 AWS의 EC2(NODE)를 생성할 수 있는 권한을 설정합니다.
- KarpenterControllerRole 이란?
- 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
- "KarpenterControllerRole" IAM 역할에 Policy을 연결합니다.
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 설치 ]
- helm repository URL : https://github.com/aws/karpenter/tree/main/charts/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"}}
- 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
'인프라 > 시스템 구축' 카테고리의 다른 글
[ node 정보 ] node에 접근해서 내용보기, 사용량 (0) | 2025.05.14 |
---|---|
[ time ] UTC, KST 변경 (0) | 2025.04.30 |
[ service ] Type ExternalName (0) | 2023.06.29 |
[ EBS ] PV, PVC, POD 배포 (0) | 2023.06.29 |
[ istio ] ALB 설정 (Internal,Internet-facing) (0) | 2023.06.29 |