윈도우 - client(kubectl 명령 이쪽으로 빼기), 클러스터를 2개를 연결시킬 것
VM - 클러스터 서버1(api-server, 노드 3개)
AWS EKS - 클러스터 서버2
스크립트는 자동화의 핵심역할이다.
1 Git Bash 설치
다운로드 할때 설정되어있는 체크들은 따로 건들지 않고 next를 해서 설치해준다.
# 파워쉘을 관리자 권한으로 실행한다.
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
# 설치 확인
choco
3 git bash에서 kubectl 설치 실행
# 버전 1.24를 맞춰서 kubectl 설치
choco install kubernetes-cli --version=1.24.10
최신버전을 설치하기보단 우리가 사용하는 1.24버전 맞춰주는것이 좋다.
4 윈도우 환경에 config 파일 가져오기
# kube-control1에 접속하여 내부에 있는 config 파일 찾기
# config 파일 복사
cat ./.kube/config
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1ESXhNekExTWpnd01Gb1hEVE16TURJeE1EQTFNamd3TUZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS0NKCmZTRlhBMHZ5L3NONHhNMEpmMGN5UHhVVURJWWdOM3BKR2YvdDhYTm1WUUJWVmlrY1A3bWt1QzJuaERvaTM3SXoKQ0g1ZWVVamM0ZlhuanlkR0ZYdFpqaExDaE9ORDNkbjhLRnBmT3hsTzQrMHg0SkltRVVZbW9XL3R4SllGSUdESwpNenBscDdrZlBaWkJPQ2lCMzlmWEtWNWxaNU9qMFBscWMyUlN3SGw4enZFdVg3cXg4c2V2amNBNWsyMXZRN2xlCjVHam1IMTRqVEVocVdLYVdhUmNnYnM3STJPSUtTSkpkVWc4ZTJZalF3YmV2ZDhXSUR2Uys4MS9sdnVlVjdqeDMKUUNLMjFycjNqT3lEcThBOUgySDlMU2lVMm11NGl0QkQ4azlWa2E0UDZZVE1DVzNNakRzM2t0RkdiQTVSZjJrawpBSExhbWx5eUdZYks1bmxYb3lrQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZEaVh3MFBkTGpYamNMa3hjSm55akphc2tpeUVNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSFJqcEQ0ejFxcUZVTUVuMkE5TwpGNFB3MzNzdG03ZGFreXArdWpUVlF6VC9aRFV1VE9VcW1IWW1TaUl1alMxRmpPRVp6SXNydjJMTFdGL1ZRcUdLCkhKZXYreC9sVlJhSXl6aTdNVzI2cDJ4d2lmaXlITTAxSW9DSW9TS0YyYnYybzE2R2s3N2Joa3ZQMW9SMkszaVQKcTJYNVZzTlJqb0x5MXoyRkp6RGs3OXFQbDJlMW85a3l0Q0d3OXROVjJhK0IwajFlVmx2aTVmWnE3dldxL0JuRQp0WFZ0UGZtUTJvWm9KVmZXanYzUnlkZUFxOTRKMjNUVWpIcmhwNFVuTnRLRC9QdWJoSEZJSjZkTnV2YjFDajQyClRpWWJkU2dsQUl1eWJ1ZHplQ296TXpQSFV6NGVoT3N6Um5NL1VjYmVkdkVpUWJrVFRCY0dVOXVUSW9aclhqTWIKNFN3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://127.0.0.1:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
namespace: default
user: kubernetes-admin
name: kubernetes-admin@cluster.local
current-context: kubernetes-admin@cluster.local
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ0lJSjdTUXdkOFVMeUV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TXpBeU1UTXdOVEk0TURCYUZ3MHlOREF5TVRNd05USTRNREZhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXlZOEtQa00vMkZKcGFHSUIKWjQxY21hYlYvTExzbUJsMzJKc2pOQTBOLzBqV0ZzR1k1K01wclg5V1pPR0dkZjRFV1RlSXFTMGd0UDgvSmJ4SQpLQXdMcDI5SlkvaFlzc3krWWhHdlpZazJsSHl2RHVyQ2Y4TE1VQ3JzQzNvTlVJVytkbjFTRVA5RUswRldDNHdBCnhEa1IvSVl5OGpmWkhTbGNPUTVZUTdtejZ4aXBLRFlhUWdLWlEyOFIrSTZteVQ0N3VjUnF1YW9DVFU2UzZTanQKbFJuS0ZSSTNSWkVCV3NOVkFzRGVkK1ZWNVlGQnVqdDQ2Y3pWOHNIZ2dvS0RyM3lEQ1ViRUdmOVpPQXFXbmg4SgpYd2YwUUg1Tm1yNG1NYzZqSHdNKzFCVDJWcW5FYmZsNGduNDI5b256TEFUdnNpWkVYd3hPbmdJUUR5Z3JUbDdlCjFkM3lXd0lEQVFBQm8xWXdWREFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RBWURWUjBUQVFIL0JBSXdBREFmQmdOVkhTTUVHREFXZ0JRNGw4TkQzUzQxNDNDNU1YQ1o4b3lXckpJcwpoREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBbjNkdU1GU3o4TWFzM3Mwc3BENkZCMEF1QXJJZVNGZVErTGJRCmFLQ0l6U0cwdGhlcFhmcHpiZWxjZTNXMjA5UFd1S1BlclBkSHlxbUFtQTlRWDRDUWFzTEs0Y3J5SWVYblNCaSsKNXRHNEd3STVTZlZYa0FTZmgrVnh3eE5mRFgzWHNocWxyOHRmR2tMNFI1M2l3TEhJczh6Y09zZGxCcW9sWFdRSgpHMXllQnhIM3Fqd2l0R3V0bXhLVGs5YVdib0FlZHkxVE93b3FuMlVPWFllNmpubU83Ukw2WWdnSjNOMkFaT3NnCmVYcE1OSDJjbW1WOCtwem9PR2pxemdSd0ZlaW9kODBmUC9USUMxRXhwZnpJOFVNMVJ2OHN4ZXRtS21DamVsUXUKbXlKREhMNFRPK2ptWUFoVjRsenRPRmVhMWVROFFIUGRLdjhIbW45SzhtK2VCYlRBd2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBeVk4S1BrTS8yRkpwYUdJQlo0MWNtYWJWL0xMc21CbDMySnNqTkEwTi8waldGc0dZCjUrTXByWDlXWk9HR2RmNEVXVGVJcVMwZ3RQOC9KYnhJS0F3THAyOUpZL2hZc3N5K1loR3ZaWWsybEh5dkR1ckMKZjhMTVVDcnNDM29OVUlXK2RuMVNFUDlFSzBGV0M0d0F4RGtSL0lZeThqZlpIU2xjT1E1WVE3bXo2eGlwS0RZYQpRZ0taUTI4UitJNm15VDQ3dWNScXVhb0NUVTZTNlNqdGxSbktGUkkzUlpFQldzTlZBc0RlZCtWVjVZRkJ1anQ0CjZjelY4c0hnZ29LRHIzeURDVWJFR2Y5Wk9BcVduaDhKWHdmMFFINU5tcjRtTWM2akh3TSsxQlQyVnFuRWJmbDQKZ240MjlvbnpMQVR2c2laRVh3eE9uZ0lRRHlnclRsN2UxZDN5V3dJREFRQUJBb0lCQVFEQWRWY0FrTkk3eXFWZgp5SVV5emFab0NRZzNITm9SZWZBWDRqckJEdDRZcndIT0JObnVRZGlnRkFENG51ZjNicS9VU05TelJhWC9iZUpzCk05WnFkdVlCNEoraFY1ZktVdnBQUmpmR3FqaDFuSUREcTZKQXdFNjdGZUVDTEc3ZVBuYlpTVnk5WWlGRGRFV24KRE80R2I4QWU4ajFmVDdoK3dlbVBpWVQ2VmkzWUFxWjBaQ0swNVg0ZUU3OUNvT1lKNThnMHJoT0RWNlg4Mm9kKwp2L3RqcSs3R002T0JaeU1na1FaUTBJUFM5a2hIUUx2dUFNRnEyclFHTm5OaG1leEdzVjhDSnp5L3ozbHpwOUlDCk9qTzErSU4vcDY5MlhSM1Z5Q0ZmU1lXQjF3WkU0SGpycGhYY0hvL1RYNEhUZnAxRS9sRytYalJKbDc0RkVKUVUKTW1DemxsS0JBb0dCQVBtdnVwSWF5aVJDejZycWU4MWUzT1FRMFNVelVKZmhQUC9iTFFmUE5Gb1VOL1h5ZjlpLwpnRGJJbnZpM2c0bDQ3NUJ5enZRVGhQSnFYZWNyWHRMdFNUYktuK1RMdnlvK3VGQzhLcGJBT053ZUZHWlhTcUVVCmtvTFpRMzdVd1FKSDFmTzJKdjVTWW5aNUdRVHNVeGl0Q2tTbFJuT2pyM0xDNWQ0T24waTdEUXo3QW9HQkFNNm4KeFZmczdzSnZ4L0FYR1BWV01rNExZbHoxdHcwRVRBSGhRWnNYVU9VeTM5UUM4c1R2NlF5Zzh4WTdFVWplK3FiZQpaayt3a2dscEpHK1ZXVEVTTWZjbDNDb3VYWWphdTQ2LzNFbURxMGJOZTF2V1lLQ2VJWU9nVlluM3F1aXhuZy9RCnhjUEtXNkt6UytEc3ZOdVAvUjRxMUR4OVBVaytPWXJsUjgwZ252SWhBb0dCQU54MEU3NjhlSTNiajQvUXlNNWoKVzVUaVpFYjhMOFJwMG5uMUFxVktoV2FqUTJXY1h0VDVBRE5lbnozcWlmRHZIbFhqaUdab2RaR3o2SVVhL2ZZdQpHOTZNdVBCQ0ZOOHYwWDAzSmtORUpPLzBmdjU5UkI5RkVyY0ZMVnJtYmlPZFdZSjg2YURUREt5ZDcwRXhoNHpaCis1N3dibXZic2lVWmYrdTM3VnRDREJ2UkFvR0FJalFVYnBRUmhHNzUyWndKRG5vZ3cxZ1JCSy9LaDBZQnlvSGMKMk8ySC94ZG5nbkNtZTcvMWc1aVVBMGJ0ZW5FbGJUNzhFZzU0YlVSUXVvTXVpdmVtKzIveHU2MkczNkxNVGprbApIYW5FVEdpd0ZTZ3JRQXBNSTd3Q3pGNElsSkRwUjFiWGxLdEdkV3hWajdtL0hGdjltZU9lMHhBcmQ1YnI4VGczCnBSVFVHZUVDZ1lFQXBJdWtNV0hYV1h3OGxRd09IVHB3ZEhBc1pVOUUzM2txV0dtWUJsajNmUlJ2WlJieHNxRUMKZEJqWDd0eHdtcW9PL3pQbXN2anB0WnI1dDNKY05aSlZLcXFTZUJOR3J2dnE3M2drQ0RGZ3gweTU0SlpvalVOdwpNVHhWcVZIYjljZEsyTHo4bkVvZjRJd0VhZHlaTmpCWFI5ck9CcnlYcUp1aVkwNk5YSUdiSEhjPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
---------------------------------------------------------------------
# Git bash에서 실행
# 경로 이동 C:\Users\shin\.kube
cd ~
mkdir .kube
cd .kube
pwd
# 파일 생성 후 붙여넣기 (아무 방식이나 상관없음)
code config -> 비쥬얼 스튜디오
vi config -> vim 편집기
IP를 control node의 IP로 수정
'''
server: https://192.168.56.11:6443
name: cluster.local
contexts:
- context:
'''
# kubectl 동작확인, node정보가 잘 나오면 성공
kubectl get nodes
Amazon EKS 시작하기
Amazon EKS에서 클러스터를 설치하기 위한 방식은 2가지가 있는데 우리는 밑의 방식을 사용할 것이다.
eksctl - The official CLI for Amazon EKS 소개
1 eksctl 설치(파워쉘에서 관리자 권한으로 실행 후 진행)
choco install eksctl
choco install awscli
choco install aws-iam-authenticator
choco install kubernetes-helm
2 AWS 계정으로 로그인 한 후, IAM 사용자에서 내 계정 이름에 들어간다. 그 후 보안자격 증명으로 들어가서 밑 액세스 키 만들기를 클릭한다.
CLI로 체크한 이후 액세스키를 만들고 만들었다면 .csv파일을 다운받아둔다.
3 git bash에서 명령으로 액세스한다. 다운 받은 파일에서 ID와 key 값을 확인해서 입력해주고 리전(ap-northeast-2)과 json은 디폴트로 놔두면 된다.
aws configure
4 클러스터 생성
eksctl create cluster --naem myeks --region ap-northeast-2
5 aws eks에서 들어가서보면 생성된 것을 확인 할 수 있다.(ec2, vpc 등 모든 것이 설치됨)
CloudFormation: 반드시 CREATE_COMPLETE가 되어있어야 함, 이를 통해서 배포한 것이다.
내용을 확인해보면 클러스터가 추가되어있는 것을 확인 할 수 있다. 밑은 user또한 우리의 IAM 계정과 연결되어 있는 것을 볼 수 있다. 실제로 command: aws-iam-authenticator 명령을 통해서 인증을 하는 것이다.
kubectl config view
# 설치된 내용 확인
kubectl config get-cluster
kubectl config get-users
kubectx. kubens 등을 패키지도 따로 설치해서 사용할 수 있다.
# 현재 컨택스트의 노드 확인 -> 현재는 nrf 계정의 노드임
kubectl get nodes
# 사용가능한 컨택스트 확인
kubectl config get-contexts
# 컨택스트 전환
kubectl config use-context 컨택스트명
# 바뀐 컨택스트의 노드 확인 -> 기존 쿠버네티스의 노드임
kubectl get nodes
eksctl delete cluster --name myeks
eksctl-example.yaml 예시로 내용구성을 한번 확인해보면 좋을 것 같다.
vi myeks.yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: myeks
region: ap-northeast-2
version: "1.24" # 쿠버네티스 버전
# AZ,defulat로는 기본적으로 3개 랜덤 생성
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
# IAM OIDC & Service Account
iam: # aws의 IAM 의미
withOIDC: true
serviceAccounts: # SA계정만 생성
- metadata: # 인그레스용
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true # 역할 세팅
- metadata: # 볼륨용
name: ebs-csi-controller-sa
namespace: kube-system
wellKnownPolicies:
ebsCSIController: true
- metadata: # CA용
name: cluster-autoscaler
namespace: kube-system
wellKnownPolicies:
autoScaler: true
# Managed Node Groups
managedNodeGroups:
# On-Demand Instance
- name: mynodes-t3
instanceType: t3.medium
minSize: 1
desiredCapacity: 2
maxSize: 3
privateNetworking: true
#ssh:
#allow: true
#publicKeyPath: ./keypair/myeks.pub
availabilityZones: ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
iam:
withAddonPolicies:
autoScaler: true
albIngress: true
cloudWatch: true
ebs: true
# Fargate Profiles
fargateProfiles:
- name: myfg
selectors:
- namespace: dev
labels:
env: dev
# CloudWatch Logging
cloudWatch:
clusterLogging:
enableTypes: ["*"]
Open ID Connection(OIDC): 쿠버네티스 계정은 사용자와 서비스 계정으로 2개가 있는데 사용자 계정의 경우 쿠버네티스 자체에 구현되어 있지 않다. 그래서 우리는 x509 표준으로 인증을 했었다. 외부의 인증을 연결해주는 표준방식을 말한다. 이를 true를 해줘야 aws의 IAM과 쿠버네티스가 연결이 된다.
1 myeks.yaml파일로 클러스터 생성
cd ~
git clone https://github.com/c1t1d0s7/goorm-8th-k8s.git
cd goorm-8th-k8s/manifests/14_eks/01_eksctl
eksctl create cluster -f myeks.yaml
2 zsh 설치
zsh 다운로드 링크
파일 모두 압축을 해제한 이후 etc 폴더와 usr 폴더를 C:\Program Files\Git 경로에 복사 붙여넣기 해준다. 이후 Git bash에 들어가 ps를 해보면 zsh이 실행중인 것을 확인 할 수 있다.
oh my zsh 다운로드 페이지
# 설정 파일 생성
vi ~/.bashrc
if [ -t 1 ]; then
exec zsh
fi
# oh my zsh 설치
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
📢 이 순서대로 진행하면 zsh 설치가 가능하다.전체 설치 과정
3 zsh 사용하기 용이하게 설정하기
설정 과정 따라가기
Nerd Font: 엔지니어를 위한 특수 폰트
# Install Powerlevel10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# zsh의 설정파일
vi ~/.zshrc
11번째줄 수정
ZSH_THEME="powerlevel10k/powerlevel10k"
# 저장후 git bash를 껏다가 다시 켜면 새로운 화면이 나올 것이다.
마음에 드는 형태로 설정
y y y y 1(Unicode) 2(24시간) 2(two line) 2(Dotted) 2(left)
2(white) 2(sparse) 2(many icon) 2(Fluent) y 1(verbose) y
p10k configure로 처음부터 다시 세팅가능
vi ~/.zshrc
80번째 수정
plugins=(git kubectl kube-ps1 helm)
eks에 접속해서 확인해보면 myeks가 만들어져 있을 것이다.
개요 -> OpenID Connection 공급자 URL: 이 주소는 aws의 IAM이다.
ec2 인스턴스 -> 네트워킹 -> 서브넷을 보면 SubnetPrivateAPNORTHEAST2C이라 나와있다.
이는 클러스터를 설치했을 때, managedNodeGroups에서 privateNetworking: true로 해서 프라이빗네트워크에 있는 것이다. 즉 인스턴스가 외부에 직접적으로 연결되어 있지 않다는 것을 알 수 있다.
kubectl get nodes -o wide
auto Scaling 그룹 -> 사이즈를 확인하면 최소 1, 최대 3으로 되어있는데 이것도 파일에서 설정한 것이다.
IAM -> 역할 -> eksctl 검색을 진행하면 나오는 역할들이 서비스 계정을 생성했을때 설정되어있다.
# 네임스페이스 kube-system으로 바꾸기
kubectl config get-contexts
kubectl config set-context nrf0017@myeks.ap-northeast-2.eksctl.io --namespace=kube-system
# SA 계정이 만들어져 있음
kubectl get sa aws-load-balancer-controller
# annotation이 부여되어있음
kubectl describe sa aws-load-balancer-controller
쿠버네티스 SA계정이랑 AWS IAM이 연결되어 있고, 여기나오는 Role이 SA 계정에 부여되어 있다는 것이다.
가용영역 -> pub, pri 서브넷이 각각 존재,
가용영역의 보안그룹에서 노드포트의 해당 영역(30000-302760)의 포트를 열어줘야한다.
로드 밸런스를 만들어보면 외부 IP가 안만들어지는 것을 볼 수 있다.
# LB타입 서비스를 하나 만들어준다.
# 외부 IP 주소 생성됨
kubectl get svc
# 프라이빗 네트워크지만 외부에서 접속을 하면 접속된다.
PVC도 실행X(pending 상태, 볼륨을 만들지 못하기 때문에 아무것도 만들지 못함)
-> EBS CSI Driver Provisioner를 설치해야 한다.
매트릭 서버가 없기 때문에 hpa 또한 불가능하다.
-> Metrics-Sercer를 설치해야 한다.
위와 같은 차이들이 있기 때문에 온프레미스에서 사용했던 내용들을 AWS에서도 똑같이 사용할 수 있도록 구성해 나갈 것이다.