Kubernetes 네트워킹 – Kubernetes의 네트워킹 개념에 대한 포괄적 인 가이드



이 Kubernetes Networking 블로그에서는 포드, 서비스 및 수신 네트워크와의 통신과 같은 Kubernetes와 관련된 개념에 대해 자세히 알아 봅니다.

이전 블로그에서 , Kubernetes에 대한 이해가 있어야합니다. Kubernetes 네트워킹에 대한이 블로그에서는 주로 Kubernetes와 관련된 네트워킹 개념에 초점을 맞출 것입니다.

Kubernetes Networking에 대한이 블로그에서는 다음 주제를 이해할 수 있습니다.





Kubernetes 란?

Kubernetes를 컨테이너화 된 애플리케이션의 배포를 자동화하기위한 휴대용 플랫폼을 제공하는 오픈 소스 컨테이너 오케스트레이션 도구로 정의 할 수 있습니다.

이제 Kubernetes를 사용하는 모든 사람은 Kubernetes 네트워킹을 이해하는 데 도움이되므로 Kubernetes 클러스터를 명확하게 이해해야합니다.



Kubernetes 클러스터

Kubernetes 플랫폼은 원하는 상태 관리를 제공하여 클러스터 서비스를 실행할 수 있도록 인프라에서 제공된 구성을 제공합니다. 예를 들어 설명하겠습니다.

클러스터 서비스에 제공해야하는 모든 구성 정보가있는 YAML 파일을 고려하십시오. 따라서이 파일은 클러스터 서비스의 API에 제공되며, 환경에서 포드를 예약하는 방법을 파악하는 것은 클러스터 서비스에 달려 있습니다. 따라서 3 개의 복제본이있는 포드 1에 대한 컨테이너 이미지 2 개와 복제본이 2 개인 포드 2에 대한 컨테이너 이미지가 있다고 가정하면 이러한 포드 복제본 쌍을 작업자에게 할당하는 것은 클러스터 서비스에 달려 있습니다.

Kubernetes 클러스터-Kubernetes 네트워킹-Edureka



위의 다이어그램을 참조하십시오. 이제 클러스터 서비스가 두 개의 포드 복제본 쌍이있는 첫 번째 작업자, 단일 포드-복제본 쌍이있는 두 번째 작업자, 두 개의 포드 복제본 쌍이있는 세 번째 작업자를 할당했음을 알 수 있습니다. 이제 작업자와 클러스터 서비스를 통신하는 것은 Kubelet 프로세스입니다.

따라서 클러스터 서비스의 전체 설정과 작업자 자체가 Kubernetes 클러스터 !!

개별적으로 할당 된 이러한 포드가 서로 어떻게 통신한다고 생각하십니까?

답은 Kubernetes 네트워킹에 있습니다!

새로운 업데이트를 받으려면 YouTube 채널을 구독하십시오 ..!

네트워킹 개념으로 해결해야 할 문제는 주로 4 가지입니다.

  • 컨테이너 간 통신
  • 포드 간 통신
  • 서비스 통신에 대한 포드
  • 서비스 커뮤니케이션 외부

이제 Kubernetes 네트워킹으로 위의 문제를 어떻게 해결하는지 알려 드리겠습니다.

Kubernetes 네트워킹

포드, 서비스 및 외부 서비스와 클러스터 내 서비스 간의 통신은 Kubernetes 네트워킹의 개념을 가져옵니다.

따라서 더 나은 이해를 위해 개념을 다음과 같이 나누겠습니다.

  • 포드 및 컨테이너 통신
  • 서비스
  • 인 그레스 네트워크를 통해 서비스에 외부 연결

포드 및 컨테이너 통신

포드가 어떻게 통신하는지 설명하기 전에 포드가 무엇인지 소개하겠습니다.

포드

포드는 네트워크 스택 및 기타 리소스를 공유하기 위해 동일한 호스트에 할당 된 하나 이상의 컨테이너로 구성된 Kubernetes 애플리케이션의 기본 단위입니다. 따라서 이것은 포드의 모든 컨테이너가 로컬 호스트의 다른 컨테이너에 도달 할 수 있음을 의미합니다.

이제이 포드가 어떻게 통신하는지 간략하게 설명하겠습니다.

통신에는 두 가지 유형이 있습니다. 그만큼 노드 간 통신 그리고 노드 내 통신.

이제 노드 내 통신부터 시작하겠습니다. 그 전에 포드 네트워크의 구성 요소를 소개하겠습니다.

