/
6. 쿠버네티스 서비스/네트워크

6. 쿠버네티스 서비스/네트워크


1. 서비스

1.1 클러스터 외부 트래픽 받는 방법

Nodeport

 

0fd0c795-7056-4d12-8c6d-4fdaa0b6c796.png

Load Balancer

f9ecd753-5b3e-45ae-8b79-006bba457411.png

Ingress

 

1.2 서비스 개념

파드를 통해 사용자에게 서비스를 제공을 할 수 있으나, 파드에 장애가 발생했을 경우 서비스에 가용성을 보장할 수가 없기 때문에, Service를 통해 가용성을 보장합니다

 

Kubernetes Service를 통해 파드의 로드밸런싱이 가능하며, 파드에 문제가 발생하여 정상적으로 구동시킬 수 없는 경우에는 Service가 자동으로 문제가 발생한 파드는 Service의 EndPoint에서 제외됩니다.

 

 

문제가 생겼던 Pod는 Deployment를 통해 다른 IP, Name으로 다시 구동되며, Service의 EndPoint에 자동으로 추가되어, 기존상태를 유지합니다.

 

(1) ClusterIP

  • 서비스를 클러스터 내부 IP에 노출합니다.

  • 클러스터 내에서만 서비스에 도달할 수 있으며, 서비스 타입의 기본값입니다.

6/00-svc-clusterip.yaml

apiVersion: v1 kind: Pod metadata: name: nginx labels: app.kubernetes.io/name: proxy spec: containers: - name: nginx image: nginx:stable ports: - containerPort: 80 name: http-web-svc --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app.kubernetes.io/name: proxy ports: - name: name-of-service-port protocol: TCP port: 80 targetPort: http-web-svc
root@cp-k8s:~/2024_k8s/edu/6# k get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h16m nginx-service ClusterIP 10.103.98.179 <none> 80/TCP 99s root@cp-k8s:~/2024_k8s/edu/6# curl 10.103.98.179 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>

(2) NodePort

  • 고정포트로 각 노드의 IP에 서비스를 노출합니다.

  • NodePort 서비스가 라우팅되는 ClusterIP가 자동으로 생성되며 NodeIP:NodePort를 요청하며, 서비스 외수에서 NodePort 서비스에 접속할 수 있습니다.

6/01-svc-nodeport.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: my-service-nodeport spec: type: NodePort selector: app: nginx ports: # 기본적으로 그리고 편의상 `targetPort` 는 `port` 필드와 동일한 값으로 설정된다. - port: 80 targetPort: 80 # 선택적 필드 # 기본적으로 그리고 편의상 쿠버네티스 컨트롤 플레인은 포트 범위에서 할당한다(기본값: 30000-32767) nodePort: 30007

 

(3) LoadBalancer

  • 클라우드 공급자의 로드 밸런서를 사용하여 서비스를 외부에 노출시킵니다.

  • 클러스터 외부 IP를 가지고 있기 때문에, 클러스터 외부에서 접근 가능합니다.

  • 외부 로드 밸런서가 라우팅되는 NodePort와 ClusterIP 서비스가 자동으로 생성됩니다.

  • 프라이빗 클라우드 환경에서는 MetalLB를 이용하여 LoadBalancer 타입의 서비스를 이용 할 수 있습니다.

6/02-svc-loadbalancer.yaml

 

 

(4) ExternalName

  • 값과 함께 CNAME 레코드를 리턴하여, 서비스를 externalName 필드의 콘텐츠에 매핑합니다.

  • 클러스터 내에서 외부 서비스를 이름으로 참조할 수 있게 해주는 서비스 타입입니다.

  • 내부 클러스터에서 외부 DNS 이름을 내부 서비스로 변환하여 접근 가능하게 됩니다.

6/03-svc-externalname.yaml

  • 이 서비스는 my-database라는 이름으로 정의되며, 실제로는 db.example.com에 대한 DNS 쿼리로 변환됩니다.

  • 클러스터 내부의 애플리케이션에서 my-database라는 이름을 사용하여 외부의 db.example.com에 접근할 수 있습니다.

 

 

1.3 MetalLB 설치(Private 환경에서의 로드 밸런서)

 

(1) metallb 네임스페이스 생성 (이미 생성해 두었음)

 

(2) metallb 설치 (이미 생성해 두었음)

6/04-metallb-install.txt

 

