쿠버네티스(Kubernetes)에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법
Kubernetes Ingress는 HTTP(S) 트래픽을 클러스터 내의 서비스로 라우팅하는 강력한 방법입니다. Ingress를 설정하면 하나의 IP 주소 또는 도메인 이름을 통해 여러 서비스를 관리할 수 있습니다. Ingress를 사용하려면 Ingress Controller를 설치하고 Ingress 리소스를 정의하여 외부 트래픽을 적절한 서비스로 전달할 수 있습니다.
1. Ingress Controller 설치
Ingress Controller는 Ingress 리소스의 정의를 실제 트래픽 라우팅으로 변환해주는 역할을 합니다. 대표적인 Ingress Controller로는 NGINX Ingress Controller가 있습니다.
NGINX Ingress Controller 설치
NGINX Ingress Controller 배포
- cloud
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
- baremetal
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/baremetal/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
Ingress Controller 상태 확인
- ingress-nginx-controller 파드가 Running 상태인지 확인하고 EXTERNAL-IP가 할당된 LoadBalancer 서비스의 외부 IP 주소를 확인합니다.
kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-2lbd5 0/1 Completed 0 83s
ingress-nginx-admission-patch-gv4tw 0/1 Completed 0 83s
ingress-nginx-controller-7d4db76476-p7cjh 1/1 Running 0 83s
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.109.67.167 <pending> 80:31119/TCP,443:30372/TCP 107s
ingress-nginx-controller-admission ClusterIP 10.109.245.96 <none> 443/TCP 106s
2. NGINX 웹 서버 테스트 파드 및 서비스 배포
NGINX 웹 서버를 쿠버네티스 클러스터에 배포하고 Ingress를 통해 접근할 수 있도록 설정합니다.
NGINX Deployment 생성
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Deployment 적용
kubectl apply -f nginx-deployment.yaml
배포 상태 확인
kubectl get deployments
kubectl get pods
또는
kubectl get pods -o wide
NGINX Service 생성
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
Service 적용
kubectl apply -f nginx-service.yaml
서비스 상태 확인
kubectl get services
3. Ingress 리소스 설정
Ingress 리소스를 설정하여 외부에서 NGINX 서비스에 접근할 수 있도록 합니다.
nginx.local 도메인으로 들어오는 HTTP 요청을 nginx 서비스로 라우팅합니다.
Ingress 리소스 생성
vim nginx-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: nginx.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
Ingress 리소스 적용
kubectl apply -f nginx-ingress.yaml
Ingress 리소스 상태 확인
kubectl get ingress
3. 외부 접근 설정
온프레미스 환경에서 Ingress Controller의 외부 접근을 설정합니다.
서비스 타입 확인
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.103.80.149 <pending> 80:30552/TCP,443:32662/TCP 6m
ingress-nginx-controller-admission ClusterIP 10.110.126.222 <none> 443/TCP 6m
서비스 타입 변경
- ingress-nginx-controller 서비스의 타입을 NodePort로 변경합니다.
kubectl edit svc ingress-nginx-controller -n ingress-nginx
NodePort 확인
- 변경된 서비스의 NodePort를 확인합니다.
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.103.80.149 <none> 80:30552/TCP,443:32662/TCP 6m56s
ingress-nginx-controller-admission ClusterIP 10.110.126.222 <none> 443/TCP 6m56s
Ingress Controller의 External IP 설정
NodePort 또는 LoadBalancer 사용
- Ingress Controller의 서비스가 LoadBalancer 또는 NodePort로 설정되어 있어야 외부에서 접근할 수 있습니다.
- EXTERNAL-IP가 <pending>상태일 수 있습니다. NodePort로 설정되어 있어야 외부에서 접근할 수 있습니다.
kubectl get svc -n ingress-nginx
NodePort 확인
- NodePort를 확인하여 외부에서 접근할 수 있는 포트를 확인합니다.
- PORT(S) 항목에서 80:<NodePort>/TCP와 같은 형식으로 NodePort가 할당된 것을 확인합니다.
kubectl get svc ingress-nginx-controller -n ingress-nginx
로컬 DNS 설정
호스트 파일 수정
- 로컬 시스템에서 /etc/hosts 파일을 수정하여 도메인 이름을 클러스터의 노드 IP로 매핑합니다.
- <NodeIP>는 클러스터 노드의 IP 주소입니다.
echo "<NodeIP> nginx.local" | sudo tee -a /etc/hosts
echo "$(hostname -I | grep -o '192.168.0.[0-9]\{1,3\}') nginx.local" | sudo tee -a /etc/hosts
웹 브라우저 테스트
- 브라우저에서 http://nginx.local으로 접근하여 NGINX 웹 서버의 페이지가 표시되는지 확인합니다.
http://nginx.local
파드 내부에서 쉘을 실행하여 명령어 실행
nginx 파드 목록 조회
kubectl get pods -l app=nginx
NAME READY STATUS RESTARTS AGE
nginx-576c6b7b6-l5qlx 1/1 Running 0 26m
nginx-576c6b7b6-mmrlc 1/1 Running 0 26m
또는
kubectl get pods -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-576c6b7b6-l5qlx 1/1 Running 0 56m 10.0.3.87 k8s-worker1 <none> <none>
nginx-576c6b7b6-mmrlc 1/1 Running 0 56m 10.0.3.235 k8s-worker1 <none> <none>
curl -fsSL http://10.0.3.87
파드 내부에서 여러 명령어를 실행하고자 한다면 파드 내에서 쉘을 실행할 수 있습니다.
kubectl exec -it <pod-name> -- /bin/sh
kubectl exec -it nginx-576c6b7b6-l5qlx -- /bin/bash
curl localhost
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
'리눅스' 카테고리의 다른 글
Kubernetes CNI 플러그인과 특징 비교 (0) | 2024.08.21 |
---|---|
우분투에 쿠버네티스 싱글 노드를 구성하는 방법 (0) | 2024.08.19 |
쿠버네티스 클러스터에서 노드를 새로운 노드로 교체하는 방법 (0) | 2024.08.16 |
쿠버네티스 워커 노드를 설치하고 클러스터에 참여시키기 (0) | 2024.08.16 |
쿠버네티스 클러스터에서 노드를 재기동하는 방법 (0) | 2024.08.16 |