새소식

반응형
k8s/CloudNet@

[CloudNet@] Production Kubernetes Online Study - 2주차.

  • -
728x90
반응형

 

 

안녕하세요 늑대양입니다 😍

 

 

늑대양 하늘하늘 버전!!

 

 

 

이번에 CloudNet@에서 진행하는 Production Kubernetes Online Study(PKOS)에 참여하여 관련 내용을 공유드리고자 합니다.

 

 

오늘은 PKOS 스터디 2주차 학습 내용을 안내해드리록하겠습니다.

 

 

 

 

CloudNet@ 팀 블로그 메인 커버

 

 

 

CloudNet@ 팀 블로그 Main URL:

https://www.notion.so/gasidaseo/CloudNet-Blog-c9dfa44a27ff431dafdd2edacc8a1863

 

CloudNet@ Blog

CloudNet@ 팀에서 Cloud Infra & Network 기술에 대한 정보를 공유하는 블로그 입니다.

www.notion.so

 

 

 

Production Kubernetes Online Study - 2주차

2주차 학습 주제: 쿠버네티스 네트워크 (서비스, AWS LoadBalancer Controller)

Index.

  • AWS kOps 원클릭 배포 가이드
    • Parameter
  • AWS VCP CNI 소개
    • k8s CNI
    • AWS VPC CNI
  • 노드에서 기본 네트워크 정보 확인
  • 노드 간 파드 통신
  • 파드에서 외부 통신
  • 노드에 파드 생성 개수 제한
    • 해결방안
  • 서비스 소개
    • 서비스란
    • ClusterIP
    • NodePort
    • LoadBalancer
    • NLB 모드 정리
  • ExternalDNS
  • 과제
    • 과제 1. 파드간 통신 시 tcpdump 내용을 확인하고 관련 스크린샷을 올려주세요
    • 과제 2. 워커 노드 1대에 100대 이상의 파드가 배포되게 설정하고 관련 스크린샷을 올려주세요
    • 과제 3. 서비스(NLB)/파드 배포 시, ExternalDNS 설정해서, 각자 자신의 도메인으로 NLB를 통해 애플리케이션(파드)로 접속해보고 관련 스크린샷을 올려주세요
    • 과제 4. 활용 - 아래 활용 기능 중 1개를 선택해서 실습 후 결과 내용을 올려주세요
      • NLB에 TLS 적용하기
      • NLB에 타겟을 Instance mode로 설정해보기
      • kOps dns-controller compatibility mode
      • NLB IP Target & Proxy Protocol v2 활성화(NLB에서 바로 파드로 인입 및 ClientIP 확인 설정)
      • AWS kOps Private Cluster 설정하기
  • 자원 삭제

 

 

 

AWS kOps 원클릭 배포 가이드

AWS kOps 원클릭 배포 가이드

 

 

 

Parameter:

아래 빨간색 부분은 설정해주는어야 할 것, 그외 부분은 기본값 사용을 권장

 

 

<<<<< Deploy EC2 : kops-ec2 >>>>>

  1. KeyName : kops-ec2에 SSH 접속을 위한 SSH 키페어 선택 ← 미리 SSH 키 생성 해두자!
  2. MyIamUserAccessKeyID : 관리자 수준의 권한을 가진 IAM User의 액세스 키ID 입력
  3. MyIamUserSecretAccessKey : 관리자 수준의 권한을 가진 IAM User의 시크릿 키ID 입력 노출되지 않게 보안 주의
  4. SgIngressSshCidr : kops-ec2에 SSH 접속 가능한 IP 입력 (집 공인IP/32 입력), 보안그룹 인바운드 규칙에 반영됨
    • 터미널에서 공인 ip 확인 방법:
    • curl ipinfo.io/ip
  5. LatestAmiId : kops-ec2에 사용할 AMI는 아마존리눅스2 최신 버전 사용, 기본값 그대로 사용

 

 

<<<<< AWS kOps Config >>>>>

  1. KubernetesVersion : 쿠버네티스 설치 버전 (기본 v1.24.9) ⇒ 변경 가능
  2. ClusterBaseName : kOps 클러스터 이름이며, 사용하게될 도메인 이름이다. ‘퍼블릭 도메인’ or ‘프라이빗 도메인’ or ‘Gossip DNS’ 가능
  3. S3StateStore : kOps 클러스터의 설정/상태 정보가 저장될 S3 버킷의 이름을 지정 미리 S3 버킷을 생성 해두자!
  4. MasterNodeInstanceType & WorkerNodeInstanceType: 마스터(기본 t3.medium) & 워커 노드 EC2 인스턴스의 타입 (기본 t3.medium) ⇒ 변경 가능
  5. WorkerNodeCount : 워커노드의 개수를 입력 ⇒ 변경 가능
  6. VpcBlock : kOps 배포되고 동작할 VPC 네트워크 대역, 기본값 그대로 사용

 

 