네트워크 아래의 노드 내

노드 내 포드 네트워크는 기본적으로 동일한 포드에있는 두 개의 서로 다른 노드 간의 통신입니다. 예를 들어 설명하겠습니다.

패킷이 pod1에서 pod2로 이동한다고 가정합니다.

  • 패킷은 eth0에서 포드 1의 네트워크를 떠나 veth0의 루트 네트워크로 들어갑니다.
  • 그런 다음 패킷은 ARP 요청을 사용하여 목적지를 발견하는 Linux 브릿지 (cbr0)로 전달됩니다.
  • 따라서 veth1에 IP가 있으면 브리지는 이제 패킷을 전달할 위치를 알고 있습니다.

이제 마찬가지로 노드 간 포드 통신에 대해 설명하겠습니다.

Kubernetes 학습에 관심이 있으십니까?
네트워크 아래의 노드 간

다양한 네트워크 네임 스페이스, 네트워크 인터페이스 및 Linux 브리지가있는 두 개의 노드를 고려하십시오.

이제 패킷이 pod1에서 다른 노드에있는 pod4로 이동한다고 가정합니다.

  • 패킷은 포드 1 네트워크를 떠나 veth0의 루트 네트워크로 들어갑니다.
  • 그런 다음 패킷은 대상을 찾기 위해 ARP 요청을하는 Linux 브리지 (cbr0)로 전달됩니다.
  • 브리지가이 포드에 대상 주소가 없음을 인식하면 패킷은 기본 네트워크 인터페이스 eth0으로 돌아옵니다.
  • 이제 패킷은 노드 1을 떠나 다른 노드에서 대상을 찾고 CIDR 블록에 pod4가 포함 된 노드로 패킷을 라우팅하는 라우팅 테이블로 들어갑니다.
  • 이제 패킷이 node2에 도달하면 브리지가 ARP 요청을 보내는 패킷을 가져 와서 해당 IP가 veth0에 속하는지 확인합니다.
  • 마지막으로 패킷은 파이프 쌍을 통과하여 pod4에 도달합니다.

이것이 바로 포드가 서로 통신하는 방식입니다. 이제 계속해서 서비스가 포드 통신에 어떻게 도움이되는지 살펴 보겠습니다.

그렇다면 서비스가 무엇이라고 생각하십니까?

서비스

기본적으로 서비스는 트래픽을 수신하고 선택기에 의해 결정되는 포드 집합으로 요청을 전달하도록 프록시를 구성하는 리소스 유형입니다. 서비스가 생성되면 포트에 대한 요청을 수락 할 할당 된 IP 주소가 있습니다.

이제 클러스터 IP 주소 외부에 서비스를 노출하는 옵션을 제공하는 다양한 서비스 유형이 있습니다.

서비스 유형

주로 4 가지 유형의 서비스가 있습니다.

자바에서 직렬화되는 것

ClusterIP : 이것은 클러스터 내에서만 서비스에 도달 할 수 있도록하여 클러스터 내부 IP에서 서비스를 노출하는 기본 서비스 유형입니다.

NodePort : 이렇게하면 정적 포트에서 각 노드의 IP에 대한 서비스가 노출됩니다. 이후 ClusterIP NodePort 서비스가 라우팅 할 서비스가 자동으로 생성됩니다. 클러스터 외부의 NodePort 서비스에 연락 할 수 있습니다.

LoadBalancer : 클라우드 제공 업체의 부하 분산기를 사용하여 서비스를 외부에 노출하는 서비스 유형입니다. 따라서 외부로드 밸런서가 라우팅 할 NodePort 및 ClusterIP 서비스가 자동으로 생성됩니다.

ExternalName :이 서비스 유형은 서비스를 externalName 반환하여 필드 CNAME 그 가치로 기록하십시오.

그래서, 서비스에 관한 모든 것입니다. 이제 외부 서비스가 이러한 네트워크에 어떻게 연결되는지 궁금 할 것입니다.

음, 다름 아닌 인 그레스 네트워크 .

인 그레스 네트워크

Ingress 네트워크는 도달 가능한 URL을 통해 외부에 서비스를 제공하도록 구성 할 수있는 인바운드 연결을 허용하는 규칙 모음이므로 서비스를 노출하는 가장 강력한 방법입니다. 따라서 기본적으로 클러스터의 서비스에 대한 외부 액세스를 관리하는 Kubernetes 클러스터의 진입 점 역할을합니다.

