본문 바로가기
네트워크/k8s

[k8s] 38. Ingress - 실습

by Lauren X Ming 2021. 2. 25.

Ingress - 실습

image

1. Nginx Controller 설치

image

1. Nginx 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml

2. NodePort Service 생성

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml

3. nodePort 변경

  • 대시보드에서 Ingress-nginx Namespace의 서비스에 들어가기
  • http의 nodePort는 30431, https는 30798로 변경

image

2. Service Loadbalancing

image

  • 세 종류의 파드를 설치
  • Ingress를 만들어서 해당 rule대로 접근하는 실습

Shopping Page

apiVersion: v1
kind: Pod
metadata:
  name: pod-shopping
  labels:
    category: shopping
spec:
  containers:
  - name: container
    image: kubetm/shopping
---
apiVersion: v1
kind: Service
metadata:
  name: svc-shopping
spec:
  selector:
    category: shopping
  ports:
  - port: 8080

Customer Center

apiVersion: v1
kind: Pod
metadata:
  name: pod-customer
  labels:
    category: customer
spec:
  containers:
  - name: container
    image: kubetm/customer
---
apiVersion: v1
kind: Service
metadata:
  name: svc-customer
spec:
  selector:
    category: customer
  ports:
  - port: 8080

Order Service

apiVersion: v1
kind: Pod
metadata:
  name: pod-order
  labels:
    category: order
spec:
  containers:
  - name: container
    image: kubetm/order
---
apiVersion: v1
kind: Service
metadata:
  name: svc-order
spec:
  selector:
    category: order
  ports:
  - port: 8080

Ingress

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: service-loadbalancing
spec:
  rules:
  - http:
      paths:
        - path: /
          backend:
            serviceName: svc-shopping
            servicePort: 8080
        - path: /customer
          backend:
            serviceName: svc-customer
            servicePort: 8080
        - path: /order
          backend:
            serviceName: svc-order
            servicePort: 8080
  • rules를 보면 path: /, path: /customer, path: /order별로 다른 서비스에 연결시킴

실습 과정

  1. Shopping Page에 있는 파드와 서비스 생성(네임스페이스는 default)
  2. Customer Center의 파드와 서비스 생성
  3. Order Service의 파드와 서비스 생성
  4. 마스터 노드에서 각 서비스의 클러스터 아이피에 다음 명령어로 접근
    Order
    curl 10.103.131.142:8080
    Customer
    curl 10.98.193.178:8080
    Shopping
    curl 10.96.99.95:8080
    image
  5. Ingress 생성
  6. 마스터 노드에서 마스터 아이피로 각 다른 포트 접속
    Shopping
    curl 192.168.35.30:30431/
    Order
    curl 192.168.35.30:30431/order
    Customer
    curl 192.168.35.30:30431/customer
    image

3. Canary Upgrade

image

  • 기존 서비스인 V1 파드를 만들고 Ingress를 만들어 연결
  • Canary 테스트를 할 v2 파드 생성하고 그에 맞는 Ingress를 새로 연결
  • Ingress는 @weight:10% 어노테이션을 줘서 10%가 v2에 연결되는지 확인

App V1

apiVersion: v1
kind: Pod
metadata:
  name: pod-v1
  labels:
    app: v1
spec:
  containers:
  - name: container
    image: kubetm/app:v1
---
apiVersion: v1
kind: Service
metadata:
  name: svc-v1
spec:
  selector:
    app: v1
  ports:
  - port: 8080

App V2

apiVersion: v1
kind: Pod
metadata:
  name: pod-v2
  labels:
    app: v2
spec:
  containers:
  - name: container
    image: kubetm/app:v2
---
apiVersion: v1
kind: Service
metadata:
  name: svc-v2
spec:
  selector:
    app: v2
  ports:
  - port: 8080

Ingress - Default

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app
spec:
  rules:
  - host: www.app.com
    http:
      paths:
      - backend:
          serviceName: svc-v1
          servicePort: 8080
  • ruleshost: www.app.com으로 지정
  • paths:는 특별하게 지정하지 않고 바로 svc-v1으로 연결되도록 지정