<<<<< Region AZ >>>>>

  • 리전과 가용영역을 지정, 기본값 그대로 사용

 

 

 

 

AWS VCP CNI 소개

Source: CloudNet@

 

k8s CNI:

  • CNI(Container Network Interface)는 k8s 네트워크 환경을 구성!!
  • 다양한 플러그인 존재
    • Kubernetes CNI (kubenet): Kubernetes에서 기본으로 제공하는 CNI 플러그인
    • Calico: IP-in-IP 트래픽을 사용하여 네트워크를 구성하며, 보안 그룹과 네트워크 정책을 적용 가능
    • Flannel: VXLAN 기술을 사용하여 네트워크를 구성하며, 일반적으로 쿠버네티스 클러스터를 구성할 때 사용
    • Cilium: BPF(Berkeley Packet Filter) 기술을 사용하여 네트워크를 구성하며, 보안 그룹과 네트워크 정책을 적용 가능
    • Weave Net: IP-over-UDP 기술을 사용하여 네트워크를 구성하며, 네트워크 통신에 대한 압축, 암호화 및 안정성 기능을 제공
    • Canal: Calico와 Flannel을 혼합한 플러그인
    • Contiv: 컨테이너 네트워크 관리를 위한 플러그인
  • 위와 같은 CNI 플러그인들은 쿠버네티스 네트워크를 구성하는데 사용되며, 선택은 구축 환경에 맞는 것을 선택하는 것이 좋습니다🤭

 

AWS VPC CNI:

  • Supports native VPC networking with the Amazon VPC Container Network Interface (CNI) plugin for Kubernetes.
  • VPC 와 통합 : VPC Flow logs , VPC 라우팅 정책을 사용 가능함 → 아쉽지만 kOps 는 Security group for Pod 미지원
  • This plugin assigns an IP address from your VPC to each pod
    • 파드의 IP를 할당하며, 파드의 IP 대역과 노드(워커)의 IP 대역이 동일!!
    • 이러한 특성으로 인하여 직접 통신이 가능!!
  • VPC ENI 에 미리 할당된 IP를 파드에서 사용할 수 있음

 

 

 

노드에서 기본 네트워크 정보 확인

Source: CloudNet@

 

 

  • Network 네임스페이스는 호스트(Root)와 파드 별(Per Pod)로 구분
  • 특정한 파드(kube-proxy, aws-node)는 호스트(Root)의 IP를 그대로 사용
  • t3.medium 의 경우 ENI 에 최대 6개의 IP를 가질 수 있음
  • ENI0, ENI1 으로 2개의 ENI는 자신의 IP 이외에 추가적으로 5개의 보조 프라이빗 IP를 가질수 있음
  • coredns 파드는 veth 으로 호스트에는 eniY@ifN 인터페이스와 파드에 eth0 과 연결되어 있다!!

 

 

 

노드 간 파드 통신

Source: CloudNet@

 

 

 

Life of a Pod to Pod Ping Packet

 

 

Image source:

https://github.com/aws/amazon-vpc-cni-k8s/blob/master/docs/cni-proposal.md

 

GitHub - aws/amazon-vpc-cni-k8s: Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces

Networking plugin repository for pod networking in Kubernetes using Elastic Network Interfaces on AWS - GitHub - aws/amazon-vpc-cni-k8s: Networking plugin repository for pod networking in Kubernete...

github.com

 

 

 

 

파드에서 외부 통신

Life of a Pod to External Packet

 

 

 

SNAT for pods - Amazon EKS

SNAT for pods If you deployed your cluster using the IPv6 family, then the information in this topic isn't applicable to your cluster, because IPv6 addresses are not network translated. For more information about using IPv6 with your cluster, see Tutorial:

docs.aws.amazon.com

 

 

 

 

노드에 파드 생성 개수 제한

Source: CloudNet@

 

 

  • Secondary IPv4 addresses : 인스턴스 유형에 최대 ENI 개수와 할당 가능 IP 수를 조합하여 선정
  • 워커 노드의 인스턴스 타입 별 파드 생성 개수 제한
    • 인스턴스 타입 별, ENI 최대 개수할당 가능한 최대 IP 개수에 따라서 파드 배치 개수가 결정됨
    • 단, aws-node 와 kube-proxy 파드는 호스트의 IP를 사용함으로 최대 개수에서 제외함

 

 

최대 파드 생성 개수 공식:
(Number of network interfaces for the instance type × (the number of IP addressess per network interface - 1)) + 2

*t3.medium의 예시:
(3 * (6-1)) + 2 = 17 (aws-node, kube-proxy 로 인해, 2개 추가하여 17 > 커스텀하게 할당 가능한 것은 15)

 

 

 

해결방안:

