실제로 ingress 컨트롤러로 dog.com이라는 사이트를 만들어 볼 예정이다.
# 먼저 기본 namespace를 바꾸자.
쿠버네티스 namespace
# 기본 개념 네임스페이스는 리소스들을 분리하고 관리하는거다. 그냥 컴퓨터에서 디렉토리 같은 분류라고 보면 될 것같다. 물론 디렉토리안에 또 다른 디렉토리 넣는것처럼 네임스페이스 안에
jacobowl.tistory.com
이전에 namespace를 포스팅하면서 기본 namespace를 바꿀 수 있는걸 봤었는데 실습을 하기위해서 우리는 기본 namespace를 ingress-nginx네임스페이스로 바꿀 예정이다.
kubectl get namespace
이전 ingress설치 포스팅에서 deploy.yaml을 create해주면 ingress-nginx라는 namespace가 생성된다.
이 namespace를 기본으로 설정해줄거다.
자세한건 생략하고 아래 명령어 순서대로 치면 된다.
kubectl config set-context ingress-house --cluster=kubernetes --user kubernetes-admin --namespace=ingress-nginx
kubectl config use-context ingress-house
# deployment만들기
apiVersion: apps/v1
kind: Deployment
metadata:
name: muzzi-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
pod-deployment: muzzi
template:
metadata:
labels:
pod-deployment: muzzi
# pod_service: muzzi
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dori-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
pod-deployment: dori
template:
metadata:
labels:
pod-deployment: dori
# pod_service: dori
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
뭐이렇게 대충 muzzi-deployment와, dori-deployment를 만드는 yaml을 생성했다.
참고로 이전 포스팅에선 서비스가 select하는 라벨링과, deployment가 select하는 라벨링을 따로 해줬는데, 이렇게 하니까 ingress가 작동을 안하더라. 그래서 이번엔 service와 deployment가 모두 하나의 selector로 작용하는 pod 라벨링을 하고 진행했다. (그냥 잘보면 pod-deployment: dori, pod-deployment: muzzi로 다 해버림.. 바꾸기 귀찮아서..)
암튼 이렇게 yaml을 작성하고 create해주자.
kubectl create -f dog-deployment.yaml
# service만들기
apiVersion: v1
kind: Service
metadata:
name: muzzi
spec:
type: NodePort
selector:
pod-deployment: muzzi
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: dori
spec:
type: NodePort
selector:
pod-deployment: dori
ports:
- protocol: TCP
port: 80
targetPort: 80
위에도 설명해놨지만, 셀렉터를 pod-deployment: muzzi, pod-deployment: dori로 하나의 셀렉터-라벨링을 해줬다.
타입은 NodePort로 만들었다. 강의는 그냥 clusterIP로만든듯..
서비스의 80번 포트로 들어오면, pod들의 80번 포트로 연결되는 전형적인 웹 포트포워딩이다.
# ingress만들기
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dog-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: "dog.com"
http:
# - http:
paths:
- path: /muzzi
pathType: Prefix
backend:
service:
name: muzzi
port:
number: 80
- path: /dori
pathType: Prefix
backend:
service:
name: dori
port:
number: 80
스펙부분이 핵심인데 그림으로 보면,
위에서 service만든거에서 path에 따라서 muzzi, dori서비스로 분할된다.
host를 정해줬는데, dog.com:인그레스포트/muzzi or dog.com:인그레스포트/dori 에 따라서 서비스를 나눠주겠다는거다.
참고로 도메인으로 접속해야만 인그레스가 열린다. 만약 노드아이피로 들어오면 404뜨더라. 강의에서는 ingress address가 뜨는데.. 그래서 host로 해준거다. 암튼 이건 좀따 설명할거고..
또한 annotation도 저렇게 정해주면 된다. 아직 annotation을 공부하지 못해서 설명은 못하겠다만 적어줘야 동작된다.
ingress를 생성해주자.
kubectl create -f test-ingress.yaml
# ingress확인
kubectl get ingress
만든 ingress가 잘 뜬다.
자세한 정보를 보려면,
kubectl describe ingress dog-ingress
rules쪽을 보면 /muzzi로 들어오면 저런 세 파드들에 연결이 되고,
/dori로 들어오면 저 세 파드들에 연결된다고 한다. 뭐 그렇단다.
# 그럼 ingress가 열려있는 port는 어디야?
kubectl get svc
ingress-nginx namespace에 생성된 svc들을 확인해보면,
아까 우리가 만들었던 muzzi, dori서비스들이 생성되어있고, ingress-nginx-controller가 있다.
저기 보면 80포트에 30100포트가 열결되어있다고 한다. http가 80포트이고 https가 443이니까.. 우린 ssl인증서까진 안해놨으니 http로 접속하도록 해보자.
그렇다면 최종적으로 dog.com:30100/muzzi나, dog.com:30100/dori로 접속하면 된다.
# 네임서버 설정을 해줘야함.
아까 ingress yaml양식에서 host를 정해줬다. dog.com으로 해줬는데, 이걸 /etc/hosts쪽에 도메인으로 적용해줘야 한다.
vi /etc/hosts
저기 마스터노드 ip 211.183.3.10을 dog.com으로 해줬다.
근데 테스트해봤는데 worker node로 해도 된다. 클러스터 노드중 하나로 해줘도 어차피 ingress controller에 연결되는것 같다.
ingress/ 설치 & 개념
# 설치 사실 난 이미 다 설치해놨는데 실제로 설치할때 경로찾는게 중요할것 같아서 조금 자세하게 적어볼거다. k8s공식문서에서 ingress controller를 검색하고 저 링크로 들어간다. 그리고 저기에
jacobowl.tistory.com
이전 포스팅에서 잠깐 테스트를 해봤었다.
암튼 저렇게 dog.com을 노드아이피랑 연결해주고 테스트해보자.
++ nslookup
nslookup dog.com
이걸로 도메인에대한 ip를 확인할수 있다.
근데 cntl + C로 나오니까 계속 줄꼬여서 ssh세션 다시킴..
# 찐막 테스트
curl dog.com:30100/muzzi
/muzzi란 api로 저렇게 muzzi서비스에 연결되어 muzzi-deployment pod들에 로드밸런싱이 잘 되는것까지 확인된다.
curl dog.com:30100/dori
도리서비스도 잘 된다.
# 아이피로는 안돼?
kubectl get ingress
ingress정보를 보면, ADDRESS컬럼이 211.183.3.30으로 되어있다.
그럼 dog.com대신에 저 아이피로 접속해보면 될까?
curl 211.183.3.30:30100/muzzi
404뜬다.. ㅠ
그래서 난 host를 정해줘서 그런줄 알고 host없는 ingress를 새로 만들어서 테스트를 해봤다.
일단 기존 host있는 ingress를 제거하고..
kubectl delete ingress dog-ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dog-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
# kubernetes.io/ingress.class: "nginx"
status:
loadBalancer:
ingress:
- ip: 211.183.3.10
spec:
rules:
# - host: "dog.com"
- http:
# - http:
paths:
- path: /muzzi
pathType: Prefix
backend:
service:
name: muzzi
port:
number: 80
- path: /dori
pathType: Prefix
backend:
service:
name: dori
port:
number: 80
아까 host를 dog.com으로 정해줬던 ingress yaml대신, 그냥 rules필드에 http로 시작하는 yaml로 ingress를 생성해보았다.
kubectl create -f test-nohost-ingress.yaml
이러니까 시발 ADDRESS가 안뜬다.. 저걸알아야 접속을 할텐데..
대충 노드 하나 잡고 접속해보려해도 404뜬다.
사실 가장 이상적인게 vm이 nat대역 네트워크를 쓰니, 윈도우 브라우저에서 접속하는걸테지만 윈도우에서 도메인바꾸는건 귀찮기도 해서.. 걍 노드 하나 잡아서 테스트해본거다..
강의에선 두번째 host없는 ingress로 잘만 실행되고 테스트 되던데 난 안되더라.. 방법 찾고찾아서 host있는걸 찾아봤다.
뭐가문제인지 찾아봤지만 gpt도 모르고.. 강의가 옛날강의라그런지, 도메인요청으로 안하고 직접 ip로 요청하면 ingress가 보안상 막아둔건지, 걍 내가 몰라서 못찾는건지 모르겠지만 뭐.. 암튼 ㅠ
슬푸다
'k8s > concept' 카테고리의 다른 글
nodeLabels & annotation (0) | 2023.12.14 |
---|---|
labels (0) | 2023.12.12 |
ingress/ 설치 & 개념 (0) | 2023.12.11 |
service/ headless service (0) | 2023.12.07 |
service/ k8s의 dns구성, service type> externalName (0) | 2023.12.06 |