ingress
개념
- 클러스터 외부에서 안으로 접근하는 요청들을 L7 수준에서 어떻게 처리할지 정의하는 규칙
- 정의 할 규칙은 LoadBalancing, SSL 처리, virtual hosting 등이 있음
- 인그레스는 이런 규칙의 모음이고 실제 동작은 인그레스 컨트롤러가 수행
설정
- http://foo.bar.com/foos1 이라는 요청과 http://foo.bar.com/foos2 라는 요청이 왔을 때 각각 처리하는 서비스를 s1, s2로 매핑한다고 가정
- 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
접속 테스트
- 아래 구성에 따라 접속 테스트 수행
-
먼저 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 접속 테스트
인그레스 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은 공인 인증기관에서 인증된 증서가 아니므로 아래와 같이 무시무시한 화면이 나오지만 일단 접속은 성공
무중단 배포
Info Notice: 무중단 배포는 이해가 안되는 부분이 해소된 후에 업데이트 예정
댓글남기기