Day 48 - 쿠버네티스 인그레스 TLS , 쿠버네티스 3tier 구성하기
오늘 배운 내용
- 쿠버네티스 인그레스 TLS
- 쿠버네티스 3tier 구성하기
쿠버네티스 인그레스 TLS
우선 쿠버네티스의 ingress는 L7단계 라우터 역할을 할 수 있으며, 목적에 따라
L4 loadbalancer (Service type: LoadBalancer) 나 ingress (Application LB)를 사용한다
인그레스는 여러 서비스에 대해서 라우팅의 역할을 담당한다. 예를 들면, 아래의 인그레스 설정은 / 로 요청시 hello-world 라는 서비스로 연결하고, /kube 로 요청시 hello-kubernetes 라는 서비스로 연결할 수 있다
-> URL에 따른 서비스 매핑이 필요한 경우 ingress 를 사용한다
아래 블로그를 읽으면 더 잘 이해할 수 있다
Kubernetes 서비스와 인그레스 용도구분
이번 포스팅에서는 쿠버네티스의 서비스와 인그레스의 차이점에 대해서 알아보겠습니다. 쿠버네티스를 처음 접하는 분들은, 간단하게 API 서버를 만들어서 `POD` 를 띄우기까지는 성공하지만, 해
danawalab.github.io
TLS = HTTPS 통신 - 인증서, 키가 필요하다
TLS를 사용하기 위해서는 인증서가 필요하다
보안 인증서 종류 (참고)
1. 단일 인증서 : 하나의 도메인에 대해서
2. 멀티 인증서 여러개의 도메인을 하나의 인증서로
3. 와일드카드 인증서 : *.도메인 모두
ingress tls를 사용하기 위해 다음 단계를 따른다
1. 인증서 만들기
2. RS, svc 생성
3. TLS 인그래스 생성
TLS 사설 인증서 만들기
GCP에서 CentOs를 사용하는 kubectl VM을 하나 만들고 다음을 입력한다 (window의 경우)
#openssl 설치
sudo yum install -y openssl
# 인증서 생성
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=v1.mymincloud.com/O=v1.mymincloud.com"
TLS 통신은 다음과 같이 이루어 진다
물론 VM에 바로 TLS 통신을 해도 되지만 이러는 경우 설정도 번거로울뿐더러 서버에 부하가 안했을때 보다 거의 2배 이상 걸린다.
따라서 먼저 ingress단에서 TLS 통신을 하고, 그 뒷단 부터는 신뢰할 수 있는 구간으로 여기고 Http 통신하면 된다
RS와 SCV 생성하기
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: v1
labels:
app: v1
spec:
# modify replicas according to your case
replicas: 3
selector:
matchLabels:
app: v1
template:
metadata:
labels:
app: v1
spec:
containers:
- name: nginx
image: gymin97/msa2:nginx_v1
imagePullPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: svc1
spec:
selector:
app: v1
ports:
- port: 80
targetPort: 80
nodePort: 30100
type : NodePort
일단 간단하게 구현하기 위해 1개의 서비스만 만든다
Ingress TLS
인그레스를 만들기 전에 Secret이라는 리소스를 하나 만들어야 한다
kubectl create secret tls tls-crt --key tls.key --cert tls.crt
ingress 생성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "k8s-ip" # gcp의 static ip
spec:
tls:
- hosts:
- v1.mymincloud.com
secretName: tls-crt # Secret 리소스 이름
rules:
- host: v1.mymincloud.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: svc1
port:
number: 80
도메인 앞에 https:// 붙여 접속
신뢰할 수 없는 사이트라고 뜬다 - CA 인증서를 받으면 안뜨지만 돈이 드니까 실습에서는 사설인증서를 사용했다
이렇게 하면 문제점이 하나 있다
사용자가 https://를 치고 들어가야 한다는점 그냥 들어가면 http통신이 된다
https redirection을 해야한다! http로 들어오더라도 https로 들어오도록
→ ingress (controller) = ALB 로 처리할 수 있음
https redirection을 위한 frontend yaml을 하나 만든다
apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
name: https-redirect
spec:
redirectToHttps:
enabled: true
responseCodeName: ""
ingress yml 수정
networking.gke.io/v1beta1.FrontendConfig: "https-redirect"
frontend yml을 먼저 실행하고, ingress yml을 실행한다
http로 접속시 https 접속이 됨
다른 도메인을 추가하고 싶다면 인증서부터 다시 하면 된다
TLS 인증서의 경우 기간이 있기때문에 갱신이 필요하다
eks에서 ingress 만들기
ingress, svc를 다 만들어도 ingress controller는 만들어지지 않는다
https://aws.amazon.com/ko/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/
Amazon EKS의 Amazon EC2 노드 그룹에서 AWS 로드 밸런서 컨트롤러를 사용하여 ALB 설정
참고: cluster-name은 사용자의 클러스터 이름으로, region-name은 사용자의 AWS 리전으로, ca-thumbprint는 루트 CA 인증서의 지문으로 바꿉니다. 클러스터에서 oidc.eks.region-name.amazonaws.com과 함께 사용하는
aws.amazon.com
먼저 ingress controller 를 생성해야한다
-> 메뉴얼 확인
ingress.yml 파일 annotation 수정
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/scheme: internet-facing
spec:
rules:
- host: web1.mymincloud.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: svc1
port:
number: 80
router53 에서 레코드 생성
AWS는 static ip를 사용할 수가 없다 (GKE처럼)
AWS에서 LB를 제공하는 방식이 하나의 IP로 제공하는 GCP와 달리
Domain 아래에서 여러 ip를 사용하기 때문이다 (이 ip는 사라지기도 하고, 생성되기도 해서 변동 가능성이 있다)
nslookup으로 LB 도메인을 확인해봐도 ip가 두개 나온다
AWS는 LB를 제공할때 여러개의 ip를 도메일으로 엮어두고, 부하가 걸리면 ip를 더 늘리거나 한다
쿠버네티스 nodeport vs LB vs ingress 차이 (넘모 헷갈리는~)
NodePort vs LoadBalancer vs Ingress
이번 포스팅은 구글 클라우드의 Kubernetes Service 비교 글을 참조 했으며 참조한 원본 글을 아래의 링크에서 확인 할 수 있다. Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what? Recen..
sharplee7.tistory.com
ingress를 할때 LB type로 하면 안되나? 했는데 ingress 가 ALB고, service가 LB(4계층)이라 일단 크게 LB라는 역할이 같기도 하고,
ingress에서는 host path에 따라 svc를 넘겨줄때 svc 이름을 넘겨주니까 ip를 굳이 받아주지 않아도 되는것 같다!
오늘의 회고
- 오늘은 갑자기 ingress랑 LB, node port가 너무너무 헷갈려서 오전에는 쉬지를 못했다
- 네트워크 관리사보다는 일단 쿠버네티스 공부가 더 필요한 것 같다 .. 모르면 못따라가니까..!
- 내일은 드디어 주말이다아 주말에 공부하려했는데 오랜만에 동기들이랑 끝내주게 놀기로해서 일요일에나 공부를 할수있다 ,,! 오늘 빡공하고 자야지이