현대 오토에버 SW 스쿨 - 클라우드/쿠버네티스

[쿠버네티스] - 컨테이너 통신 (CNI)

yongyongMom 2024. 11. 4. 12:02
SMALL

1. 컨테이너 네트워크 서비스 (CNI)

1) 볼륨을 통한 데이터 공유

2) SDN (Software-Definded Networking: 소프트웨어 정의 네트워크)

  • 네트워크 리소스를 최적화하고 변화하는 비지니스 요구, 애플리케이션 및 트래픽에 신속하게 네트워크를 채택하는데 도움이 되는 네트워크 가상화 및 컨테이너화에 대한 접근 방식
  • 네트워크 제어와 데이터 평면을 분리하여 소프트웨어 프로그래밍 가능 인프라를 만드는 방식

3) 쿠버네티스에서 SDN 이 필요한 이유

  • 쿠버네티스 네트워킹에는 수백 개의 pod 가 있고 그 중 일부가 같은 서비스에 대응하는 경우 
  • pod 가 이동해서 모든 트래픽이 항상 올바른 위치로 갈 수 있도록 클러스트에 들어오고 나가는 트래픽을 지속적으로 라우팅 할 수 있어야 함
  • kubenetes 에서 제공하는 2가지 도구
  • Service Proxy : 정적 IP 를 갖는 서비스 뒤에 pod 가 로드 밸런싱되고 kubenetes 서비스 객체가 라우팅 되는 것을 보장해줌
  • CNI : pod 가 클러스터의 일정하면서도 쉽게 액세스 할 수 있는 네트워크 내부에서 계속해서 다시 재생될 수 있음을 보장
  • ClusterIP 타입을 갖는 kubenetes 서비스 객체가 생성
  • ClusterIP 서비스는 kubenetes 서비스로 kubenetes 클러스터에서 라우팅이 가능하지만 클러스터 외부에서는 액세스 할 수 없음
  • ClusterIP 서비스는 다른 서비스의 상단에 만들어질 수 있는 기본적인 요소
  • pod 의 IP 주소 활용 :: 클러스터에서 애플리케이션이 직접 라우팅 할 필요없이 서로 액세스할 수 있는 가장 간단한 방법
  • 서비스 생성 시 별도의 IP 주소를 가지고 생성됨 -> 별도의 서브넷을 가지고 생성
    • 서비스 -> pod 등록 -> pod replicas 별도의 이름 할당 -> 이름 : ip 형식의 DNS 소유
    • 일종의 NAT 와 유사한 형태의 방식을 활용
  • NodePort 서비스와 ClusterIP 서비스
    • NodePort 서비스는 내부 파트 네트워크의 모든 포트를 외부에 노출
    • 이를 이용해 로드 밸런서 생성
    • NodePort 설정 -> 동일한 성격의 pod 는 NodePort 가 전부 개방
  • 클러스터 pod 내부에서 실행되는 CoreDNS 컨테이너를 가리키는 NodePort 서비스 생성
    • yml 파일 생성 : my-nodeport.yml
      apiVersion: v1
      
      kind: Service
      
      metadata:
        annotations:
          prometheus.io/port: "9153"
          prometheus.io/scrape: "true"
        labels:
          k8s-app: kube-dns
          kubernetes.io/cluster-service: "true"
          kubernetes.io/name: CoreDNS
        name: kube-dns-2
        namespace: kube-system
      spec:
        ipFamilies:
        - IPv4
        ipFamilyPolicy: SingleStack
        ports:
        - name: dns
          port: 53
          protocol: UDP
          targetPort: 53
        - name: dns-tcp
          port: 53
          protocol: TCP
          targetPort: 53
      
        selector:
          k8s-app: kube-dns
      
        sessionAffinity: None
        type: NodePort
        
        
        ## 서비스 생성
        kubectl apply -f my-nodeport.yml
        
        ## 서비스 확인
        kubectl get svc

2. Spring Boot Application 을 NodePort 를 이용해 모든 Node 에서 포트를 개방해 서비스 이용하기

1) 애플리케이션 생성

  • Intellij 에서 Spring Boot Application 생성 ( Lombok, Web 의존성 추가 )
  • 기본 패키지 안에 요청을 처리하는 클래스 추가 - FrontController
  • 실행 후 브라우저에서 8080 포트로 접속해서 에러 없는지 확인

2) Dockerfile 파일 만들어서 이미지 생성하기

  1. 터미널을 실행 시켜서 애플리케이션 빌드: 실행 가능한 자바 파일을 생성
  2. 프로젝트의 루트 디렉토리에 Dockerfile을 생성하고 작성
  3. 이미지 생성 후 확인
  4. 이미지를 사용한 컨테이너 생성 후 실행

3) Github 를 이용해서 DockerHub 에 배포

  1. git hub 에 레포지터리 생성
  2. git hub 에 push
    1. 한번도 사용하지 않은 경우 이메일과 이름을 등록하라고 메시지 출력
    2. 브랜치 확인 후 브랜치 변경
    3. 원격 저장소 등록
    4. push : windows 나 mac 에서는 브라우저에서 로그인하고 linux 의 경우는 콘솔에서 로그인하라는 메시지가 출력

