GCE의 네티워크 관련 제약을 피하기 위해 Local 환경에서 서비스 구축
#아래 명령어로 cilium에서 찾을 수 없는 pod의 node를 알 수 있다
kubectl get pods -n kube-system
# cilium status
Errors: cilium cilium-hvwnn unable to retrieve cilium status:
unable to upgrade connection: pod does not exist
# curl -v <POD, SVC IP>
rror from server (NotFound): the server could not find the requested resource
( pods/log react-js-deployment-78d56f6774-dftcw)
위에 나열된 것 이외에도 kubectl logs로 pod에 접근이 불가하다
이는 kube-system 네임스페이스의 cilium pod와 deploy를 통해 생성한 pod에 접근할 수 없어서 발생하는 문제이기 때문에
master 노드처럼 VM의 네트워크 설정이 NAT로 설정되어서 포트포워딩 문제 발생
이를 해결하기 위해서는 브리지로 바꿔주어야 worker 노드로 접근이 가능하다
https://forums.virtualbox.org/viewtopic.php?t=58859
Ingress로 Frontend의 SVC를 연결하고 External IP를 할당해야 함
nginx-ingress-controller를 설치할 경우 기본적으로 오브젝트들의 라벨명이 ingress-nginx로 되어있다.
따라서 사용자가 배포할 Ingress의 이름을 기본적으로 ingress-nginx로 해주어야 매핑이 된다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: docker-full.com
http:
paths:
- path: /react
pathType: Prefix
backend:
service:
name: react-js-service
port:
number: 80
- path: /node
pathType: Prefix
backend:
service:
name: node-js-service
port:
number: 80
이후 도메인 네임을 사용하기 위해 /etc/hosts에 아래와 같이 추가한다
# kubectl describe ingress ingress-nginx
Name: ingress-nginx
Labels: <none>
Namespace: default
Address: 10.0.2.15
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
docker-full.com
/react react-js-service:3000 (10.0.2.184:3000)
/node node-js-service:5000 (10.0.2.33:5000)
Annotations: kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 9m (x2 over 10m) nginx-ingress-controller Scheduled for sync
# /etc/hosts
10.0.2.15 docker-full.com
VM내부 브라우저 및 curl을 통해서 ingress가 도에민으로 생성된 것을 볼 수 있다
이때 ingress-nginx 서비스의 포트로 접근하면 접속되는 것을 볼 수 있다
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort x.x.x.x <none> 80:32201/TCP,443:30808/TCP 3d
ingress-nginx-controller-admission ClusterIP x.x.x.x <none> 443/TCP 3d
VM에서 접근이 가능한 것으로 보아 ingress는 성공적으로 생성됨
하지만 svc에 ping을 날리거나 curl을 통해서 접근하지 못하는 문제 발생
# pod에 직접적으로 접근해서 localhost로 React 앱이 구동되는 것은 확인
kubectl exec -it react-js-deployment-78d56f6774-s6gmv -- bash
curl localhost:3000
다음 5개의 단계에 따라서 문제에 접근하였다
apiVersion: v1
kind: Service
metadata:
name: react-js-service
spec:
type: NodePort
selector:
app: react-js
ports:
- protocol: TCP
port: 3000
targetPort: 3000
이후 node port IP로 접근했을 때 응답이 오지 않고 멈춰있는 문제 발생
# Port Forwarding 이후 브라우저 접근
# Deployment port forwarding
kubectl port-forward deploy/react-js-deployment 3000:3000
# Service port forwarding
kubectl port-forward service/react-js-service 3000:3000
# Endpoint 가져오기
kubectl get ep
# Routing Table
route
traceroute
# Domain Service
kubectl get ds -n kube-system
#ingress-nginx 로깅
# ingress-nginx의 pod에 ingress 관련 로그가 존재함
kubectl get pod -n ingress-nginx
kubectl logs ingress-nginx-controller-855dc99c4-m9hl7 -n ingress-nginx
현재 node port IP로 접근하지 못하고 패킷이 누락되는 이유는
kube-proxy와 cilium 사이의 충돌로 예상됨
따라서 아래와 같이 kube-proxy를 제거하고 각 노드의 iptable을 초기화
iptables-save | grep -v KUBE | iptables-restore
하지만 조금 더 원활한 개발을 위해서 flannel을 사용하는 것이 효과적