(3) 설치 확인

 

(4) IPAddressPool 생성

  • 외부로 노출할 VIP에 대한 범위를 지정합니다.

  • 아이피 대역은 실제 External IP로 사용할 IP를 적어줍니다. (노드에서 할당이 가능하여야 함)

6/05-metallb-ipaddresspool.yaml

  • 생성

 

Loadbalancer 타입으로 서비스를 생성해보고, External IP가 할당되었는지 확인해봅니다.

 


2. Ingress

2.1 Ingress Controller

  • 인그레스 리소스를 해석하고, 이를 실제 네트워크 트래픽 관리로 변환하는 쿠버네티스 구성 요소입니다.

  • 다양한 종류의 인그레스 컨트롤러가 존재하며, 각 컨트롤러는 특정 구현 및 기능을 제공합니다.

 

2.2 Ingress

  • 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리합니다.

  • 인그레스는 클러스터 외부에서 클러스터 내부 서비스로 HTTP와 HTTPS 경로를 노출시킵니다.

  • 인그레스 컨트롤러가 있어야 인그레스를 충족할 수 있으며, 인그레스 리소스만 생성한다면 효과가 없습니다.

    • 대표적인 인그레스 컨트롤러: ingress-nginx

 

(1) Ingress의 필요성

  • ingress를 이용하면 한 가지의 외부 Service로 도메인, 서브도메인 기반의 여러가지 백엔드 서비스에 연결 할 수 있는 장점이 있습니다.

  • ingress를 이용하면 ClusterIP 타입으로 외부에서 접근 할 수 있습니다.

  • ingress는 도메인기반, 서브도메인기반 등을 이용할 수 있으며 SSL을 지원합니다.

 

(2) Nginx Ingress Controller 설치

  • Private 환경에서 인그레스를 사용하기 위해 컨트롤러를 설치합니다.

6/06-ingress-nginx-install.txt

 

(3) 서비스 LoadBalancer 타입 설정

  • nginx의 svc는 편의상 이전단계에서 생성한 LoadBalancer 타입으로 지정해주도록 합니다

 

(4) 생성된 lb의 Externel IP를 이용하여 통신을 시도 합니다.

  • 현재 연결된 백엔드 svc가 없으므로 404 Not Found를 확인 할 수 있습니다.

 

(5) Ingress 백엔드로 사용 할 서비스 생성

  • 테스트를 위하여 총 2가지의 pod와 ClusterIP 타입의 Service를 생성합니다.

  • 아래 deployment는 podname을 확인하도록 nginx 가 아닌 echoserver 이미지를 사용 합니다.

6/07-ingress-backend.yml

 

(6) 위에서 만든 yaml을 이용하여 pod 및 svc를 생성 합니다

 

  • pod와 Service가 잘 생성되었으며, 생성된 Service로 통신 시도 시 연결된 Pod 이름을 확인합니다.

 

(7) L7기반의 라우팅을 해주는 ingress정책을 생성 합니다

  • ingress svc로 들어온 패킷의 L7레이어 즉 도메인 주소를 체크하여 트래픽을 전달합니다.

    • 도메인 주소가 a.com이라면 nginx-service-clusterip로 연결합니다.

    • 도메인 주소가 b.com이라면 nginx2-service.clusterip로 연결합니다.

6/08-ingress.yaml

 

(8) ingress정책을 생성 합니다

 

 

(9) ingress가 제대로 설정되어있는지 확인 합니다.

 

(10) 클러스터 외부에서 host파일을 변조하여 a.com과 b.com의 주소를 LB external ip로 지정한 후 접속을 시도하여 L7 기반의 로드밸런싱+라우팅이 제대로 작동되는지 확인 합니다.

 

노트북의 host파일에 아래와 같은 설정을 합니다

노트패드를 관리자권한으로 열어서 아래폴더를 수정하면 됩니다.

 

  • 이제 노트북에서 a.com와 b.com을 호출 합니다/

 

  • nginx ip로 직접 호출을 해봅니다

    • 레이어상 도메인정보가 없으므로 분기되지 않고 404 페이지가 나타 납니다.

 

  • ingress 설정 시 아래와 같이 서브도메인으로 분기도 가능하므로 활용하도록 합니다