4) kubenetes Deployment 를 이용해서 pod 생성

  1. pod 를 생성할 yml 파일을 생성
  2. pod 생성

5) kubenetes Service 를 이용해서 NodePort 설정

  1. nodeport 를 이용할 서비스 파일 생성 : service.yml
  2. 서비스 생성 후 확인 
  3. endpoint 확인
  4. 서비스와 동일한 이름의 endporint 가 있음 -> service 에 요청 시 endpoint 에 요청을 한다는 의미

 

3. Amazon EC2 (Elastic Computing Cloud)

1) 개요

  • Amazon Web Service 에서 컴퓨터 용량을 제공하는 서비스
  • EC2 는 Managed Service( 관리 주체가 Public Cloud 사업자 - 백업과 업데이트를 사업자가 수행 ) 가 아님
  • 서버 및 네트워크 운영은 AWS 가 담당 -> 운영체제를 포함한 필요한 소프트웨어는 사용자가 직접 설치 & 운영
  • 장점
    • 클릭 한번으로 쉽게 생성
    • 다양한 하드웨어와 운영체제 조합이 가능
    • 생성과 삭제가 자유로움
    • 스케일 업 다운이 편리함
  • 적합하지 않은 경우
    • 단순히 서버 1대로 구성하고 변화가 거의 없는 경우

2) 주요 구성

  • Instance: AWS 에 존재하는 가상 서버
  • AMI : 운영체제 이미지
  • Key Pair : 외부에서 인스턴스에 접속할 때 인증을 위해 사용하는 키
    • 인증서는 보관하는 것이 중요
  • EBS: 스토리지
  • 보안 그룹 : 가상의 방화벽
    • Inbound : 인스턴스 외부에서 인스턴스 내부로 요청
    • Outbound : 인스턴스 내부에서 외부로 요청
  • Elastic IP : 고정 IP

3) 사용 절차

  • 기본 리전 설정
    • region : 지리적으로 떨어진 독립적인 위치를 의미
    • AZ(Availability Zone : 가용영역) : region 내에서 물리적으로 격리된 공간
  • 인스턴스 시작을 누른 후 인스턴스 옵션 설정
    • 이름, 운영체제, 하드웨어
    • 키페어 : 외부에서 접속할 때 사용할 키와 관련된 파일
    • 보안 그룹 : 일정의 방화벽으로 기존의 내용을 선택할 수 있고 새로 만들 수 있음
      • 기본적으로 SSH 로 접속할 수 있도록 SSH 만 개방
    • 저장장치 : 기본적을 8G 가 제공되는데 30G 까지는 프리티어 계정에서 무료
  • 인스턴스를 생성하면 Public IP 와 Private IP 그리고 Public IP 와 매핑되는 도메인 한개가 제공됨
  • 인스턴스에 접속
    • AWS 에 로그인해서 접속
    • 외부에서 SSH 를 이용해서 접속
    • ssh -i pem파일경로 unbunt@IP 또는 DNS

4) 웹 서버로 사용

  • 외부에서 80번 포트로 접속
sudo apt-get update
sudo apt install apache2 -y
sudo service apache2 start
  • 다른 컴퓨터에서 EC2 공인 IP 를 브라우저에 입력
    • apache2 웹 페이지가 보이면 보안 그룹에서 http 를 인바운드에서 처리할 수 있도록 설정
    • 외부 접속이 안되는 경우 보안 그룹에서 80번 포트를 외부에서 접속할 수 있도록 설정 변경
  • 보안그룹 편집
    • 인스턴스 상세보기 -> [보안]
    • 보안 그룹의 ID 를 클릭해 편집

5) MYSQL 을 설치해서 외부에서 접소깅 가능하도록 설정

  1. 패키지 정보 업데이트 : sudo apt update 
  2. MYSQL 설치 : sudo apt install -y mysql-server
  3. 설치 확인 : mysql --version
  4. MySQL 접속 : sudo mysql -u root -p
  5. 관리자 비밀번호를 수정
    1. use mysql
    2. alter user 'root'@'localhost' identified with mysql_native_password by '비밀번호';
    3. flush priviliges;
  6. 계정 생성
    1. 데이터베이스 생성 : create database itstudy;
    2. 유저 생성 : create user adam@'%' identified by 'wnddkd';
    3. 권한 부여 : grant all privileges on itstudy.* to adam@'%';
    4. 변경 사항 반영 : flush privileges;

  • %에는 IP 설정 가능 -> 해당 IP 에서만 접속 가능함
    • 특정 Application 에서만 데이터베이스에 접속하는 경우 설정 -> 최근들어 VPC 를 이용해서 해결
  • MySQL 은 외부 접속을 기본적으로 차단
    • /etc/mysql/mysql.conf.d/mysqld.cnf 파일에 되어 있음
    • bind-address = 0.0.0.0 으로 수정 시 외부 접속 허용
    • sudo service mysql restart
  • EC2 인스턴스에서 3306을 외부에서 사용할 수 있도록 설정
반응형
LIST