이제 Ingress Network의 작동을 예를 들어 설명하겠습니다.

Linux 브리지가있는 포드 및 루트 네트워크 네임 스페이스가있는 2 개의 노드가 있습니다. 이 외에도 루트 네트워크에 flannel0 (network plugin)이라는 새로운 가상 이더넷 장치가 추가되었습니다.

이제 패킷이 pod1에서 pod 4로 흐르기를 원합니다.

  • 따라서 패킷은 pod1의 네트워크를 eth0에서 떠나 veth0의 루트 네트워크로 들어갑니다.
  • 그런 다음 cbr0으로 전달되어 ARP가 대상을 찾기 위해 요청한 후이 노드의 아무도 대상 IP 주소를 가지고 있지 않음을 발견합니다.
  • 따라서 노드의 경로 테이블이 flannel0으로 구성되어 있으므로 브리지는 패킷을 flannel0으로 보냅니다.
  • 이제 flannel 데몬은 Kubernetes의 API 서버와 통신하여 모든 포드 IP와 해당 노드를 파악하여 포드 IP와 노드 IP에 대한 매핑을 생성합니다.
  • 네트워크 플러그인은 소스 및 대상 IP를 해당 노드로 변경하는 추가 헤더가있는 UDP 패킷으로이 패킷을 래핑하고 eth0을 통해이 패킷을 보냅니다.
  • 이제 라우팅 테이블은 노드간에 트래픽을 라우팅하는 방법을 이미 알고 있으므로 패킷을 대상 node2로 보냅니다.
  • 패킷은 node2의 eth0에 도착하고 flannel0으로 돌아가서 캡슐화를 풀고 루트 네트워크 네임 스페이스에서 다시 방출합니다.
  • 다시 말하지만, 패킷은 Linux 브리지로 전달되어 veth1에 속한 IP를 찾기위한 ARP 요청을합니다.
  • 패킷은 마침내 루트 네트워크를 통과하여 대상 Pod4에 도달합니다.

이것이 외부 서비스가 수신 네트워크의 도움으로 연결되는 방식입니다. 이제 네트워크 플러그인에 대해 이야기하면서 사용 가능한 인기있는 네트워크 플러그인 목록을 소개하겠습니다.

이제 쿠 버네 티스 네트워킹에 대해 많이 이야기 했으니 실제 사례 연구를 보여 드리겠습니다.

사례 연구 : Kubernetes 네트워킹을 사용하는 Wealth Wizard

Wealth Wizards는 재무 계획과 스마트 소프트웨어 기술을 결합하여 저렴한 비용으로 전문가의 조언을 제공하는 온라인 재무 계획 플랫폼입니다.

도전

이제 회사가 클라우드 환경에 대한 완전한 가시성을 통해 코드 취약성을 신속하게 발견하고 제거하는 것이 매우 중요했지만 액세스 제한을 통해 트래픽을 제어하고자했습니다.

따라서 Kubernetes 인프라를 사용하여 Kube 클러스터 전체에서 마이크로 서비스의 배포 및 구성을 관리하는 도구를 사용하여 클러스터의 프로비저닝 및 롤아웃을 관리했습니다.

또한 Kubernetes의 네트워크 정책 기능을 사용하여 액세스 제한을 통해 트래픽을 제어 할 수있었습니다.

이제 문제는 이러한 정책이 애플리케이션 지향적이며 애플리케이션과 함께 만 발전 할 수 있지만 이러한 정책을 적용 할 구성 요소가 없다는 것입니다.

따라서 회사에서 찾을 수있는 유일한 솔루션은 네트워크 플러그인을 사용하는 것이었고 따라서 Weave Net을 사용하기 시작했습니다.

해결책

이 네트워크 플러그인은 Kubernetes에서 규칙을 관리하고 적용하기위한 네트워크 정책 컨트롤러가있는 가상 네트워크를 만듭니다. 뿐만 아니라 여러 호스트에서 Docker 컨테이너를 연결하고 자동 검색을 활성화합니다.

따라서 클러스터에 워크로드가 있고 클러스터의 다른 워크로드와 통신하는 것을 중지하려고한다고 가정합니다. 액세스를 제한하고 특정 포트의 수신 컨트롤러를 통해서만 수신을 허용하는 네트워크 정책을 생성하여이를 달성 할 수 있습니다.

