ingress

개념

  • 클러스터 외부에서 안으로 접근하는 요청들을 L7 수준에서 어떻게 처리할지 정의하는 규칙
  • 정의 할 규칙은 LoadBalancing, SSL 처리, virtual hosting 등이 있음
  • 인그레스는 이런 규칙의 모음이고 실제 동작은 인그레스 컨트롤러가 수행

KUB54008

설정

  • http://foo.bar.com/foos1 이라는 요청과 http://foo.bar.com/foos2 라는 요청이 왔을 때 각각 처리하는 서비스를 s1, s2로 매핑한다고 가정

KUB54008

  • ingress-basic.yaml을 아래와 같이 작성
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: / --->  / 경로로 리다이렉트 하라는 뜻 
spec:
  rules:
  - host: foo.bar.com  ----> foo.bar.com 요청에 대한 규칙 설정
    http:
      paths:
      - path: /foos1   ----> foo.bar.com/foos1 주소로 요청이 오면 서비스 s1의 80 포트로 보냄
        backend:
          serviceName: s1
          servicePort: 80
      - path: /bars2   ----> foo.bar.com/bars2 주소로 요청이 오면 서비스 s2의 80 포트로 보냄
        backend:
          serviceName: s2
          servicePort: 80
  - host: bar.foo.com  ----> bar.foo.com 주소로 요청이 오면 서비스 s2의 80 포트로 보냄 
    http:
      paths:
      - backend:
          serviceName: s2
          servicePort: 80

실행 및 확인

  • 위 인그레스 설정 파일을 실행
kubectl apply -f ingress-basic.yaml 
ingress.extensions/test created
  • 실행 후 아래 명령어를 통해 설정 내용을 확인
  • 아래와 같이 path /foos1 /bars2에 대한 규칙 생성 확인
kubectl describe ingress test
Name:             test
Namespace:        default
Address:          
Default backend:  default-http-backend:80 (<none>)
Rules:
  Host         Path  Backends
  ----         ----  --------
  foo.bar.com  
               /foos1   s1:80 (<none>)
               /bars2   s2:80 (<none>)
  bar.foo.com  
                  s2:80 (<none>)
Annotations:
<중략>......

ingress-nginx 컨트롤러

개념

  • ingress는 설정을 가질 뿐이고 실제 동작은 ingress controller가 수행함
  • ingress controller는 ingress 설정 규칙 대로 실제 동작하는 주체
  • 대표적으로 ingress-gce, ingress-nginx 있음
  • 실습으로 ingress-nginx 를 설치

ingress-nginx 설치

  • ingress-nginx 다운로드
git clone https://github.com/kubernetes/ingress-nginx.git 
  • ingress-nginx controller 생성
cd ingress-nginx/deploy/static/provider/baremetal

kubectl apply -k .

Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
namespace/ingress-nginx configured
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
serviceaccount/ingress-nginx-admission created
serviceaccount/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
  • NodePort 타입 서비스 생성 확인
kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.233.63.243   <none>        80:31015/TCP,443:30237/TCP   15m

접속 테스트

  • 아래 구성에 따라 접속 테스트 수행

KUB54006

  • 먼저 deployment 컨트롤러를 사용하여 접속 테스트에 사용할 파드를 생성

  • deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx-deployment
  # annotations:
    # kubernetes.io/change-cause: version 1.10.1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx-deployment
  template:
    metadata:
      labels:
        app: nginx-deployment
    spec:
      containers:
      - name: nginx-deployment
        image: nginx
        ports:
        - containerPort: 80
  • 생성 스크립트
kubectl apply -f deployment-nginx.yaml
  • 위 파드에 매핑되는 서비스를 스크립트를 통해 생성
kubectl expose deploy nginx-deployment --name s1
  • 서비스 정보 확인
kubectl get svc s1
  • 접속할 로컬의 호스트 파일에 foo.bar.com를 ingress Nodeport 타입 서비스가 생성된 VM의 External IP를 등록
  • mac의 경우 /private/ect/hosts 에 등록
35.***.***.2 foo.bar.com
  • 브라우저에 http://foo.bar.com:31015/foos1 접속 테스트

KUB54006

인그레스 SSL 설정하기

OpenSSL 발급

  • 디렉토리 만들기
mkdir -p /engn001/openssl
cd /engn001/openssl
  • openssl 생성
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=kube-book.com"
Generating a 2048 bit RSA private key
  • openssl 확인
root@instance-1:/engn001/openssl# ll
total 16
drwxr-xr-x 2 root root 4096 Apr  2 08:48 ./
drwxr-xr-x 4 root root 4096 Apr  2 08:45 ../
-rw-r--r-- 1 root root 1107 Apr  2 08:48 tls.crt
-rw-r--r-- 1 root root 1708 Apr  2 08:48 tls.key

인증용 시크릿 만들기

  • 생성된 tls.key와 tls.crt파일로 시크릿 만듬
kubectl create secret tls kube-book-secret --key tls.key --cert tls.crt
  • 생성 상세 정보 확인
root@instance-1:/engn001/openssl# kubectl describe secret
Name:         default-token-wqx26
Namespace:    default
Labels:       <none>

.... <중략> ....

Data
====
tls.crt:  1107 bytes
tls.key:  1708 bytes

Info Notice: secret은 쿠버네티스에서 내부 보안을 위해 필요한 설정에 사용되는 요소

시크릿 적용 인그레스 실행

  • tls를 반영한 시크릿을 설정한 인그레스 규칙 실행

  • ingress-ssl.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-ssl
spec:
  tls:
  - hosts:
    - kube-book.com
    secretName: kube-book-secret
  rules:
  - host: kube-book.com
    http:
      paths:
      - path: /
        backend:
          serviceName: s1
          servicePort: 80
  • 설정 파일 실행
kubectl apply -f ingress-ssl.yaml

적용 테스트

  • ingress-nginx NodePort 서비스 확인
  • https의 경우 30237 포트 번호를 사용하여 접속
kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.233.63.243   <none>        80:31015/TCP,443:30237/TCP   5h2m

  • 접속할 클라이언트 hosts 파일에 아래 설정
34.***.1.*** kube-book.com
  • 아래 URL로 접속 테스트

https://kube-book.com:30237

  • openssl은 공인 인증기관에서 인증된 증서가 아니므로 아래와 같이 무시무시한 화면이 나오지만 일단 접속은 성공

KUB54007

무중단 배포

Info Notice: 무중단 배포는 이해가 안되는 부분이 해소된 후에 업데이트 예정

댓글남기기