k8s라고도 알려진 쿠버네틱스.
컨테이너형 애플리케이션의 배포, 확장, 관리를 자동화 하는 오픈소스 시스템이다.
쿠버네티스는 선언적 구성과 자동화를 모두 용이하게 해준다.
복잡하고 다양한 작업을 하지만 자세히 들여다보면 현재상태를 모니터링 하면서 관리자가 설정한 원하는 상태를 유지하려고 내부적으로 이런저런 작업을 하는 로직을 가지고 있다.
쿠버네티스의 핵심은 ‘상태’ 이며, 쿠버네티스를 사용하려면 어떤 상태가 있고 어떻게 상태를 선언하는지를 알아야한다.
$ docker run # 명령
$ kubectl create # 상태 생성
쿠버네티스는 분산 시스템을 탄력적으로 실행하기 위한 프레임워크를 제공한다.
애플리케이션의 확장과 장애 조치를 처리하고, 배포 패턴 등을 제공한다.
쿠버네티스는 다음을 제공한다.
Automated rollouts and rollbacks
Service discovery and load balancing
Storage orchestration
Secret and configuration management
Automatic bin packing
Batch execution
IPv4/IPv6 dual-stack
Horizontal scaling
Self-healing
Desinged for extensibility
HPA (Horizontal Pod AutoScaler)
VPA (Vertical Pod Autoscaler)
쿠버네티스는 상태를 관리하기 위한 대상을 오브젝트로 정의한다.
쿠버네티스에서 배포할 수 있는 가장 작은 단위로, 한 개 이상의 컨테이너와 스토리지, 네트워크 속성을 가짐. Pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 localhost로 접근할 수 있음. 컨테이너를 하나만 사용하는 경우도 반드시 Pod로 감싸서 관리
Pod를 여러개 복제하여 관리하는 오브젝트. Pod를 생성하고 개수를 유지하려면 반드시 ReplicaSet을 사용해야함.
네트워크와 관련된 오브젝트. Pod를 외부 네트워크와 연결해주고, 여러개의 Pod를 바라보는 내부 로드 밸런서를 생성할 때 사용. 내부 DNS에 서비스 이름을 도메인으로 등록하기 때문에 서비스 디스커버리 역할도 함.
저장소와 관련된 오브젝트.
오브젝트의 spec은 YAML파일로 정의하고 여기에 오브젝트의 종류와 원하는 상태를 입력합니다.
쿠버네티스에서 오브젝트를 생성할 때, (이름과 같은) 오브젝트에 대한 기본적인 정보와 더불어, 의도한 상태를 기술한 오브젝트 spec을 제시해 줘야만 한다.
오브젝트를 생성하기 위해(직접이든 또는 kubectl
을 통해서든) 쿠버네티스 API를 이용할 때, API 요청은 요청 내용 안에 JSON 형식으로 정보를 포함시켜 줘야만 한다.
대부분의 경우 정보를 .yaml 파일로 kubectl
에 제공한다. kubectl
은 API 요청이 이루어질 때, JSON 형식으로 정보를 변환시켜 준다.
<예시>
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
쿠버네티스는 애플리케이션을 배포하기 위해 원하는 상태를 다양한 오브젝트에 라벨을 붙여 정의하고 API 서버에 전달하는 방식을 사용.
중앙에 API서버와 상태 저장소를 두고 각 서버의 에이전트와 통신하는 구조이다.
마스터 -노드 구조
마스터에 명령을 내리고 마스터가 노드에 접속하여 대신 결과를 응답한다.
Master
Node
Kubectl
api 서버는 json 또는 protobuf형식을 이용한 http통신을 지원함. 보통 kubectl이라는 명령행 도구 사용
Amazon EKS는 자체 Kubernetes 제어 영역이나 작업자 노드를 설치 및 운영할 필요 없이 AWS에서 Kubernetes를 손쉽게 실행할 수 있도록 지원하는 관리형 서비스입니다.
다양한 AWS 서비스와 통합되어 애플리케이션에 확장성과 보안을 제공
오픈 소스 Kubernetes 소프트웨어의 최신 버전을 실행하므로 Kubernetes 커뮤니티에서 모든 기존 플러그인과 도구를 사용할 수 있다. Amazon EKS에서 실행되는 애플리케이션은 온프레미스 데이터 센터에서 실행 중이든 퍼블릭 클라우드에서 실행 중이든 상관없이 모든 표준 Kubernetes 환경에서 실행되는 애플리케이션과 완벽하게 호환된다. 즉, 필요한 코드를 수정하지 않고 표준 Kubernetes 애플리케이션을 Amazon EKS로 쉽게 마이그레이션할 수 있습니다.
VPC와 통합
지원하는 운영체제
- Amazon EKS는 Kubernetes와 호환되는 Linux x86, ARM 및 Windows Server 운영 체제 배포를 지원
사용자 권한에 원활한 실습을 위해 AdministratorAccess policy 부여
kubectl 설치(1.18)
eksctl설치
Deploy EKS Cluster
- 방법1. yml 작성
```yaml
---
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: cloud-eks-cluster
region: ap-northeast-2
availabilityZones: ["ap-northeast-2a", "ap-northeast-2c"]
iam:
withOIDC: true
managedNodeGroups:
- name: cloud-eks-workers
desiredCapacity: 1
iam:
withAddonPolicies:
albIngress: true
instanceTypes: ["c4.large","c5.large"]
spot: true
# instanceType: t3.small
# ssh:
# publicKeyName: "<your key pair name>"
# https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#KeyPairs:
cloudWatch:
clusterLogging:
enableTypes: ["audit", "authenticator", "controllerManager"]
```
- 방법2. CLI로 수행
```powershell
eksctl create cluster \
--name cloud-eks-01 \
--version 1.18 \
--region ap-northeast-2 \
--zones=ap-northeast-2a,ap-northeast-2c \
--nodegroup-name cloud-eks-workers \
--nodes 1 \
--nodes-min 1 \
--nodes-max 3 \
--with-oidc \
--managed \
--alb-ingress-access \
--spot \
--instance-types=c4.large,c5.large
```