이제 각 Kubernetes 노드에 대한 배포를 통해 플러그인은 포드 간 라우팅을 관리하고 IPtables 규칙을 조작 할 수있는 액세스 권한을 갖습니다. 간단히 말해서, 각 정책은 IPtables 규칙 모음으로 변환되고 Kubernetes 태그를 번역하기 위해 각 머신에서 조정 및 구성됩니다.

좋습니다. 이제 Kubernetes 네트워킹에 대한 많은 이론을 살펴 보았으므로 실제로 어떻게 수행되는지 보여 드리겠습니다.

실습

그래서 여러분 모두가 여러분의 시스템에 Kubernetes를 설치했다는 가정하에 보여줄 시나리오가 있습니다.

웹 애플리케이션이 필요하므로 제품 이름과 제품 ID를 저장한다고 가정하십시오. 기본적으로 웹 애플리케이션 용 컨테이너가 하나 필요하고 백엔드 용 MySQL로 컨테이너가 하나 더 필요하며 해당 MySQL 컨테이너는 웹 애플리케이션 컨테이너에 연결되어야합니다.

위에서 언급 한 예제를 실제로 실행하는 것은 어떻습니까?

시작하자!

1 단계: 원하는 디렉토리에 폴더를 만들고 작업 디렉토리 경로를 해당 폴더로 변경합니다.

mkdir HandsOn cd HandsOn /

2 단계: 이제 웹 애플리케이션 및 MySQL 데이터베이스에 대한 배포 YAML 파일을 만듭니다.

Step3 : 배포 파일을 만든 후에는 두 응용 프로그램을 모두 배포하십시오.

kubectl apply -f webapp.yml kubectl apply -f mysql.yml

3.1 단계 : 두 배포를 모두 확인하십시오.

kubectl get deployment

4 단계 : 이제 두 응용 프로그램에 대한 서비스를 만들어야합니다.

kubectl apply -f webservice.yml kubectl apply -f sqlservice.yml

4.1 단계 : 서비스가 생성되면 서비스를 배포합니다.

4.2 단계 : 서비스가 생성되었는지 확인하십시오.

kubectl 서비스 받기

5 단계 : 이제 실행중인 포드의 구성을 확인합니다.

kubectl get pods

6 단계 : webapp pod 내부의 컨테이너로 이동합니다.

kubectl exec -it container_id bash nano var / www / html / index.php

6.1 단계 : 이제 $ servername localhost에서 SQL 서비스 이름으로 ' webapp-sql1 ”이 경우 $ password 에서부터 ' edureka ”. 또한 필요한 모든 데이터베이스 세부 정보를 입력하고 키보드 바로 가기를 사용하여 index.php 파일을 저장합니다. Ctrl + x 그 후 와이 저장하고 누르기 시작하다 .

7 단계 : 이제 포드에있는 MySQL 컨테이너로 이동합니다..

kubectl exec it container_id bash

7.1 단계 : MySQL 컨테이너를 사용할 수있는 액세스 권한을 얻습니다.

mysql -u root -p edureka

여기서 -u는 사용자를 나타내고 -p는 시스템의 암호입니다.

7.2 단계 : webapp에서 데이터를 가져 오는 데 사용할 MySQL에서 데이터베이스를 만듭니다.

데이터베이스 제품 세부 정보 생성

7.3 단계 : 생성 된 데이터베이스를 사용합니다.

제품 세부 사항 사용

7.4 단계 : 웹앱에서 데이터를 가져 오는 데 사용할 MySQL의이 데이터베이스에 테이블을 만듭니다.

CREATE TABLE products (product_name VARCHAR (10), product_id VARCHAR (11))

7.5 단계 : 이제 명령을 사용하여 MySQL 컨테이너도 종료하십시오. 출구 .

8 단계 : 웹 애플리케이션이 작동하는 포트 번호를 확인하십시오.

kubectl get 서비스

8.1 단계 : 이제 할당 된 포트 번호에서 웹 애플리케이션을 엽니 다.

9 단계 : 클릭하면 쿼리 제출 , MySQL 서비스가 실행중인 노드로 이동 한 다음 컨테이너 내부로 이동합니다.

그러면 세부 정보를 입력 한 모든 목록 제품의 출력이 표시됩니다.

Kubernetes 학습에 관심이 있으십니까?

이 Kubernetes Networking 블로그가 관련이 있다고 생각되면 전 세계에 걸쳐 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 작성했습니다.