벌처 쿠버네티스 엔진 초기 세팅 (2) - 로드밸런서 세팅, 서트매니저 세팅
```
VKE 초기 세팅 (2) - LoadBalancer 세팅, CertManager 세팅
```
이번 글을 통해 배워갈 내용
- Heml Chart 설치
- Helm 설치
- VKE에 Load Balancer 세팅
- pod, svc, ingress 세팅
- VKE에 Cert Manager 세팅
1. 개요
저번 글에 이어서
이번에는 VKE에 Load Balancer 및 Cert Manager 세팅을 해보겠습니다
이번 글에서도 윈도우 파워쉘에서 VKE에 접속해서 진행합니다.
VKE 접근 및 기초 세팅 파트 1 링크
https://codemasterkimc.tistory.com/725
2. Helm 설치
Helm 설명
Helm은 Kubernetes에서 애플리케이션을 더 쉽게 배포하고 관리할 수 있도록 돕는 패키지 관리 도구입니다. 소프트웨어 패키지를 "차트"라고 부르며, 차트에는 애플리케이션의 모든 설정 파일과 리소스 정의가 포함되어 있습니다. 이를 통해 복잡한 Kubernetes 설정을 단순화하고, 여러 환경에서 일관된 배포를 보장하며, 쉽게 업데이트하거나 롤백할 수 있습니다. 마치 Kubernetes의 앱스토어와 같은 역할을 합니다.
Helm을 Windows에 설치합니다. (winget 을 사용했습니다)
winget install Helm.Helm
Helm이 설치되었는지 확인하고 버전을 출력합니다.
helm version
Helm을 최신 버전으로 업그레이드합니다.
winget upgrade Helm.Helm
3. LoadBalancer 세팅
LoadBalancer 설명
LoadBalancer는 Kubernetes에서 외부 트래픽을 특정 서비스로 연결하는 데 사용되는 서비스 유형입니다. 클라우드 제공업체와 통합되어 외부 IP를 자동으로 프로비저닝 하고, 클러스터 외부에서 앱에 접근할 수 있게 합니다. 사용자는 LoadBalancer를 통해 애플리케이션을 인터넷에 쉽게 노출할 수 있으며, 트래픽을 서비스의 여러 파드로 자동 분산하여 가용성과 성능을 높입니다.
helm을 사용해서 ingress-nginx를 설치
helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
(설치 시 VKE의 경우 2024년 12월 기준 월 10달러 과금이 시작됩니다)
(ingress-nginx namespace 도 생성됩니다)
추후 업그레이드 시 아래 명령어를 사용합니다
helm upgrade --reuse-values ingress-nginx ingress-nginx/ingress-nginx
4. pod, svc, ingress 세팅
Nginx Ingress
설명
NGINX Ingress는 Kubernetes에서 외부 트래픽을 클러스터 내부의 서비스로 라우팅 하는 역할을 하는 컨트롤러입니다. HTTP 및 HTTPS 요청을 처리하며, Ingress 리소스에 정의된 규칙에 따라 요청을 적절한 서비스로 전달합니다. 이를 통해 하나의 IP와 도메인으로 여러 서비스에 접근할 수 있도록 해주며, 로드 밸런싱, 인증, TLS 종료 같은 기능을 제공합니다. 클라우드나 온프로미스 환경에서 모두 사용 가능합니다.
먼저 접근할 pod 를 생성하겠습니다
nginx로 만든 app에 접근한다고 가정합니다.
namespace를 생성합니다
kubectl create namespace sample
pod를 생성하기 위해서
nginx-sample-server.yaml 파일을 만듭니다
apiVersion: v1
kind: Pod
metadata:
name: nginx-secure # Pod의 이름
namespace: sample # Pod가 속할 네임스페이스
labels:
app: nginx # Pod에 적용되는 레이블, 애플리케이션 이름
spec:
containers:
- name: nginx # 컨테이너 이름
image: nginx:stable # 사용할 NGINX 이미지 (stable 버전)
ports:
- containerPort: 80 # 컨테이너에서 노출할 포트
securityContext: # 컨테이너의 보안 설정
runAsUser: 1000 # 비루트(non-root) 사용자 ID로 실행
runAsGroup: 1000 # 비루트(non-root) 그룹 ID로 실행
runAsNonRoot: true # 컨테이너가 루트 사용자로 실행되지 않도록 보장
capabilities:
drop:
- ALL # 불필요한 Linux capabilities를 모두 제거
readOnlyRootFilesystem: true # 루트 파일 시스템을 읽기 전용으로 마운트
volumeMounts: # 컨테이너 내부에 마운트할 볼륨
- name: nginx-cache
mountPath: /var/cache/nginx # 캐시를 저장할 경로
- name: nginx-run
mountPath: /var/run # 임시 데이터를 저장할 경로
securityContext: # Pod의 보안 설정
fsGroup: 1000 # 마운트된 볼륨에 접근할 그룹 ID 설정
volumes: # Pod에서 사용할 볼륨 정의
- name: nginx-cache
emptyDir: # 임시 쓰기 가능한 볼륨
medium: "Memory" # 메모리를 사용하여 성능 향상 (옵션)
- name: nginx-run
emptyDir: # /var/run용 임시 쓰기 가능한 볼륨
restartPolicy: Always # Pod가 항상 재시작되도록 설정
위에 파일로 nginx-secure pod를 생성합니다.
kubectl apply -f nginx-sample-server.yaml
nginx-secure pod 를 연결한 nginx-secure-service 서비스를 생성합니다.
kubectl expose pod nginx-secure `
--type=ClusterIP `
--name=nginx-secure-service `
--port=80 `
--target-port=80 `
--namespace=sample
example-ingress.yaml 을 생성합니다.
nginx-sample-server 서비스를 연결하는 ingress입니다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: sample
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: example.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-secure-service
port:
number: 80
적용합니다.
kubectl apply -f example-ingress.yaml
가비아, 고대디 같은 곳에서 구입한 도메인을 연결해 주거나 ip 주소로 접근해서
확인이 가능합니다.
5. CertManager Setting
CertManager
CertManager는 Kubernetes에서 인증서를 자동으로 생성, 갱신, 관리하는 도구입니다. Let's Encrypt와 같은 인증 기관(ACME)을 사용해 TLS 인증서를 쉽게 발급받을 수 있으며, Ingress 리소스와 통합하여 HTTPS를 간편하게 설정할 수 있습니다. 인증서 갱신 작업을 자동화해 수동 작업을 줄이고 보안성을 높이며, Secret으로 저장된 인증서를 애플리케이션에 제공하여 안전하게 사용할 수 있습니다.
먼저 Cert-Manager CRDs를 설치해 줍니다.
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.crds.yaml
namespace를 생성합니다
kubectl create namespace cert-manager
Cert-Manager Helm 저장소를 추가해 줍니다
helm repo add jetstack https://charts.jetstack.io
helm repo update
Cert-Manager 설치
helm install cert-manager jetstack/cert-manager `
--namespace cert-manager `
--version v1.13.0
확인
kubectl get pods -n cert-manager
cluster-issuer.yaml 파일을 생성
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# 이메일 주소를 본인의 것으로 변경하세요.
email: your-email@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
적용
kubectl apply -f cluster-issuer.yaml
ingress 파일 수정 및 적용
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
namespace: default
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- your-domain.com
secretName: your-domain-tls
rules:
- host: your-domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 80
적용
kubectl delete -f example-ingress.yaml
kubectl apply -f example-ingress.yaml
Reference
https://github.com/vultr/cert-manager-webhook-vultr
읽어주셔서 감사합니다
무엇인가 얻어가셨기를 바라며
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
참조 및 인용
'DevOps > Kubernetes' 카테고리의 다른 글
VKE 초기 세팅 (1) - 윈도우 PowerShell에서 VKE 접근 방법 (0) | 2024.12.01 |
---|---|
[Kubernetes] Kubernetes etcd backup 과 restore 설명과 실습 (0) | 2024.10.09 |
[Kubernetes] Kubernetes CRD 와 CR 설명과 실습 (1) | 2024.09.20 |
[Kubernetes] Kubernetes Configmap 설명과 실습 (0) | 2024.09.19 |
[Kubernetes] Kubernetes Taints,Toleration and affinity 설명과 실습 (0) | 2024.09.18 |