Ingress - Weight

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: canary-v2
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  rules:
  - host: www.app.com
    http:
      paths:
      - backend:
          serviceName: svc-v2
          servicePort: 8080
  • annotations:
    • nginx.ingress.kubernetes.io/canary: "true": Canary 테스트를 할 거에요
    • nginx.ingress.kubernetes.io/canary-weight: "10": 똑같은 도메인 이름으로 접근하면 10%만 이 서비스로 연결해줘요

Ingress - Header

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: canary-kr
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "Accept-Language"
    nginx.ingress.kubernetes.io/canary-by-header-value: "kr"
spec:
  rules:
  - host: www.app.com
    http:
      paths:
      - backend:
          serviceName: svc-v2
          servicePort: 8080
  • annotations:
    • nginx.ingress.kubernetes.io/canary: "true": Canary 테스트를 할 거에요
    • nginx.ingress.kubernetes.io/canary-by-header: "Accept-Language": 헤더키로 "Accept-Languag"를 줌
    • nginx.ingress.kubernetes.io/canary-by-header-value: "kr": 헤더 벨류로 "kr"을 줌

실습 과정

  1. App V1의 파드와 서비스 생성
  2. Ingress - Default 생성
  3. 마스터 노드쉘에 다음과 같이 HostName 등록
    ```bash
    cat << EOF >> /etc/hosts
  4. 168.35.30 www.app.com
    EOF

curl www.app.com:30431/version

  ![image](https://user-images.githubusercontent.com/28076542/109032892-7407a080-7709-11eb-89a4-51d3fd7c6341.png)

4. App v2의 파드와 서비스 생성
5. Ingress - Weight 생성
6. 마스터 노드에 다음 명령어로 1초에 한 번씩 도메인에 트래픽 날리기
  ```bash
  while true; do curl www.app.com:30431/version; sleep 1; done

image
10번에 한 번 꼴로 v2에 연결 됨
7. Ingress - Weight 삭제
8. Ingress - Header 생성
9. 마스터 노드에서 다음 명령어로 도메인 접속

  curl -H "Accept-Language: kr" www.app.com:30431/version

-H "Accept-Language: kr" 헤더키와 벨류를 줘서 curl 가능
image

4. SSL

image

  • 파드를 만들고 Ingress를 생성
  • Ingress는 Secret과 연결
  • 마지막으로 https로 접속해볼 예정

App V1

apiVersion: v1
kind: Pod
metadata:
  name: pod-https
  labels:
    app: https
spec:
  containers:
  - name: container
    image: kubetm/app
---
apiVersion: v1
kind: Service
metadata:
  name: svc-https
spec:
  selector:
    app: https
  ports:
  - port: 8080

Ingress - SSL

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: https
spec:
  tls:
  - hosts:
    - www.https.com
    secretName: secret-https
  rules:
    - host: www.https.com
      http:
        paths:
        - backend:
            serviceName: svc-https
            servicePort: 8080
  • tls옵션에 host 이름과 secretName을 넣었음
  • rules에는 트래픽에 들어올 호스트와 서비스 지정

실습 과정

  1. App V1의 파드와 서비스 생성

  2. Ingress - SSL 생성

  3. Secret 생성
    마스터 노드에서 다음 명령어로 인증서 파일 생성

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

    생성된 인증서 파일로 Secret 생성

    kubectl create secret tls secret-https --key tls.key --cert tls.crt

    image

  4. Windows HostName 등록
    C:\Windows\System32\drivers\etc\hosts 파일 열고
    192.168.35.30 www.https.com 추가
    image

  5. http로 접근해보고, https로 접근해보기
    http로 접근 --> http://www.https.com:30798/hostname
    image
    https로 접근 --> https://www.https.com:30798/hostname
    image

출처

인프런 - 대세는 쿠버네티스

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 40. Autoscaler - 실습  (0) 2021.02.25
[k8s] 39. Autoscaler - HPA  (0) 2021.02.25
[k8s] 37. Ingress - Nginx  (0) 2021.02.25
[k8s] 36. StatefulSet - 실습  (0) 2021.02.25
[k8s] 35. StatefulSet  (0) 2021.02.25