쿠버네티스 Web - 2

SangYeon Min·2023년 11월 9일
0

STUDY-K8s

목록 보기
4/7
post-thumbnail

Local Kubernetes 환경 웹 서버 구축

GCE의 네티워크 관련 제약을 피하기 위해 Local 환경에서 서비스 구축

Cilium, deployment pod does not exist

#아래 명령어로 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

Fullstack web 모식도

Ingress Service

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


https://velog.io/@dhkim1522

SVC 접근 불가 Trouble Shooting

ClusterIP vs NodePort vs LoadBalancer

VM에서 접근이 가능한 것으로 보아 ingress는 성공적으로 생성됨
하지만 svc에 ping을 날리거나 curl을 통해서 접근하지 못하는 문제 발생

# pod에 직접적으로 접근해서 localhost로 React 앱이 구동되는 것은 확인
kubectl exec -it react-js-deployment-78d56f6774-s6gmv -- bash
curl localhost:3000

다음 5개의 단계에 따라서 문제에 접근하였다

  1. Service Type 확인
    react-js-service의 type이 LoadBalancer로 설정되어 있기 때문에 External IP 확인
  2. Firewall 설정
    만약 LoadBalancer의 external IP가 할당되었다면, 해당 IP와 포트(3000)에 대한 방화벽 설정을 확인
  3. Node의 네트워크 상태 확인
    각 노드 간에 통신이 원활한지 ping읕 통해 확인
  4. DNS 확인: DNS 설정이나 호스트 파일에 이상이 없는지 확인
  5. ClusterIP와 Pod IP의 연결 확인
    kubectl get endpoints react-js-service 명령어를 사용해서 ClusterIP와 실제 Pod IP들이 제대로 연결되어 있는지 확인하는데 이는 로드 밸런서의 External IP 할당이 클라우드 프로바이더에 의존하기 때문에, VirtualBox에서는 이 기능을 지원하지 않을 수 있기 때문에 로컬 환경에서는 대개 NodePort나 Ingress 등을 사용하여 SVC를 NodePort로 재설정
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로 접근했을 때 응답이 오지 않고 멈춰있는 문제 발생

Ingress, Deployment, SVC Trouble Shooting

# 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을 사용하는 것이 효과적

0개의 댓글