Source: CloudNet@

 

  • Prefix Delegation
  • WARM & MIN IP/Prefix Targets
  • Change instance type

 

 

 

서비스 소개

서비스란

  • k8s 에서 서비스란, 클러스터 내에서 실행되는 파드들에 대해서 공용 IP 주소를 할당하는 개념
  • 파드들을 통해 실행되고 있는 애플리케이션을 네트워크에 노출시키는 가상의 컴포넌트
  • 서비스를 통해 파드들을 식별하고 접근할 수 있게 해줌!!

 

ClusterIP

클러스터 내부에서만 접근 가능한 IP 주소 할당, 외부에서 접근 불가능!! Source: CloudNet@

 

 

 

NodePort

클러스터 내부에서도 접근 가능하지만 클러스터 외부에서도 특정 포트를 통해 접근 가능!! Source: CloudNet@

 

 

 

LoadBalancer

클러스터 외부에서도 접근 가능하며, 로드밸런싱을 제공!! Source: CloudNet@

 

 

 

AWS LB Controller + NLB IP 모드 동작!! Source: CloudNet@

 

 

 

NLB 모드 정리:

  1. 인스턴스 유형
    1. externalTrafficPolicy : ClusterIP ⇒ 2번 분산 및 SNAT으로 Client IP 확인 불가능 ← LoadBalancer 타입 (기본 모드) 동작
    2. externalTrafficPolicy : Local ⇒ 1번 분산 및 ClientIP 유지, 워커 노드의 iptables 사용함
  2. IP 유형 ⇒ 반드시 AWS LoadBalancer 컨트롤러 파드 및 정책 설정이 필요함!
    1. Proxy Protocol v2 비활성화 ⇒ NLB에서 바로 파드로 인입, 단 ClientIP가 NLB로 SNAT 되어 Client IP 확인 불가능
    2. Proxy Protocol v2 활성화 ⇒ NLB에서 바로 파드로 인입 및 ClientIP 확인 가능
      (→ 단 PPv2 를 애플리케이션이 인지할 수 있게 설정 필요)

 

 

 

 

ExternalDNS

ExternalDNS

 

 

  • k8s 서비스/인그레스 생성 시, 도메인을 설정하면 AWS(Route 53), Azure(DNS), GCP(Cloud DNS) 에 A 레코드(TXT 레코드)로 자동 생성/삭제

 

 

Image source:

https://edgehog.blog/a-self-hosted-external-dns-resolver-for-kubernetes-111a27d6fc2c

 

A Self-hosted external DNS resolver for Kubernetes.

Understanding solutions for external DNS resolution in Kubernetes and introducing our k8s_gateway plugin.

edgehog.blog

 

 

 

 

과제

과제 1. 파드간 통신 시 tcpdump 내용을 확인하고 관련 스크린샷을 올려주세요

통신 테스트용 파드 배포

 

 

 

tcpdump 테스트 진행

 

 

 

과제 2. 워커 노드 1대에 100대 이상의 파드가 배포되게 설정하고 관련 스크린샷을 올려주세요

배포 후, replicas=110 옵션은 통해, 100대 이상의 파드 배포 진행

 

 

 

정상적으로 배포된 모습

 

 

 

과제 3. 서비스(NLB)/파드 배포 시, ExternalDNS 설정해서, 각자 자신의 도메인으로 NLB를 통해 애플리케이션(파드)로 접속해보고 관련 스크린샷을 올려주세요

도메인 네임(wolf-sheep.name)을 통해 접속 확인!!

 

 

 

과제 4. 활용 - 아래 활용 기능 중 1개를 선택해서 실습 후 결과 내용을 올려주세요

  • NLB에 TLS 적용하기
    • 사전 준비 사항
      • 공인도메인 소유
      • AWS Route53 도메인등록 상태
      • NLB 가 위치한 리전(서울)의 인증서 요청/발급 완료상태
      • ExternalDNS 준비완료상태

 

 

AWS Certificate Manager 서비스에서 인증서 생성

 

 

 

Route 53 서비스에서 인증서 인증을 위한 CNAME 레코드 추가

 

 

 

ACM에서 인증서 상태 확인!!

 

 

 

Deployment, svc 배포 후 NLB 리스너(443) 설정 확인

 

 

 

NLB Status: Active 확인!!

 

 

 

정상적으로 https 접속된 것을 확인!!

 

 

 

ACM을 통해 발급받은 인증서 적용 확인!!

 

 

 

 

자원 삭제

  • 실습 완료 후, 자원 삭제 진행
# kOps 클러스터 삭제 & AWS CloudFormation 스택 삭제
# --stack-name의 경우, 실습 환경 구성 시, 사용한 CloudFormation stack 이름으로 설정

kops delete cluster --yes && aws cloudformation delete-stack --stack-name mykops

 

 

 

 

 

긴 글 읽어주셔서 감사합니다 

 

 

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.