연재 시리즈

쿠버네티스 네트워크 스터디 6주차 - Ingress https 적용

악분 2022. 2. 23. 20:06
반응형

스터디 목차

 

 

안녕하세요. 이 글은 facebook 쿠버네티스 그룹에서 올라온 "쿠버네티스 네트워크 스터디" 5주차 내용을 정리했습니다.

스터디 모집글: https://www.facebook.com/groups/k8skr/posts/3202691746679143

 

1. 6주차 세번째 주제

6주차 두번째 주제는 Ingress controller에 https 적용입니다. 이 글에서는 nginx ingress controller을 사용합니다. 

https프로토콜에 대한 선수지식이 필요합니다.

 

2. Ingress에 https 적용방법

ingress에 https를 적용하는 방법은 간단합니다. tls필드에 tls타입 시크릿리소스를 적용하면 됩니다.

 

3. https 동작

nginx ingress pod에 패킷이 도착할 때까지 https통신을 합니다. 그리고 nginx ingress pod에서 도착치 pod까지는 http통신을 합니다.

 

 

스터디에서 공유된 패킷자료를 보면, ingress controller pod까지는 https(443/tcp)를 사용합니다. 그리고 목적지 pod는 http(8080/tcp)를 사용합니다.

출처: 스터디 공유자료

 

4. 실습

4.1 준비

https://malwareanalysis.tistory.com/277에서 [챕터 4.3]글로 대체합니다.

 

4.2 self-signed 인증서 생성

인증서와 키를 생성합니다. 저는 인증할 도메인을 choilab.com으로 설정했습니다.

 DOMAIN="choilab.com"
 openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=$DOMAIN/O=$DOMAIN"

 

생성한 인증서와 키를 tls타입 쿠버네티스 시크릿으로 생성합니다.

kubectl create secret tls my-tls-secret \
--cert=tls.crt \
--key=tls.key

 

4.3 파드, 서비스, 인그레스 생성

파드, 서비스, 인그레스를 생성합니다. 저는 host를 choilab.com으로 설정했고 [챕터 4.2]에서 생성한 시크릿을 tls필드에 설정했습니다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-https
  labels:
    app: https
spec:
  containers:
  - name: container
    image: k8s.gcr.io/echoserver:1.6
  terminationGracePeriodSeconds: 0
---
apiVersion: v1
kind: Service
metadata:
  name: svc-https
spec:
  selector:
    app: https
  ports:
  - port: 8080
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - choilab.com
    secretName: my-tls-secret
  rules:
  - host: choilab.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc-https
            port:
              number: 8080

 

4.4 ingress 접속

윈도우 PC에서 ingress를 접속하면 다음과 같이 경고페이지가 표시됩니다. self-signed 인증서므로 브라우저 자체에서 경고 페이지를 보여준 것입니다.

 

[고급 -> 안전하지 않음]을 클릭하여 경고페이지를 무시합니다.

 

echo서버 응답이 잘 나왔습니다.

 

저희가 확인해야 하는 부분은 인증서가 올바르게 적용되었는지 입니다. 

 

인증서를 확인하면 [챕터 4.2]에서 발급한 도메인과 일치합니다.

 

4.5 패킷 분석

패킷 분석 단계에서는 클라이언트->nginx ingress pod로는 https프로토콜을 사용하고, nginx ingress pod -> 목적지 pod까지는 http프로토콜을 사용하는지 패킷을 추출하여 직접 확인합니다.

 

패킷을 덤프(추출)하기 위해 nginx ingress controller가 있는 워커노드에 접속합니다. 저는 워커노드 2번에 해당합니다.

 

그리고 nginx ingress pod가 인터페이스를 찾습니다. 저는 calico가 CNI이므로 calicoctl로 쉽게 찾을 수 있었습니다.

calicoctl get wep -n ingress-nginx

 

워커노드 2번에 calicoctl로 찾은 인터페이스가 존재합니다.

 

tcpdump 포트지정을 위해 nginx ingress controller nodeport를 조회합니다.

 

그리고 tcpdump명령어를 실행하여 nginx ingress controller pod로 오는 패킷을 덤프합니다. 덤프 결과는 /tmp/caputer.pcap경로에 저장됩니다.

tcpdump -i <nginx ingress pod veth> -nnq tcp port 80 or tcp port 443 or tcp port 8080 or tcp port <http nodeport> or tcp port <https nodeport> -w /tmp/caputre.pcap
예)
tcpdump -i calicb232023335 -nnq tcp port 80 or tcp port 443 or tcp port 8080 or tcp port 30341 or tcp port 31781 -w /tmp/caputre.pcap

 

패킷을 쉽게 분석하기 위해 분석하고 싶은 pod로 도착하는 IP만 필터링합니다.

ip.dst == <pod ip>

 

pcap파일을 와이어샤크로 엽니다. 그리고 메뉴 [Statistics -> Flow Graph]를 클릭합니다.

 

nginx ingress pod로 오는 포트는 https(443/tcp)포트입니다. 그리고 도착지 pod로 가는 포트는 8080/tcp입니다. 8080/tcp는 pod에서 설정한 http프로토콜입니다.

반응형