데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      Cluster API 로 AWS에 Kubernetes 설치하기 (1)

      seungkyua 21.06.24
      5,567 6 0

      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
      

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      seungkyua 님의 최신 블로그

      더보기