YOGAE

TODO: FIXME:

Kubernetes in EKS

12 Apr 2019

Kubernetes 제어 플레인을 설치하고 운영할 필요없이 AWS에서 Kubernetes를 손쉽게 실행하도록 하는 관리형 서비스입니다.

  • 자동화된 버전 업그레이드를 제공
  • Amazon EKS는 또한 여러 AWS 서비스와 통합
    • 컨테이너 이미지용 Amazon ECR
    • 로드 배포용 Elastic Load Balancing
    • 인증용 IAM
    • 격리용 Amazon VPC

설치

  • manually
    1. EKS cluster 생성
    2. kubectl 설치
    3. EKS용 kubectl 구성
      • aws eks –region update-kubeconfig --name
    4. EKS 작업자 노드 시작
      • CloudFormation을 사용하여 autoscaling관련 설정
      • 작업자 노드가 클러스터에 조인하도록 yml file을 k8s에 설정
  • terraform module 사용

    module "my-cluster" {
      source       = "terraform-aws-modules/eks/aws"
      cluster_name = "my-cluster"
      subnets      = ["subnet-abcde012", "subnet-bcde012a", "subnet-fghi345a"]
      vpc_id       = "vpc-1234556abcdef"
      
      worker_groups = [
        {
          instance_type = "m4.large"
          asg_max_size  = 5
        }
      ]
      
      tags = {
        environment = "test"
      }
    }
    # If manage_aws_auth = true, it's required that both kubectl (>=1.10) and aws-iam-authenticator are installed and on your shell's PATH.
      
    

    참고: https://github.com/nalbam/terraform-aws-eks-nalbam

로드 밸런싱

Amazon EKS는 LoadBalancer 유형의 Kubernetes 서비스를 통해 Network Load Balancer 및 Classic Load Balancer를 지원합니다. 로드 밸런서의 구성은 서비스의 매니페스트에 추가된 주석에 의해 제어됩니다.

kubectl expose rc kubia --type=LoadBalancer --name kubia-http 명령 사용 시 기본적으로 Classic Load Balancer가 생성됩니다.

기본적으로 Classic Load Balancer는 LoadBalancer 유형 서비스에 사용됩니다. 대신 Network Load Balancer를 사용하려면 서비스에 다음 주석을 적용하십시오.

service.beta.kubernetes.io/aws-load-balancer-type: nlb

네트워킹

포드 네트워킹

Amazon EKS는 Kubernetes용 Amazon VPC CNI 플러그인을 통한 기본 VPC 네트워킹을 지원합니다. 이 CNI 플러그인을 사용하면 Kubernetes 포드에서 VPC 네트워크에서와 마찬가지로 포드 내 동일한 IP 주소를 보유합니다.

외부 SNAT

기본적으로 Kubernetes용 Amazon VPC CNI 플러그인은 SNAT(Source Network Address Translation)가 활성화된 포드를 구성합니다. 이는 패킷의 반환 주소를 인스턴스의 기본 퍼블릭 IP로 설정하고 인터넷과의 통신을 허용합니다.

image

NAT가 외부 디바이스(예: 인스턴스 자체가 아닌 NAT 게이트웨이)에서 처리되도록 지정하기 위해 AWS_VPC_K8S_CNI_EXTERNALSNAT 환경 변수를 true로 설정하여 인스턴스에서 SNAT를 비활성화할 수 있습니다.

퍼블릭 서브넷에 있는 노드의 경우 SNAT가 필요합니다. 외부 SNAT를 사용하려면 노드가 프라이빗 서브넷에 있어야 하며, NAT 게이트웨이 또는 다른 외부 NAT 디바이스를 통해 인터넷에 연결되어야 합니다.

image

작업자 노드에서 SNAT를 비활성화

kubectl edit daemonset -n kube-system aws-node
...
    spec:
      containers:
      - env:
        - name: AWS_VPC_K8S_CNI_EXTERNALSNAT
          value: "true"
        - name: AWS_VPC_K8S_CNI_LOGLEVEL
          value: DEBUG
        - name: MY_NODE_NAME
...