현대 오토에버 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
- yml 파일 생성 : my-nodeport.yml
2. Spring Boot Application 을 NodePort 를 이용해 모든 Node 에서 포트를 개방해 서비스 이용하기
1) 애플리케이션 생성
- Intellij 에서 Spring Boot Application 생성 ( Lombok, Web 의존성 추가 )
- 기본 패키지 안에 요청을 처리하는 클래스 추가 - FrontController
- 실행 후 브라우저에서 8080 포트로 접속해서 에러 없는지 확인
2) Dockerfile 파일 만들어서 이미지 생성하기
- 터미널을 실행 시켜서 애플리케이션 빌드: 실행 가능한 자바 파일을 생성
- 프로젝트의 루트 디렉토리에 Dockerfile을 생성하고 작성
- 이미지 생성 후 확인
- 이미지를 사용한 컨테이너 생성 후 실행
3) Github 를 이용해서 DockerHub 에 배포
- git hub 에 레포지터리 생성
- git hub 에 push
- 한번도 사용하지 않은 경우 이메일과 이름을 등록하라고 메시지 출력
- 브랜치 확인 후 브랜치 변경
- 원격 저장소 등록
- push : windows 나 mac 에서는 브라우저에서 로그인하고 linux 의 경우는 콘솔에서 로그인하라는 메시지가 출력
4) kubenetes Deployment 를 이용해서 pod 생성
- pod 를 생성할 yml 파일을 생성
- pod 생성
5) kubenetes Service 를 이용해서 NodePort 설정
- nodeport 를 이용할 서비스 파일 생성 : service.yml
- 서비스 생성 후 확인
- endpoint 확인
- 서비스와 동일한 이름의 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 을 설치해서 외부에서 접소깅 가능하도록 설정
- 패키지 정보 업데이트 : sudo apt update
- MYSQL 설치 : sudo apt install -y mysql-server
- 설치 확인 : mysql --version
- MySQL 접속 : sudo mysql -u root -p
- 관리자 비밀번호를 수정
- use mysql
- alter user 'root'@'localhost' identified with mysql_native_password by '비밀번호';
- flush priviliges;
- 계정 생성
- 데이터베이스 생성 : create database itstudy;
- 유저 생성 : create user adam@'%' identified by 'wnddkd';
- 권한 부여 : grant all privileges on itstudy.* to adam@'%';
- 변경 사항 반영 : 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