내 경우 참고 사이트에 있는 영상으로 해서 어떻게 ingress가 돌아가는지 파악하였다.
🪄 실습 환경
- master node 1개(192.168..16.10)
- worker node 1개(192.168..16.101)
실습하기
1) deployment, service 생성하기
kubectl create deploy nginx --image=nginx
이름이 nginx이고, 이미지는 nginx를 기반으로 생성해주었다.
kubectl expose deploy nginx --type=NodePort --port=80 --target-port=80
생성되어 있는 deployment nginx를 기반으로 하여 type은 Nodeport로 하고 port는 80으로 지정해준다.
kubectl get svc
서비스가 잘 생성되었는지 확인하고 지정된 port번호를 가지고 잘 들어가지는 확인해준다.
마스터 노드의 ip와 포트 번호를 넣어 잘 들어가지는지 확인해주었다.
2) Nginx-ingress controller 설치하기
kubectl apply -f <https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.1/deploy/static/provider/cloud/deploy.yaml>
k8s의 버전에 따라 controller의 버전의 호환이 달라지므로 이를 확인해주고 설치해준다.
💡 ingress-nginx-controller의 type을 NodePort로 설정해준다.반응형
여기서 type을 NodePort로 해주는 이유는 LoadBalancer를 사용할 수 없기 때문이다. 지금 클라우드가 띄워진 환경이 아니라 일반적인 환경으로 ingress-nginx를 구성하고 있기에 loadBalancer를 사용할 수 없다. 그러므로 Nodeport로 지정하여 다음 단계를 진행한다.
ingress-nginx controller가 제대로 설치되었다면 namespace가 있는지 확인하고, 이후에 service도 제대로 설치되었는지 확인해준다.
kubectl get namespace
kubectl get all -n ingress-nginx
ingress-nginx-controller가 running상태이면 제대로 설치된 것이 많다. 만약 설치가 안되고 crashloopbackoff가 뜬다면 잘못 된 것이므로 제일 먼저 버전을 확인해볼 것을 추천한다.
3) ingress 생성하기
vim ingress.yaml
yaml 파일을 생성해주도록 한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: "foo.bar.com"
http:
paths:
- path: /abc
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
kubectl apply -f ingress.yaml -n ingress-nginx
생성된 ingress.yaml파일을 적용해주도록 한다. 그리고 나서 host에 지정한 주소로 들어가면 들어가게끔 해줘야 한다.
💡 리눅스: /etc/hosts, 윈도우: c:\Windows\System32\Drivers\etc\hosts
리눅스에서 접속해볼려면 /etc/hosts에 들어가 ip주소와 호스트 이름 지정해준다. 윈도우에서도 마찬가지로 지정해준다.
4) 접속하기
리눅스에서 접속하려면 위에서 지정한 host ip와 port번호로 들어가면 된다.
port번호는
kubectl get svc -n ingress-nginx
로 하여 controller의 포트번호를 확인할 수 있다. 나의 경우 port를 80으로 지정해놓았기에 이에 맞는 포트번호는 31892이다.
curl <hostip>:<포트번호>
위의 command같이 입력하면 제대로 접속이 되었다면 아래와 같이 나온다.
추가)
path를 설정했는데도 불구하고 접속하면 되지 않았다. 참고사이트 address없음으로 해결하였다.
1) ingress 확인하기
kubectl get ingress -n ingress-nginx
ingress 목록을 확인해준다. 아래와 같이 address가 없다면 아래의 순서대로 하면 address가 맵핑된다.
2) ingress-class 값 찾기
kubectl describe deploy ingress-nginx-controller -n ingress-nginx | grep ingress-class
namespace ingress-nginx에서 ingress-nginx-controller를 확인한다. 여기서 ingress-class를 확인할 수 있다.
ingress-class가 nginx임을 알 수 있다.
3) service의 clusterIp 확인하기
kubectl get svc -n ingress-nginx
ingress-nginx 서비스를 확인해준다. 여기서 ingress-nginx-controller clusterip를 확인해준다.
내 경우 10.102.197.140임을 확인할 수 있었다.
4) ingress 파일 수정하기
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx # <----------반영하기
rules:
- host: foo.bar.com
http:
paths:
- path: /abc
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
status:
loadBalancer:
ingress:
- ip: 10.102.197.140 # <----------반영하기
위에서 알게 된 ingressclassname과 clusterip를 ingress.yaml파일에 수정해준다.
5) 수정사항 반영하기
kubectl apply -f ingress.yaml -n ingress-nginx
위와 같이 address가 반영됨을 알 수 있다. ingress.yaml파일에 설정한 path도 잘 먹는 것을 확인할 수 있다.
👇🏻 참고사이트
https://malwareanalysis.tistory.com/91
https://5equal0.tistory.com/entry/Kubernetes-Nginx-Ingress-Controller