728x90
쿠버네티스(Kubernetes)에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법
Ingress Controller는 클러스터 외부의 HTTP/HTTPS 요청을 클러스터 내부의 서비스로 라우팅하는 역할을 합니다.
1. Ingress Controller 설치
NGINX를 웹 서비스로 배포하고 Ingress Controller를 사용하여 외부에서 접근할 수 있도록 합니다.
NGINX Ingress Controller 배포
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-mlftk 0/1 Completed 0 2m45s
ingress-nginx-admission-patch-479c6 0/1 Completed 1 2m45s
ingress-nginx-controller-54cf9c8856-h2wpg 1/1 Running 0 2m45s
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.109.46.206 <none> 80:32551/TCP,443:30242/TCP 2m25s
ingress-nginx-controller-admission ClusterIP 10.104.139.145 <none> 443/TCP 2m25s
2. NGINX 웹 서버 배포
NGINX 웹 서버를 쿠버네티스 클러스터에 배포하고 Ingress를 통해 접근할 수 있도록 설정합니다.
NGINX Deployment 생성
vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
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
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 2/2 2 2 74s
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-576c6b7b6-nkkpl 1/1 Running 0 94s
nginx-576c6b7b6-wzpzv 1/1 Running 0 94s
또는
kubectl get pods -o wide
NGINX Service 생성
vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30002 # 노드의 30002 포트를 사용
Service 적용
kubectl apply -f nginx-service.yaml
서비스 상태 확인
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h49m
nginx-service NodePort 10.109.201.123 <none> 80:30002/TCP 23m
3. Ingress 리소스 설정
Ingress 리소스를 설정하여 외부에서 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-service
port:
number: 80
Ingress 리소스 적용
kubectl apply -f nginx-ingress.yaml
Ingress 리소스 상태 확인
kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
nginx-ingress <none> nginx.local 80 22m
3. 외부 접근 설정
온프레미스 환경에서 Ingress Controller의 외부 접근을 설정합니다.
서비스 타입 확인
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.109.46.206 <none> 80:32551/TCP,443:30242/TCP 6m59s
ingress-nginx-controller-admission ClusterIP 10.104.139.145 <none> 443/TCP 6m59s
서비스 타입 변경(선택 사항)
- 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>
참고URL
- Kubernetes github : Ingress-Nginx Controller(Bare-metal)
- Kubernetes Documentation : Ingress
kubectl은 svc ingress-nginx-controller -n ingress-nginx를 얻습니다.
728x90
'리눅스' 카테고리의 다른 글
[draft] 우분투에 쿠버네티스 싱글 노드를 구성하는 방법 (0) | 2024.08.20 |
---|---|
[draft] 쿠버네티스 클러스터에서 Worker Node를 재기동하는 방법 (0) | 2024.08.19 |
[draft] 쿠버네티스 클러스터에서 Control Plane을 새로운 노드로 교체하는 방법 (0) | 2024.08.16 |
[draft] 쿠버네티스 워커 노드를 설치하고 클러스터에 참여시키기 (0) | 2024.08.14 |
[draft] Cilium CLI를 사용해 Cilium을 설치하는 방법 (0) | 2024.08.14 |