Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitOps Infrastructure with Cluster-API

GitOps Infrastructure with Cluster-API

Devocean Tech Day
Everything on Kubernetes, Kubernetes Anywhere 기술세션

세션제목:
(Kubernetes Anywhere) Application을 넘어 Infrastructure도 GitOps로!

세션내용:
SKT 컨테이너 솔루션은 쿠버네티스 클러스터를 누구나 쉽게 생성/관리 할 수 있도록 직관적인 사용자 인터페이스를 제공합니다.

Cluster-API 를 활용하여 다양한 클라우드 환경에서 Kubernetes 클러스터 라이프 사이클을 선언적으로 관리할 수 있으며, Application 과 동일하게 Infrastructure 관리를 GitOps 로 제공합니다.

본 세션에서는 Cloud Infrastructure와 Kubernetes를 어떻게 GitOps기반의 선언적인 방식으로 관리 가능한지 알아봅니다.

SKT Container Solution

April 29, 2022
Tweet

More Decks by SKT Container Solution

Other Decks in Technology

Transcript

  1. 01 Kubernetes 기반 플랫폼 구축을 위해 사용했던 방법과 부딪혔던 문제

    02 Cluster API을 활용하여 얻은 개선 효과 03 Cluster API 기반 GitOps를 위한 기반 구현물
  2. 기술 목표, 방향성 • 온-프레미스, 프라이빗/퍼블릭 클라우드와 같은 다양한 인프라

    환경에서 하이브리드 컨테이너 서비스를 가능하게 하는 기술을 개발하고 사내 협업 부서, 사외 파트너사와 함께 결과물을 전달하고 구축, 운영하는 일을 해오고 있습니다. • 개발 과정에서 뿐만 아니라 구축, 운영 과정에서 협업 및 교육이 수월하게 이루어 지기 위해 기술 세트를 통일하고 일관된 방식을 사용하는 것을 매우 중요하게 생각합니다.
  3. 운영 환경을 위한 Kubernetes를 설치하는 방법 What? • 설치할 노드

    준비: • VM / 베어메탈 • 네트워킹 • 스토리지 • OS 설치 How? • 사람 • IaC 도구 (Terraform…) What? • 준비된 노드에 Kubernetes 설치 How? • Kubeadm • Kubespary Infrastructure Provisioning 1 Kubernetes Cluster Bootstrapping 2 Addons 3
  4. 운영 환경을 위한 Kubernetes를 설치하는 방법 • 환경/벤더 종속 •

    Terraform과 같은 Iac 툴을 사용하더라도 온-프레미스 환경 지원은 불가능 Managed Kubernetes Service • EKS • AKS • GKE • … Infrastructure Provisioning 1 Kubernetes Cluster Bootstrapping 2 Addons 3
  5. 운영 환경을 위한 Kubernetes를 설치하는 방법 What? • CNS •

    CSI • Ingress/LB • 로깅 • 모니터링 • 앱 배포를 위한 서비스 • ... How? • Kubespary • Helm Chart • Kustomize • ... Infrastructure Provisioning 1 Kubernetes Cluster Bootstrapping 2 Addons 3 Decapod
  6. 이전까지는 아래의 방법을 사용했습니다 Tacoplay: https://github.com/openinfradev/tacoplay Kubernetes 기반의 다양한 서비스를

    쉽게 설치하고 설정할 수 있게 해 주는 ansible playbook의 모음 오픈 소스 프로젝트들과 자체 개발한 playbook 으로 구성 • Docker registry • Ceph (via ceph-ansible -> rook) • Kubernetes (via Kubespray) • CSI/CNI • Helm • Decapod (argo & etc) • OpenStack • Logging, Monitoring, Alarm 특징 • 필요한 소프트웨어들을 한 번에 설치, 제거, 확장할 수 있는 통합 playbook 제공 • 각 소프트웨어의 정상 동작에 필요한 OS 설정 자동화 • 각 소프트웨어들 간의 통합 연동 설정 • 인터넷 접근이 불가능한 환경에서의 구축을 위한 설정 간소화
  7. Challenges Tacoplay 효과 • inventory와 변수 파일을 통해 각 사이트

    별 설정 관리 • Git을 이용하여 변경 사항에 대한 비교 및 이력 관리 그러나… • 플레이북 실행 시점에만 적용되기 때문에 운영 편의 등의 이유로 수동으로 환경 수정한 부분과 이후 재 반영 시 충돌이 발생 • 현재 Git 저장소 내용과 실제 환경에 적용된 내역과의 비교 및 조치의 어려움 • Kubespray / ceph-ansible 간 ansible 버전 충돌 • 사용 기술 혼재, 교육/전달 시 어려움 “일단 급하니까 수동으로 해놓자“ “지금 우리가 가지고 있는 코드 적용을 언제 했지?" (결국 다음 번 설정 적용 시 충돌이 발생, 잘 되던 게 안되기 시작하니) "그냥 전부 수동으로 설정하는 게 낫지 않아요?“
  8. Kubernetes Principles https://developers.redhat.com/articles/2021/06/22/kubernetes-operators-101-part-2-how-operators-work#kubernetes__workload_deployments Kubernetes Controllers • Control(reconciliation) loop for “desired

    state == current state” Operator 패턴 • Custom Resources + Custom Controllers • POD 와 같이 k8s 내장 자원 외에 다른 “모든" 것들 도 K8S 자원으로 관리 가능 • 예) storage(rook), infra(crossplane), db (viteness), ... Cluster API도 그러합니다 컨트롤 루프를 통해 정의된 클러스터 상태를 (사람의 개입을 최소화하고) 지속적으로 유지
  9. Cluster API Cluster API is a Kubernetes sub-project focused on

    providing declarative APIs and tooling to simplify provisioning, upgrading, and operating multiple Kubernetes clusters. Management cluster Workload clusters Controller managers Bootstrap Providers - kubeadm Infrastructure Providers - AWS - Azure - Vsphere - GCP - OpenStack - Metal3 (Baremetal)
  10. Multi Infra Provider apiVersion: cluster.x- k8s.io/v1beta1 kind: Cluster metadata: name:

    aws-cluster spec: infrastructureRef: apiVersion: infrastructure.cluster. x-k8s.io/v1beta1 apiVersion: infrastructure.cluster.x- k8s.io/v1beta1 kind: AWSCluster metadata: name: infra-cluster spec: … apiVersion: infrastructure.cluster.x- k8s.io/v1beta1 kind: GCPCluster metadata: name: infra-cluster spec:… apiVersion: infrastructure.cluster.x- k8s.io/v1beta1 kind: AzureCluster metadata: name: infra-cluster spec: … kind: AWSCluster name: infra-cluster controlPlaneRef: … kind: GCPCluster kind: AzureCluster
  11. Cluster API 도입 효과 효과 • 베어메탈, 프라이빗/퍼블릭 클라우드 등

    모든 환경에서 일관된 클러스터 배포 방법을 제공 • Kubernetes 클러스터의 라이프사이클 관리를 자동화 • 컨트롤 루프를 통해 정의된 상태를 지속적으로 유지 제약/한계 • 모든 환경에 대해 인프라 프로바이더가 존재하지도 않고 일부 프로바이더는 상용 수준이 아님 • 상위 수준에서 일관된 API로 추상화하였지만 각 인프라 프로바이더 자원의 내역 및 구현, 동작에 대해서는 이해 및 검증이 필요 Kubernetes Anywhere, Everything on Kubernetes • Kubernetes 클러스터 자체도 하나의 앱처럼 Decapod를 통해 배포하여 구축할 수 있음 • 인프라, Kubernets 클러스터, 애드온, 서비스까지 모두 통일된 방법으로 배포, 구축 Infrastructure Provisioning 1 Kubernetes Cluster Bootstrapping 2 Addons 3 Decapod
  12. 20 K8S deployment /w Cluster API export AWS_REGION=us-east-1 export AWS_SSH_KEY_NAME=default

    export AWS_CONTROL_PLANE_MACHINE_TYPE=t3.large export AWS_NODE_MACHINE_TYPE=t3.large clusterctl generate cluster capi-quickstart \ --kubernetes-version v1.23.3 \ --control-plane-machine-count=3 \ --worker-machine-count=3 \ > capi-quickstart.yaml Kubectl apply –f capi-quickstart.yaml ENV + Set Value cluster Machin ePool contro lplane Machin eDeplo yment observe diff act New k8s cluster
  13. 21 Needs for a helm chart • clusterctl 의 template은

    QuickStart 용 • 잘 사용하기 위해서는 생성된 yaml의 재가공 필수 • 생성해주는 자원이 한정, 변경 가능한 필드도 제한적 • 서비스로 k8s 클러스터를 만들기위해 변경이 필요한 부분은 소수이고 이를 편하게 적용할 무언가 필요 • SKT Container platform의 기반 배포 툴인 decapod를 사용하기 위해서는 Helm chart 필수
  14. 22 Helm chart for K8S deployment /w Cluster API (1/2)

    > helm repo add taco http://openifradev.github.io/helm-repo > helm search repo cluster-api-aws NAME CHART VERSION APP VERSION DESCRIPTION taco/cluster-api-aws 0.5.0 1.0.0 A chart to install Kubernetes cluster using Clu... helm install demo taco/cluster-api-aws -f demo.vo --timeout 20m NAME: demo LAST DEPLOYED: Mon Apr 25 07:17:40 2022 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: This helm chart create a kubernetes cluster on AWS using cluster api. Cluster Name: demo 22 cluster Machin ePool contro lplane Machin eDeplo yment observe diff act Helm Chart Value override file New k8s cluster
  15. 23 Helm chart for K8S deployment /w Cluster API (2/2)

    Override values • vm 접속용 ssh-key 정의(sshKeyName) • cluster 이름 지정 (cluster.name) • aws region 지정 (cluster.region) • k8s 버전 (cluster.kubernetesVersion) • bastion 서버사용 여부 (cluster.bastion.enabled) • master 노드 개수지정 (kubeadmControlPlane.replicas) • worker 노드를 위한 machinepool 설정 (machinePool) Source: https://github.com/openinfradev/helm-charts/tree/main/cluster-api-aws Values: https://github.com/openinfradev/helm-charts/blob/main/cluster-api-aws/values.yaml
  16. 24 CRs for Worker Nodes Machine Pool Machine Deployment Control

    주체 Provider - Autoscaling Group Cluster API - EC2 instance Deployment Through every AZ Single AZ
  17. 25 Mulit AZ support MachinePool Availability Zone Master Worker Machine

    Deployment …….. Worker Worker Availability Zone Master Worker Machine Deployment …….. Worker Worker Availability Zone Master Worker Machine Deployment …….. Worker Worker
  18. 26 Cluster auto scaling Availability Zone Master Machine Deployment Worker

    Worker Availability Zone Master Machine Deployment Worker Worker Availability Zone Master Machine Deployment Worker Worker Cluster autoscaler Management cluster 1. Monitor 2. Update CR 3. Adjust replica Worker
  19. 27 Using generated values using helm hooks • MachiePool이나 MachieDeployment는

    정확한 네트워크 정보가 함께 입력되어야 함 • Helm hook을 사용하여 클러스터 배포로 aws상 네트워크가 만들어지면 이 정보를 기반으로 post job을 통해 워커노드 배포 클러스터 마스터노드 배포 클러스터 생성대기 JOB 워커노드 배포 노드생성체크 후처리 •vpc, subnet 등 네트워크 생성 •마스터노드 및 로드밸 런서 생성 •생성완료시 종료 •Helm post-install hook 발생 •MP, MD •post-install hook 으로부터 trigger •생성된 자원에서 네트워크 정보확인 •지정된 형태의 워커노드 생성
  20. 28 Support spot instance • 저렴한 인스턴스 사용의 요구사항 •

    Batch process 혹은 실시간을 요하지 않는 workload에 적합 • MachineDeployment를 사용하고 최대 지불비용 지정 (MachinePool은 지원하지 안됨) • Bastion 노드에도 적용가능
  21. 29 CAPI가 지원하지 않는 자원의 제어 • K8s 외에 필요한

    기능들 • 사용자 접근이 필요한 dashboard등에 대한 dns 등록 • 노드 네트워크통신을 위한 네트워크 설정 k8s cluster Dashboard? grafana.mycluster.com 10.20.30.4 10.20.30.4 How? Who?
  22. 30 Terraform / Crossplane / aws cli • Terraform cloud

    적용시도 • 가장 많이 사용되는 인프라제어 툴인 Terraform • Terraform cloud는 Terraform의 스크립트를 k8s의 cr형태로 제공하여 인프라제어 • 한계 • “CR -> terraform cloud(on cloud) -> terraform 스크립트 실행 -> 인프라제어” 구조 • 단계별 async 동작 • Crossplane을 통한 Public cloud 자원제어 • Public cloud의 자원들을 k8s의 CR로 만들어 관리할 수 있게 하는 툴 • 클러스터내 설치된 crossplane controller가 직접적인 인프라제어 • Ingress용 lb나 dns, security group 등을 조작하기위해 활용 • aws CLI • Aws에서 제공하는 cli tool로 aws의 서비스는 기본적으로 이를 통해 제어가능 • 앞의 두 방법으로 할 수 없는 영역에서 활용
  23. 31 Next… • 다양한 인프라로의 확장 • 사용자들의 요구를 청취하고

    요구되는 인프라들을 추가하여 확장 • byoh (인프라/OS 프로비저닝은 제외하고 VM/물리 node를 worker node로 연결) • Openstack, vmware, azure… • GitOps for Policy • 통합된 정책관리와 정책의 코드화