6/08-ingress2.yaml

 

 

  • 위와같이 설정한다면 a.com/a 로 들어온 패킷은 nginx-service-clusterip로 라우팅 됩니다.

  • a.com/b 로 들어온 패킷은 nginx2.service-clusterip로 라우팅 됩니다

 

  • ingress의 기능은 MSA 아키텍처에 많은 도움을 줄 수 있습니다

  • ingress를 잘 활용 하면 웹서버에 페이지 별로 다른 deploy나 pod그룹을 이용하여 효율적으로 자원을 분배하고 서비스를 배치 하여 관리 할 수 있습니다

ingress의 기능은 msa아키텍처에 많은 도움을 줄 수 있으며, 웹서버에 페이지 별로 다른 deploy나 pod그룹을 이용하여 효율적으로 자원을 분배하고 서비스를 배치 하여 관리 할 수 있습니다.

다음 실습을 위해서 pod를 정리합니다.


3. 파드 네트워크

참고) 문서 상 노드 이름 및 역할

  • CNI 종류 및 구성방식에 따라 트래픽 전송 방식에 차이가 있습니다.

  • 어떤 식으로 트래픽이 전달되는지 확인하는 방법을 설명합니다.

192.168.1.10 cp-k8s
192.168.1.101 w1-k8s
192.168.1.102 w2-k8s
192.168.1.103 w3-k8s

 

3.1 파드 네크워크

 

  • 도커에서 POD 네트워크 설명할 경우와 인터페이스 이름이 다릅니다.

  • 도커의 역할

참고1) The Industry-Leading Container Runtime | Docker

 

 

3.2 단일 컨테이너 파드

  • Pod (Single Container)의 네트워크 설정을 확인합니다.

6/09-pod-network-ubuntu.yaml

 

  • 파드 네트워크 구성에 대해 알아봅니다.

 

3.3 멀티 컨테이너 파드

  • Pod (Multi Container)의 네트워크 설정 확인을 확인합니다.

6/10-pod-network-multicon.yaml

  • 컨테이너 내부에서 네트워크 흐름을 알아봅니다.

 

  • 노드 네트워크 확인

 

  • multi-container 관련 컨테이너 확인

 

3.4 파드 간 통신

 

 

Pod 간 route 경로 확인

 

노드 route table 확인

  • 참고

https://kubernetes.io/ko/docs/concepts/cluster-administration/networking/

 


4. CoreDNS

4.1 CoreDNS 주요 플러그인

(1) kubernetes

  • Kubernetes 클러스터 내의 서비스와 파드를 위한 DNS 서비스를 제공합니다.

(2) forward

  • DNS 요청을 외부 DNS 서버로 포워딩합니다.

(3) cache

  • DNS 응답을 캐싱하여 성능을 향상시킵니다.

(4) loadbalance

  • DNS 응답을 라운드 로빈 방식으로 로드 밸런싱합니다.

 

CoreDNS 기본 설정

6/11-coredns-cm.yaml

 

 

4.2 CoreDNS 설정에서 외부 DNS 서버 추가

(1) 설정 수정

 

(2) 외부 DNS 서버 추가

  • forward . 192.168.255.100:53

 

(3) 설정 적용을 위한 coredns 파드 재시작

 

4.3 특정 도메인 호출 시 외부 IP로 포워딩

  • webservice1.com 도메인 호출시 클러스터 외부IP(172.16.0.3)로 포워딩 설정

(1) 설정 수정

 

(2) 특정 도메인 목적지 추가

  • host {} 항목을 추가합니다.

 

(3) 설정 적용을 위한 coredns 파드 재시작

 

4.4 특정 도메인 호출 시 도메인 이름 변경

  • webservice1.com 도메인 호출시 클러스터 외부IP(172.16.0.3)로 포워딩 설정

(1) 설정 수정

 

(2) rewrite 플러그인 내용 추가

  • [web-service.cluster.local] 요청을 [webservice1.com]로 변경하여 처리

 

(3) 설정 적용을 위한 coredns 파드 재시작

Related content

1. 쿠버네티스 실습환경 구축
1. 쿠버네티스 실습환경 구축
Read with this
5. 쿠버네티스 Workload / Config
5. 쿠버네티스 Workload / Config
Read with this
14. 애플리케이션 배포(CD)
14. 애플리케이션 배포(CD)
Read with this
8. 쿠버네티스 리소스 관리 및 볼륨
8. 쿠버네티스 리소스 관리 및 볼륨
Read with this