AWS 에서 Kubernetes 사용하는 방법은 Managed Service 인 EKS 서비스를 신청/설치 방법과 일반 VM 에 Kubernetes 를 설치하는 방법이 있다.
VM 에 Kubernetes 를 설치하는 방법은 VM 을 생성하고 필요한 Security Group 을 지정하고 Muti Control plane 에 ELB 를 연결하여 다중 Master 로 사용가능 하도록 세팅해야할 내용이 제법 있다. Kubernetes 자체 설치도 kubeadm 이나 kubespray 같은 툴을 사용해서 설치한다. - 역시 쉽지 않은 내용임에 분명하다.
Cluster API 란 ?
지금 소개하는 방법은 Kubernetes Cluster Lifecycle SIG 에서 개발하고 있는 Cluster API 로 Operator Pattern 을 활용하여 Kubernetes 를 설치하는 방법이다. Cluster API 란 Management Kubernetes Cluster 에 Custom Controller 를 설치하고 Custom Resource 를 생성하면 자동으로 Cloud 에 VM 을 생성하고 Kubernetes 를 설치하는 방법이다. Controller 로 관리하기 때문에 VM 이 죽으면 다시 살려주는 장점이 있다. Kubernetes 가 설치된 VM 이 다운되었을 때 Self healing 으로 Recovering 해준다니 정말 멋진 아이디어인 것 같다.
Cluster API 의 시작은 2년 정도 전부터 시작되었는데 초장기에는 PoC 정도였다면 지금은 어느 정도 안정화 되어 사용하기에 문제가 없다.
개념을 보면 Management Kubernetes Cluster 를 설치(Kind, Minikube 등도 가능)하고 여기에 필요한 여러 Custom Controller 를 실행시킨다. 그리고 나서 Custom Resource 를 생성하면 지정된 Cloud 에 VM 을 생성하고 Workload Kubernetes Cluster (고객이 사용할 클러스터) 를 자동으로 생성해 주는 방법이다.
Cluster API 구성도
그림에서 보면 좌측 맨 위에 Cluster API Controller 가 있다. Cluster API Controller 는 마치 java class 로 치면 Abstraction Class 의 역활과 동일하다. Cluster Pod Network, Control Plane VM 갯수, Node VM 갯수 등을 관리한다.
이렇게 정의를 하면 Boostrap provider Controller 에서 kubeadm 으로 어떻게 Kubernetes 를 설치할 지를 관리한다.
Infrastructure provider Controller 에서는 AWS, Azure, GCP 와 같이 Public Cloud 의 자원 생성을 관리한다.
마지막으로 Control Plane provider Controller 특별하게 Control Plane 의 설치를 관리한다.
우측 위는 Custom Resource 를 보여주고 있다.
Cluster API Provider Controller 와 Infrastructure Provider Controller 의 상관 관계를 보면 다음과 같다.
Cluster API 는 Infrastructure Provider 에게 이런 식으로 구현을 해야 한다고 알려주는 가이드라고 보면 된다.
이제 세부적으로 하나씩 살펴보자.
Cluster API Controller
Cluster API Controller 는 cluster 의 기본 정보를 관리하는 Controller 이다. 이 Controller 가 관리하는 Custom Resource 는 다음과 같이 4개가 있다.
- clusters
- machinedeployments
- machinehealthchecks
- machines
이 중에서 machinehealthchecks 는 AWS Provider 에서는 사용하고 있지 않으므로 이를 제외하고 나머지 3가지만 살펴보겠다.
clusters CR(Custom Resource) 는 다음과 같은 정보를 가지고 있다.
- Cluster Pod Network 정보
- Kubernetes API url 정보
- Control Plane 을 생성하는 CR 정보
- Cloud Infrastructure 로 사용되는 CR 정보
Cluster Network:
Pods:
Cidr Blocks:
192.168.0.0/16
Control Plane Endpoint:
Host: capi-quickstart-apiserver-479433786.ap-northeast-2.elb.amazonaws.com
Port: 6443
Control Plane Ref:
API Version: controlplane.cluster.x-k8s.io/v1alpha3
Kind: KubeadmControlPlane
Name: capi-quickstart-control-plane
Namespace: capi-quickstart
Infrastructure Ref:
API Version: infrastructure.cluster.x-k8s.io/v1alpha3
Kind: AWSCluster
Name: capi-quickstart
Namespace: capi-quickstart
machinedeployments CR 의 정보는 Kubernetes Worker Node 에 대한 일반적인 내용이며 아래의 내용을 포함한다.
- Bootstrap 으로 사용될 Kubeadm Config Template
- Infrastructure Provider 에 대한 VM 정보 Template
- Cluster name 및 Kubernetes Version 정보
Cluster Name: capi-quickstart
Min Ready Seconds: 0
Progress Deadline Seconds: 600
Replicas: 3
Revision History Limit: 1
Selector:
Match Labels:
cluster.x-k8s.io/cluster-name: capi-quickstart
cluster.x-k8s.io/deployment-name: capi-quickstart-md-0
Strategy:
Rolling Update:
Max Surge: 1
Max Unavailable: 0
Type: RollingUpdate
Template:
Metadata:
Labels:
cluster.x-k8s.io/cluster-name: capi-quickstart
cluster.x-k8s.io/deployment-name: capi-quickstart-md-0
Spec:
Bootstrap:
Config Ref:
API Version: bootstrap.cluster.x-k8s.io/v1alpha3
Kind: KubeadmConfigTemplate
Name: capi-quickstart-md-0
Cluster Name: capi-quickstart
Infrastructure Ref:
API Version: infrastructure.cluster.x-k8s.io/v1alpha3
Kind: AWSMachineTemplate
Name: capi-quickstart-md-0
Version: v1.20.5
machines CR 은 Kubernetes Control Plane VM 별 정보와 Kubernetes Worker Node VM 별 정보를 갖고 있는데 둘다 아래의 정보를 동일하게 갖고 있다.
- Boostrap 으로 KubeadmConfig CR 정보
- Infrastructure 로서 AWSMachine CR 정보
Bootstrap:
Config Ref:
API Version: bootstrap.cluster.x-k8s.io/v1alpha3
Kind: KubeadmConfig
Name: capi-quickstart-md-0-7f4xk
Namespace: capi-quickstart
UID: 7b095ef9-3380-45cc-950e-9bce8602f954
Data Secret Name: capi-quickstart-md-0-7f4xk
Cluster Name: capi-quickstart
Infrastructure Ref:
API Version: infrastructure.cluster.x-k8s.io/v1alpha3
Kind: AWSMachine
Name: capi-quickstart-md-0-dcdcx
Namespace: capi-quickstart
UID: 3383bd5b-1040-4577-a690-741c556d1076
Provider ID: aws:///ap-northeast-2a/i-090230ea1d12065ce
Version: v1.20.5
Bootstrap Provider Controller
Bootstrap provider controller 는 Kubernetes 를 설치하는 kubeadm 관련 정보를 가지고 있다.
- kubeadmconfigs
- kubeadmconfigtemplates
kubeadmconfigs 는 kubeadm 으로 kubernetes 를 설치할 때 사용하는 정보로서 Control Plane VM 별 정보와 Work Node VM별 정보를 갖고 있다.
- Cluster Configuration 으로 provider 정보를 갖고 있다.
- Join Configuration 으로 Token 정보를 갖고 있다.
Cluster Configuration:
API Server:
Extra Args:
Cloud - Provider: aws
Controller Manager:
Extra Args:
Cloud - Provider: aws
Dns:
Etcd:
Networking:
Scheduler:
Join Configuration:
Control Plane:
Local API Endpoint:
Advertise Address:
Bind Port: 0
Discovery:
Bootstrap Token:
API Server Endpoint: capi-quickstart-apiserver-479433786.ap-northeast-2.elb.amazonaws.com:6443
Ca Cert Hashes:
sha256:de8ef58efd55489531f681066eb77cec21a7d7f8e2a04eb41a06ad38b18d066e
Token: xxxx.xxxxxxxxxxx
Unsafe Skip CA Verification: false
Node Registration:
Kubelet Extra Args:
Cloud - Provider: aws
Name: {{ ds.meta_data.local_hostname }}
kubeadmconfigtemplates 는 Worker Node 가 join 한 template 정보로 Node 명을 가진다.
Template:
Spec:
Join Configuration:
Node Registration:
Kubelet Extra Args:
Cloud - Provider: aws
Name: {{ ds.meta_data.local_hostname }}
Infrastructure Provider Controller
Infrastructure Provider Controller 는 각각의 Cloud 의 API 를 활용하여 리소스를 관리하는 Controller 로 aws 의 경우에는 아래의 정보를 가진다.
- awsclustercontrolleridentities
- awsclusterroleidentities
- awsclusters
- awsclusterstaticidentities
- awsfargateprofiles
- awsmachinepools
- awsmachines
- awsmachinetemplates
- awsmanagedclusters
- awsmanagedmachinepools
이 중에서 awsclusters, awsmachines, awsmachinetemplate 3가지만 살펴본다.
awsclusters 는 aws 에 설치된 Kubernetes workload cluster 에 대한 정보를 갖고 있다.
Bastion:
Allowed CIDR Blocks:
0.0.0.0/0
Enabled: false
Control Plane Endpoint:
Host: capi-quickstart-apiserver-479433786.ap-northeast-2.elb.amazonaws.com
Port: 6443
Identity Ref:
Kind: AWSClusterControllerIdentity
Name: default
Network Spec:
Cni:
Cni Ingress Rules:
Description: bgp (calico)
From Port: 179
Protocol: tcp
To Port: 179
Description: IP-in-IP (calico)
From Port: -1
Protocol: 4
To Port: 65535
Subnets:
Availability Zone: ap-northeast-2a
Cidr Block: 10.0.0.0/20
Id: subnet-04e972e6bfcb98336
Is Public: true
Nat Gateway Id: nat-0d456fe6c4dd2ce3d
Route Table Id: rtb-0dfccca96ffc00732
Tags:
Name: capi-quickstart-subnet-public-ap-northeast-2a
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: public
Availability Zone: ap-northeast-2a
Cidr Block: 10.0.64.0/18
Id: subnet-06f2be3eedb46d622
Is Public: false
Route Table Id: rtb-00090ad5d1de60b20
Tags:
Name: capi-quickstart-subnet-private-ap-northeast-2a
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/internal-elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: private
Availability Zone: ap-northeast-2b
Cidr Block: 10.0.16.0/20
Id: subnet-02a9eed4c602fd3a2
Is Public: true
Nat Gateway Id: nat-050244cb7c9cff368
Route Table Id: rtb-020e9366a2da25625
Tags:
Name: capi-quickstart-subnet-public-ap-northeast-2b
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: public
Availability Zone: ap-northeast-2b
Cidr Block: 10.0.128.0/18
Id: subnet-03880f2f847b3c21e
Is Public: false
Route Table Id: rtb-06b52ab77da5c5f2c
Tags:
Name: capi-quickstart-subnet-private-ap-northeast-2b
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/internal-elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: private
Availability Zone: ap-northeast-2c
Cidr Block: 10.0.32.0/20
Id: subnet-09ccabe6dd862df6a
Is Public: true
Nat Gateway Id: nat-030068539013d5c64
Route Table Id: rtb-0973a222fc772ff76
Tags:
Name: capi-quickstart-subnet-public-ap-northeast-2c
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: public
Availability Zone: ap-northeast-2c
Cidr Block: 10.0.192.0/18
Id: subnet-0be3353fd3b6f1637
Is Public: false
Route Table Id: rtb-0854effe818750d33
Tags:
Name: capi-quickstart-subnet-private-ap-northeast-2c
kubernetes.io/cluster/capi-quickstart: shared
kubernetes.io/role/internal-elb: 1
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: private
Vpc:
Availability Zone Selection: Ordered
Availability Zone Usage Limit: 3
Cidr Block: 10.0.0.0/16
Id: vpc-070a545cb4b967dd7
Internet Gateway Id: igw-03a4ee0ca0f8d0f72
Tags:
Name: capi-quickstart-vpc
sigs.k8s.io/cluster-api-provider-aws/cluster/capi-quickstart: owned
sigs.k8s.io/cluster-api-provider-aws/role: common
Region: ap-northeast-2
Ssh Key Name: capi-seungkyu
awsmachinetemplates 은 aws vm spec 에 대한 정보를 template 으로 갖고 있다. template 은 control plane 과 worker node 각 1개씩 가진다.
control plane template
Template:
Spec:
Iam Instance Profile: control-plane.cluster-api-provider-aws.sigs.k8s.io
Instance Type: t3.large
Ssh Key Name: capi-seungkyu
worker node template
Template:
Spec:
Iam Instance Profile: nodes.cluster-api-provider-aws.sigs.k8s.io
Instance Type: t3.large
Ssh Key Name: capi-seungkyu
awsmachines 은 awsmachinetemplates 으로 연결된 control plane 과 worker node 별 aws VM 에 대한 정보를 갖는다.
contol plane vm1
Ami:
Cloud Init:
Secure Secrets Backend: secrets-manager
Iam Instance Profile: control-plane.cluster-api-provider-aws.sigs.k8s.io
Instance ID: i-0433d589b68e42cd0
Instance Type: t3.large
Provider ID: aws:///ap-northeast-2c/i-0433d589b68e42cd0
Ssh Key Name: capi-seungkyu
Control plane Provider Controller
Control plane provider controller 는 Kubernetes control plane 에 대한 정보를 관리하는 Controller 이다.
- kubeadmcontrolplanes
kubeadmcontrolplanes 은 말그래도 control plane 의 정보를 담고 있으며 앞에서 살펴본 정보들을 활용한다.
- Infrastructure Template 으로 AWSMachineTemplate 을 사용
- Kubeadm Config 로 Init Configuration 과 Join Configuration 정보
- Replicas 개수 정보
- Kubernetes version 정보
Infrastructure Template:
API Version: infrastructure.cluster.x-k8s.io/v1alpha3
Kind: AWSMachineTemplate
Name: capi-quickstart-control-plane
Namespace: capi-quickstart
Kubeadm Config Spec:
Cluster Configuration:
API Server:
Extra Args:
Cloud - Provider: aws
Controller Manager:
Extra Args:
Cloud - Provider: aws
Dns:
Etcd:
Networking:
Scheduler:
Init Configuration:
Local API Endpoint:
Advertise Address:
Bind Port: 0
Node Registration:
Kubelet Extra Args:
Cloud - Provider: aws
Name: {{ ds.meta_data.local_hostname }}
Join Configuration:
Discovery:
Node Registration:
Kubelet Extra Args:
Cloud - Provider: aws
Name: {{ ds.meta_data.local_hostname }}
Replicas: 3
Rollout Strategy:
Rolling Update:
Max Surge: 1
Type: RollingUpdate
Version: v1.20.5