23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
Kubernetes 환경에서 Ingress 컨트롤러를 사용하여 웹 애플리케이션에 HTTPS 보안을 완벽하게 설정하는 방법에 대해 소개해드리려고 합니다.
특히, 무료 인증서 제공 서비스인 Let's Encrypt을 활용하여 손쉽게 인증서를 발급받는 방법을 다뤄보겠습니다.
Kubernetes에서 다양한 애플리케이션을 외부에서 접근할 수 있도록 하려면 보통 Ingress를 사용합니다.
Ingress는 외부 Http(s) 요청을 내부의 적절한 서비스로 라우팅해주는 역할을 하는데요,
이때 HTTPS를 지원하도록 설정하면 사용자와 서버 간의 통신이 암호화되어 보안을 강화할 수 있습니다.
하지만 HTTPS를 적용하기 위해서는 인증서가 필요합니다.
이때 인증서를 유료로 구매할 수도 있지만, Let's Encrypt라는 무료 인증서 발급 서비스를 이용하면 비용 부담 없이 HTTPS 보안을 구현할 수 있습니다.
이를 Kubernetes 환경에서 손쉽게 적용할 수 있도록 Ingress 컨트롤러와 CertManager라는 도구를 함께 사용하겠습니다.
eksctl로 손쉽게 시작하는 Kubernetes 클러스터 및 노드그룹 생성 방법
완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기
Keycloak 설치부터 설정까지: SSO를 위한 첫걸음
SSO 연동 샘플 애플리케이션 구성하기: 실전 가이드
SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합
Keycloak을 설정하기 위해서는 사용할 도메인이 필요합니다. 본 가이드에서는 예시로 cloudradar.kr 도메인을 사용합니다.
실제 설정 시에는 회사 또는 프로젝트에 맞는 도메인을 사용해야 합니다.
먼저 Kubernetes 클러스터에 Ingress 컨트롤러를 설치합니다. Nginx Ingress 컨트롤러는 Helm을 사용하면 쉽게 설치할 수 있습니다.
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm upgrade --install ingress ingress-nginx/ingress-nginx --create-namespace -n devops-nginx-ingress --set controller.service.annotations."service\.beta\.kubernetes\.io/aws-load-balancer-name"="eks-lb"이 명령어로 Nginx Ingress 컨트롤러가 K8s 클러스터에 설치되며, 외부 요청을 처리할 준비를 마치게 됩니다. 로드 밸런서가 생성된 것을 확인할 수 있습니다.
aws elb describe-load-balancers --query "LoadBalancerDescriptions[*].{Name:LoadBalancerName,DNSName:DNSName}"
[
{
"Name": "eks-lb",
"DNSName": "dualstack.a061dd5a8ee12457783ffeae0911afee-111823484.ap-northeast-2.elb.amazonaws.com"
}
]다음으로 Let's Encrypt 인증서를 자동으로 발급받고 관리해주는 Cert-Manager를 설치합니다. 역시 Helm을 사용하여 설치할 수 있습니다.
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager --create-namespace --namespace devops-certmanager \
--set crds.enabled=true이제 Ingress 리소스에 HTTPS를 설정하고 Let's Encrypt을 통해 인증서를 발급받아봅시다. 먼저 ClusterIssuer를 생성하도록 하겠습니다.
Kubernetes에서 SSL/TLS 인증서를 자동으로 발급하고 관리해주는 오픈소스 도구입니다.
특정 네임스페이스 내에서 인증서를 발급하는 데 사용되는 리소스입니다.
클러스터 전체에서 인증서를 발급하는 리소스입니다. 네임스페이스에 국한되지 않고 모든 네임스페이스에서 사용 가능하다는 점에서 Issuer와 차이가 있습니다.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-stg
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: << YOUR_EMAIL >>
privateKeySecretRef:
name: letsencrypt-stg
solvers:
- http01:
ingress:
class: nginx
selector: {}apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prd
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: << YOUR_EMAIL >>
privateKeySecretRef:
name: letsencrypt-prd
solvers:
- http01:
ingress:
class: nginx
selector: {}위에서 생성한 ClusterIssuer 를 클러스터에 적용합니다.
kubectl apply -f issuer-stg.yaml
kubectl apply -f issuer-prd.yaml
kubectl get clusterissuer --show-kind=true
NAME READY AGE
clusterissuer.cert-manager.io/letsencrypt-prd True 1d12h
clusterissuer.cert-manager.io/letsencrypt-stg True 1d12h사용자가 도메인 호스트로 접속할 때 Nginx Ingress 컨트롤러가 설정된 로드밸런서로 트래픽을 전달하기 위한 레코드를 생성합니다.
Route53에서 *.cloudradar.kr에 대한 A레코드를 생성하고 로드밸런서 DNS이름을 설정합니다.
aws route53 change-resource-record-sets 명령어를 실행하여 동일하게 작업할 수 있습니다.
테스트를 위한 Nginx 웹 서버를 Helm 차트로 배포하고 도메인 접속을 시도해봅니다.
helm upgrade nginx-server bitnami/nginx --set service.type=ClusterIP
kubectl describe deployment nginx-server
kubectl get pods -l app.kubernetes.io/name=nginx
NAME READY STATUS RESTARTS AGE
nginx-server-949fd768-rdrm9 1/1 Running 0 3m44s
kubectl get svc -l app.kubernetes.io/name=nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-server ClusterIP 172.20.176.233 <none> 80/TCP,443/TCP 4m52mIngress 설정을 아래와 같이 작성하여 적용합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingresss
namespace: default
annotations:
cert-manager.io/cluster-issuer: letsencrypt-stg
ingress.kubernetes.io/force-ssl-redirect: "true"
kubernetes.io/tls-acme: "true"
spec:
ingressClassName: nginx
rules:
- host: hello.cloudradar.kr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-server
port:
number: 80
tls:
- hosts:
- hello.cloudradar.kr
secretName: hello-acme-crtIngress 배포를 진행하고 정상적으로 동작하는지 확인해봅니다.
kubectl apply -f ingress-webserver.yaml
ingress.networking.k8s.io/nginx-ingresss created
kubectl get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingresss nginx hello.cloudradar.kr dualstack.a061dd5a8ee12457783ffeae0911afee-111823484.ap-northeast-2.elb.amazonaws.com 80, 443 3m5s앞서 Nginx 웹 서버를 배포하여 접속을 확인했습니다.
그러나 현재 Let's Encrypt의 인증서를 Staging 용으로 발급되어 브라우저에서 보안 경고가 표시되고 있습니다.
이를 해결하기 위해 운영 환경용 인증서로 전환하여 안전하게 페이지에 접속할 수 있도록 설정을 진행합니다.
기존 Cluster Issuer 를 letsencrypt-prd 로 변경합니다.
...
metadata:
name: nginx-ingresss
namespace: default
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prd
...kubectl apply -f ingress-webserver.yaml
ingress.networking.k8s.io/nginx-ingresss configured인증서가 변경되어 브라우저에서 신뢰할 수 있는 인증서로 인식하게 됩니다.
브라우저는 자동으로 새로운 인증서를 확인하고, 안전한 연결을 보장하기 위해 이를 신뢰할 수 있는 인증 기관(CA)에서 발급된 인증서인지 검증합니다.
이로 인해 사용자는 안전한 웹사이트 접속을 지속적으로 유지할 수 있습니다.
이제 여러분의 Kubernetes 클러스터에서 무료로 HTTPS를 적용할 수 있게 되었습니다.
Let's Encrypt와 CertManager 덕분에 인증서를 발급받고 관리하는 것이 매우 간편해졌습니다.
이를 통해 사용자들에게 안전하고 신뢰할 수 있는 서비스를 제공할 수 있습니다.
다음 단계에서는 Keycloak 설치부터 설정까지: SSO를 위한 첫걸음 주제로 설명하도록 하겠습니다.
완벽한 HTTPS 보안: Ingress 컨트롤러와 Let's Encrypt으로 무료 인증서 설정하기
SSO 연동 테스트: Keycloak과 애플리케이션의 완벽한 통합
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.