Ssoon

[7주차] Service Mesh : Istio 통한 외부 노출 본문

쿠버네티스 네트워크 스터디 3기

[7주차] Service Mesh : Istio 통한 외부 노출

구구달스 2024. 10. 15. 21:05
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

✅ Nginx 디플로이먼트와 서비스 배포

🧿 Nginx 웹 서버 배포; ClusterIP 서비스 생성

(⎈|default:N/A) root@k3s-s:~# cat <<EOF | kubectl create -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-websrv
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deploy-websrv
  template:
    metadata:
      labels:
        app: deploy-websrv
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: deploy-websrv
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-clusterip
spec:
  ports:
    - name: svc-webport
      port: 80
      targetPort: 80
  selector:
    app: deploy-websrv
  type: ClusterIP
EOF
deployment.apps/deploy-websrv created
service/svc-clusterip created

🧿 각 리소스(Pod, Service, Endpoints) 확인

  • service/kubernetes는 Kubernetes API 서버에 대한 기본 서비스이고, service/svc-clusterip는 사용자 정의 서비스입니다.
  • CLUSTER-IP: 10.10.200.183은 서비스의 내부 IP 주소입니다. 이 IP를 통해 클러스터 내의 다른 Pod가 이 서비스에 접근할 수 있습니다.
  • ENDPOINTS: 172.16.0.6:80은 이 서비스가 172.16.0.6 IP를 가진 Pod의 80번 포트로 요청을 보낼 수 있음을 나타냅니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get pod,svc,ep -o wide
NAME                                 READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
pod/deploy-websrv-7d7cf8586c-7kz4n   2/2     Running   0          17s   172.16.0.6   k3s-s   <none>           <none>

NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR
service/kubernetes      ClusterIP   10.10.200.1     <none>        443/TCP   106m   <none>
service/svc-clusterip   ClusterIP   10.10.200.183   <none>        80/TCP    17s    app=deploy-websrv

NAME                      ENDPOINTS            AGE
endpoints/kubernetes      192.168.10.10:6443   106m
endpoints/svc-clusterip   172.16.0.6:80        17s

🧿 Pod 의 정보를 확인

  • Init Container
    • istio-init Init Container는 Istio 프록시가 올바르게 설정되고 작동할 수 있도록 하기 위한 초기화 작업을 수행합니다. 이 작업은 다음과 같은 기능을 포함합니다:
      • Istio의 iptables 설정을 통해 네트워크 트래픽을 관리하고,
      • Istio 프록시가 사용할 포트와 인터페이스를 설정하여,
      • 초기화 작업이 완료된 후 메인 컨테이너가 실행될 수 있도록 합니다.

  • istio-proxy
    • proxy:
      • 이 명령은 Istio의 프록시 모드를 활성화합니다. 이는 트래픽 관리와 라우팅을 수행합니다.
    • sidecar:
      • 이 플래그는 컨테이너가 사이드카 프록시로 실행됨을 나타냅니다. 사이드카는 애플리케이션의 네트워크 요청을 중계하고 제어합니다.
    • --domain $(POD_NAMESPACE).svc.cluster.local:
      • 이 옵션은 서비스 도메인을 설정합니다. $(POD_NAMESPACE)는 현재 Pod의 네임스페이스를 참조하여, 서비스 DNS를 구성하는 데 사용됩니다. 이는 애플리케이션이 서로를 찾을 수 있도록 돕습니다.
    • --proxyLogLevel=warning:
      • 이 옵션은 프록시 로그의 출력 수준을 설정합니다. 여기서는 warning으로 설정되어 있어 경고 수준 이상의 로그만 기록됩니다.
    • --proxyComponentLogLevel=misc:error:
      • 이 옵션은 특정 구성 요소의 로그 수준을 설정합니다. misc:error는 일반적인 구성 요소의 오류 로그를 기록하도록 설정합니다.
    • --log_output_level=default:info:
      • 이 옵션은 기본 로그 출력 수준을 설정합니다. info 수준의 로그는 일반적인 정보성 메시지를 포함합니다.
(⎈|default:N/A) root@k3s-s:~# kc describe pod
Name:             deploy-websrv-7d7cf8586c-7kz4n
Namespace:        default
Priority:         0
Service Account:  default
Node:             k3s-s/192.168.10.10
Start Time:       Tue, 15 Oct 2024 20:48:46 +0900
Labels:           app=deploy-websrv
                  pod-template-hash=7d7cf8586c
                  security.istio.io/tlsMode=istio
                  service.istio.io/canonical-name=deploy-websrv
                  service.istio.io/canonical-revision=latest
Annotations:      istio.io/rev: default
                  kubectl.kubernetes.io/default-container: deploy-websrv
                  kubectl.kubernetes.io/default-logs-container: deploy-websrv
                  prometheus.io/path: /stats/prometheus
                  prometheus.io/port: 15020
                  prometheus.io/scrape: true
                  sidecar.istio.io/status:
                    {"initContainers":["istio-init"],"containers":["istio-proxy"],"volumes":["workload-socket","credential-socket","workload-certs","istio-env...
Status:           Running
IP:               172.16.0.6
IPs:
  IP:           172.16.0.6
Controlled By:  ReplicaSet/deploy-websrv-7d7cf8586c
Init Containers:
  istio-init:
    Container ID:  containerd://42896dd0f0028b0230db6bae236a4ea2ebc40b09b153a5103bea9ac2f86be28a
    Image:         docker.io/istio/proxyv2:1.23.2
    Image ID:      docker.io/istio/proxyv2@sha256:2876cfc2fdf47e4b9665390ccc9ccf2bf913b71379325b8438135c9f35578e1a
    Port:          <none>
    Host Port:     <none>
    Args:
      istio-iptables
      -p
      15001
      -z
      15006
      -u
      1337
      -m
      REDIRECT
      -i
      *
      -x

      -b
      *
      -d
      15090,15021,15020
      --log_output_level=default:info
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Tue, 15 Oct 2024 20:48:47 +0900
      Finished:     Tue, 15 Oct 2024 20:48:47 +0900
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     2
      memory:  1Gi
    Requests:
      cpu:        10m
      memory:     40Mi
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qhnsh (ro)
Containers:
  deploy-websrv:
    Container ID:   containerd://fceb8ca5abbbf35e54202bbe421d4f4b443024d6453de08f5f9cd0f5493f1213
    Image:          nginx:alpine
    Image ID:       docker.io/library/nginx@sha256:2140dad235c130ac861018a4e13a6bc8aea3a35f3a40e20c1b060d51a7efd250
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 15 Oct 2024 20:48:53 +0900
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qhnsh (ro)
  istio-proxy:
    Container ID:  containerd://ffbef82d77e98b656f422a05cc0536dc9b954ac334ffc9e0009d22f400fa6547
    Image:         docker.io/istio/proxyv2:1.23.2
    Image ID:      docker.io/istio/proxyv2@sha256:2876cfc2fdf47e4b9665390ccc9ccf2bf913b71379325b8438135c9f35578e1a
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
      proxy
      sidecar
      --domain
      $(POD_NAMESPACE).svc.cluster.local
      --proxyLogLevel=warning
      --proxyComponentLogLevel=misc:error
      --log_output_level=default:info
    State:          Running
      Started:      Tue, 15 Oct 2024 20:48:53 +0900
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     2
      memory:  1Gi
    Requests:
      cpu:      10m
      memory:   40Mi
    Readiness:  http-get http://:15021/healthz/ready delay=0s timeout=3s period=15s #success=1 #failure=4
    Startup:    http-get http://:15021/healthz/ready delay=0s timeout=3s period=1s #success=1 #failure=600
    Environment:
      PILOT_CERT_PROVIDER:           istiod
      CA_ADDR:                       istiod.istio-system.svc:15012
      POD_NAME:                      deploy-websrv-7d7cf8586c-7kz4n (v1:metadata.name)
      POD_NAMESPACE:                 default (v1:metadata.namespace)
      INSTANCE_IP:                    (v1:status.podIP)
      SERVICE_ACCOUNT:                (v1:spec.serviceAccountName)
      HOST_IP:                        (v1:status.hostIP)
      ISTIO_CPU_LIMIT:               2 (limits.cpu)
      PROXY_CONFIG:                  {}

      ISTIO_META_POD_PORTS:          [
                                         {"containerPort":80,"protocol":"TCP"}
                                     ]
      ISTIO_META_APP_CONTAINERS:     deploy-websrv
      GOMEMLIMIT:                    1073741824 (limits.memory)
      GOMAXPROCS:                    2 (limits.cpu)
      ISTIO_META_CLUSTER_ID:         Kubernetes
      ISTIO_META_NODE_NAME:           (v1:spec.nodeName)
      ISTIO_META_INTERCEPTION_MODE:  REDIRECT
      ISTIO_META_WORKLOAD_NAME:      deploy-websrv
      ISTIO_META_OWNER:              kubernetes://apis/apps/v1/namespaces/default/deployments/deploy-websrv
      ISTIO_META_MESH_ID:            cluster.local
      TRUST_DOMAIN:                  cluster.local
    Mounts:
      /etc/istio/pod from istio-podinfo (rw)
      /etc/istio/proxy from istio-envoy (rw)
      /var/lib/istio/data from istio-data (rw)
      /var/run/secrets/credential-uds from credential-socket (rw)
      /var/run/secrets/istio from istiod-ca-cert (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qhnsh (ro)
      /var/run/secrets/tokens from istio-token (rw)
      /var/run/secrets/workload-spiffe-credentials from workload-certs (rw)
      /var/run/secrets/workload-spiffe-uds from workload-socket (rw)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       True
  ContainersReady             True
  PodScheduled                True
Volumes:
  workload-socket:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  credential-socket:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  workload-certs:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  istio-envoy:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     Memory
    SizeLimit:  <unset>
  istio-data:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  istio-podinfo:
    Type:  DownwardAPI (a volume populated by information about the pod)
    Items:
      metadata.labels -> labels
      metadata.annotations -> annotations
  istio-token:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  43200
  istiod-ca-cert:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      istio-ca-root-cert
    Optional:  false
  kube-api-access-qhnsh:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age   From               Message
  ----     ------     ----  ----               -------
  Normal   Scheduled  76s   default-scheduler  Successfully assigned default/deploy-websrv-7d7cf8586c-7kz4n to k3s-s
  Normal   Pulled     76s   kubelet            Container image "docker.io/istio/proxyv2:1.23.2" already present on machine
  Normal   Created    76s   kubelet            Created container istio-init
  Normal   Started    76s   kubelet            Started container istio-init
  Normal   Pulling    76s   kubelet            Pulling image "nginx:alpine"
  Normal   Pulled     70s   kubelet            Successfully pulled image "nginx:alpine" in 5.363s (5.363s including waiting). Image size: 20506631 bytes.
  Normal   Created    70s   kubelet            Created container deploy-websrv
  Normal   Started    70s   kubelet            Started container deploy-websrv
  Normal   Pulled     70s   kubelet            Container image "docker.io/istio/proxyv2:1.23.2" already present on machine
  Normal   Created    70s   kubelet            Created container istio-proxy
  Normal   Started    70s   kubelet            Started container istio-proxy
  Warning  Unhealthy  69s   kubelet            Startup probe failed: Get "http://172.16.0.6:15021/healthz/ready": dial tcp 172.16.0.6:15021: connect: connection refused

Istio Gateway/VirtualService 설정 - Host 기반 트래픽 라우팅 설정

🧿 Kubernetes와 Istio를 사용하여 HTTP 트래픽을 관리하는 Gateway와 VirtualService를 생성

Gateway

  • spec:
    • selector: istio: ingressgateway는 Istio의 기본 Ingress Gateway에 이 Gateway를 연결합니다. 즉, Istio Ingress Gateway가 이 Gateway를 통해 외부 트래픽을 수신하게 됩니다.
  • servers:
    • Gateway가 수신할 서버 설정을 정의합니다.
    • port:
      • number: 80은 HTTP 포트 번호입니다.
      • name: http는 포트의 이름입니다.
      • protocol: HTTP는 사용할 프로토콜입니다.
    • hosts:
      • "*"는 모든 호스트 이름에서 오는 요청을 허용합니다. 이는 모든 도메인에서 트래픽을 수신하도록 설정된 것입니다.

VirtualService

  • spec:
    • hosts:
      • "$MYDOMAIN"은 이 VirtualService가 수신할 호스트 이름을 지정합니다. $MYDOMAIN은 환경 변수로, 실제 도메인 이름으로 설정되어야 합니다.
    • gateways:
      • test-gateway는 이 VirtualService가 사용할 Gateway를 지정합니다. 이 VirtualService는 위에서 생성한 test-gateway를 통해 트래픽을 수신합니다.
    • http:
      • 이 섹션은 HTTP 트래픽에 대한 라우팅 규칙을 정의합니다.
      • route:
        • 이 리스트는 트래픽이 라우팅될 대상을 정의합니다.
        • destination:
          • host: svc-clusterip는 트래픽이 전달될 서비스의 이름입니다. 이 경우 svc-clusterip라는 이름의 서비스를 지정합니다.
          • port:
            • number: 80은 서비스의 포트 번호입니다. 이 포트로 트래픽이 전달됩니다.
  • Gateway는 외부에서 오는 HTTP 트래픽을 수신하고 test-gateway를 통해 요청을 수신합니다.
  • VirtualService는 특정 호스트(여기서는 $MYDOMAIN)에서 수신한 HTTP 요청을 svc-clusterip 서비스의 80번 포트로 라우팅합니다.
(⎈|default:N/A) root@k3s-s:~# cat <<EOF | kubectl create -f -
apiVersion: networking.istio.io/v1
kind: Gateway
metadata:
  name: test-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
  name: nginx-service
spec:
  hosts:
  - "$MYDOMAIN"
  gateways:
  - test-gateway
  http:
  - route:
    - destination:
        host: svc-clusterip
        port:
          number: 80
EOF
gateway.networking.istio.io/test-gateway created
virtualservice.networking.istio.io/nginx-service created

🧿 Kubernetes 클러스터에서 사용할 수 있는 API 리소스의 목록중 Istio 관련 리소스만 필터링

(⎈|default:N/A) root@k3s-s:~# kubectl api-resources  | grep istio
wasmplugins                                      extensions.istio.io/v1alpha1      true         WasmPlugin
destinationrules                    dr           networking.istio.io/v1            true         DestinationRule
envoyfilters                                     networking.istio.io/v1alpha3      true         EnvoyFilter
gateways                            gw           networking.istio.io/v1            true         Gateway
proxyconfigs                                     networking.istio.io/v1beta1       true         ProxyConfig
serviceentries                      se           networking.istio.io/v1            true         ServiceEntry
sidecars                                         networking.istio.io/v1            true         Sidecar
virtualservices                     vs           networking.istio.io/v1            true         VirtualService
workloadentries                     we           networking.istio.io/v1            true         WorkloadEntry
workloadgroups                      wg           networking.istio.io/v1            true         WorkloadGroup
authorizationpolicies               ap           security.istio.io/v1              true         AuthorizationPolicy
peerauthentications                 pa           security.istio.io/v1              true         PeerAuthentication
requestauthentications              ra           security.istio.io/v1              true         RequestAuthentication
telemetries                         telemetry    telemetry.istio.io/v1             true         Telemetry

🧿 kubectl get gw,vs를 실행하여 Istio Gateway(gw)와 VirtualService(vs) 리소스를 조회

  • gateway.networking.istio.io/test-gateway
    • 생성된 Gateway의 이름입니다. test-gateway는 networking.istio.io API 그룹의 Gateway 리소스입니다.

  • virtualservice.networking.istio.io/nginx-service
    • 생성된 VirtualService의 이름입니다. 이 리소스는 nginx-service로 명명되어 있습니다.
    • GATEWAYS: ["test-gateway"]
      • 이 VirtualService가 사용할 Gateway를 나타냅니다. test-gateway를 통해 트래픽을 수신하게 됩니다.
    • HOSTS: ["www.ssoon.dev"]
      • 이 VirtualService가 수신할 HTTP 요청의 호스트 이름입니다. 즉, www.ssoon.dev 도메인으로 오는 요청을 이 VirtualService가 처리합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get gw,vs
NAME                                       AGE
gateway.networking.istio.io/test-gateway   55s

NAME                                               GATEWAYS           HOSTS               AGE
virtualservice.networking.istio.io/nginx-service   ["test-gateway"]   ["www.ssoon.dev"]   55s

🧿 Istio의 사이드카 프록시와 관련된 상태 정보 확인

  • CDS (Cluster Discovery Service):
    • 클러스터에 대한 리소스 상태를 나타냅니다.
  • LDS (Listener Discovery Service):
    • Listener에 대한 리소스 상태를 나타냅니다.
  • EDS (Endpoint Discovery Service):
    • 서비스의 엔드포인트에 대한 상태를 나타냅니다.
  • RDS (Route Discovery Service):
    • 라우트에 대한 상태를 나타냅니다.
  • ECDS (Envoy Cluster Discovery Service):
    • Envoy에 대한 클러스터 정보 상태를 나타냅니다.
    • IGNORED: ECDS가 사용되지 않고 있다는 의미입니다.
  • ISTIOD:
    • 프록시가 연결된 Istiod의 이름입니다. istiod-7f8b586864-cwgvw는 Istio의 관리 컴포넌트인 Istiod의 파드 이름입니다.
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-status
NAME                                                   CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                      VERSION
deploy-websrv-7d7cf8586c-7kz4n.default                 Kubernetes     SYNCED (3m48s)     SYNCED (3m48s)     SYNCED (3m48s)     SYNCED (3m48s)     IGNORED     istiod-7f8b586864-cwgvw     1.23.2
istio-ingressgateway-5f9f654d46-tb2tl.istio-system     Kubernetes     SYNCED (59s)       SYNCED (59s)       SYNCED (3m48s)     SYNCED (59s)       IGNORED     istiod-7f8b586864-cwgvw     1.23.2

Istio 를 통한 Nginx 파드 접속 테스트

🧿[ testpc curl 명령어를 사용하여 $MYDOMAIN (여기서는 www.ssoon.dev)로 HTTP 요청을 보내고, 응답에서 <title> 태그를 추출한 결과와 curl -v 명령어로 얻은 자세한 요청/응답 정보 확인

root@testpc:~# curl -s $MYDOMAIN:$IGWHTTP | grep -o "<title>.*</title>"
<title>Welcome to nginx!</title>

root@testpc:~# curl -v -s $MYDOMAIN:$IGWHTTP
*   Trying 192.168.10.10:30293...
* Connected to www.ssoon.dev (192.168.10.10) port 30293 (#0)
> GET / HTTP/1.1
> Host: www.ssoon.dev:30293
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: istio-envoy
< date: Tue, 15 Oct 2024 11:53:59 GMT
< content-type: text/html
< content-length: 615
< last-modified: Wed, 02 Oct 2024 16:07:39 GMT
< etag: "66fd6fcb-267"
< accept-ranges: bytes
< x-envoy-upstream-service-time: 13
<
<!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>
* Connection #0 to host www.ssoon.dev left intact

🧿 Istio Ingress Gateway의 로그를 실시간으로 확인

  • [istio-ingressgateway-5f9f654d46-tb2tl]:
    • 로그가 기록된 Ingress Gateway의 파드 이름입니다. 이는 어떤 파드에서 로그가 생성되었는지를 나타냅니다.
  • "GET / HTTP/1.1":
    • 클라이언트가 Ingress Gateway로 전송한 요청의 메소드(GET), 요청 경로(/), HTTP 버전(HTTP/1.1)을 나타냅니다.
  • 200:
    • HTTP 응답 상태 코드입니다. 200은 요청이 성공적으로 처리되었음을 의미합니다.
  • via_upstream:
    • 요청이 업스트림(백엔드 서비스)으로 전송되었음을 나타냅니다.
  • "172.16.0.1":
    • 요청을 보낸 클라이언트의 IP 주소입니다.
  • "www.ssoon.dev:30293":
    • 요청한 호스트 및 포트입니다. 여기서는 www.ssoon.dev 도메인으로 30293 포트에서 요청이 들어온 것입니다.
  • "172.16.0.6:80":
    • 요청이 전달된 백엔드 서비스의 IP 주소와 포트입니다. 이 경우 172.16.0.6의 80 포트입니다.
  • outbound|80||svc-clusterip.default.svc.cluster.local:
    • outbound|<port>|<protocol>|<service>
      • outbound:
        • 이 값은 요청이 클러스터 외부로 나가는(outbound) 경로임을 나타냅니다. 클러스터 내의 서비스에서 다른 서비스로의 요청을 의미합니다.
      • 80:
        • 요청이 전달되는 포트 번호를 나타냅니다. 여기서는 HTTP 프로토콜에서 일반적으로 사용되는 포트인 80입니다. 이는 요청이 서비스의 80번 포트로 향하고 있다는 것을 의미합니다.
  • 172.16.0.5:36520:
    • Ingress Gateway가 요청을 처리하기 위해 사용한 소스 IP 주소와 포트입니다.
  • 172.16.0.5:8080:
    • 요청을 처리하기 위해 사용된 소스 IP 주소와 포트입니다.
  • 172.16.0.1:61751:
    • 클라이언트가 요청을 보낸 IP 주소와 포트입니다.

Istio Ingress Gateway가 수신한 요청이 svc-clusterip 서비스의 80번 포트로 나가는 HTTP 요청임을 나타냅니다. 요청은 클러스터 내에서 발생하였으며, Istio의 라우팅 규칙에 따라 이 서비스로 라우팅되었습니다. 

(⎈|default:N/A) root@k3s-s:~# kubetail -n istio-system -l app=istio-ingressgateway -f
Will tail 1 logs...
istio-ingressgateway-5f9f654d46-tb2tl
[istio-ingressgateway-5f9f654d46-tb2tl] [2024-10-15T11:54:59.053Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 1 1 "172.16.0.1" "curl/7.81.0" "6e460fea-9b38-97c5-a9db-71bf3a66b2e3" "www.ssoon.dev:30293" "172.16.0.6:80" outbound|80||svc-clusterip.default.svc.cluster.local 172.16.0.5:36520 172.16.0.5:8080 172.16.0.1:61751 - -

🧿 Istio Proxy 로그

  • [deploy-websrv-7d7cf8586c-7kz4n istio-proxy]:
    • Istio 프록시가 기록한 로그입니다. 해당 프록시의 파드 이름도 포함되어 있습니다.
  • [2024-10-15T11:56:10.219Z]:
    • 요청이 수신된 UTC 타임스탬프입니다.
  • "GET / HTTP/1.1":
    • 클라이언트가 보낸 HTTP 요청의 내용입니다.
  • 200:
    • HTTP 응답 상태 코드입니다.
  • via_upstream:
    • 요청이 업스트림(백엔드 서비스)으로 전송되었음을 나타냅니다.
  • "172.16.0.1":
    • 요청을 보낸 클라이언트의 IP 주소입니다.
  • "curl/7.81.0":
    • 요청을 보낸 클라이언트의 User-Agent입니다.
  • "d66b02b3-51e4-98e2-b8e1-0ff953946a6a":
    • 요청의 트랜잭션 ID입니다.
  • "www.ssoon.dev:30293":
    • 요청한 호스트 및 포트입니다.
  • "172.16.0.6:80":
    • 요청이 전달된 백엔드 서비스의 IP 주소와 포트입니다.
  • inbound|80||:
    • 요청이 Ingress Gateway를 통해 클러스터 내부로 들어온 것을 나타냅니다. 포트 80에서 수신된 요청입니다.
  • 127.0.0.6:40339:
    • 요청을 처리하기 위해 사용된 소스 IP 주소와 포트입니다.
  • 172.16.0.6:80:
    • 요청을 처리하기 위해 사용된 백엔드 서비스의 IP 주소와 포트입니다.
  • 172.16.0.1:0:
    • 클라이언트가 요청을 보낸 IP 주소와 포트입니다.
  • invalid:outbound_.80_._.svc-clusterip.default.svc.cluster.local:
    • 요청이 유효하지 않음을 나타내는 메시지입니다. 

Istio Proxy가 요청을 수신하고 처리했으며, 백엔드 서비스(svc-clusterip)로 전달된 요청에 대한 정보를 나타냅니다. 그러나 이 요청의 일부 메타데이터는 유효하지 않다는 경고가 포함되어 있습니다.

(⎈|default:N/A) root@k3s-s:~# kubetail -l app=deploy-websrv
Will tail 3 logs...
deploy-websrv-7d7cf8586c-7kz4n deploy-websrv
deploy-websrv-7d7cf8586c-7kz4n istio-proxy
deploy-websrv-7d7cf8586c-7kz4n istio-init
[deploy-websrv-7d7cf8586c-7kz4n deploy-websrv] 127.0.0.6 - - [15/Oct/2024:11:56:10 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.81.0" "172.16.0.1"
[deploy-websrv-7d7cf8586c-7kz4n istio-proxy] [2024-10-15T11:56:10.219Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 0 0 "172.16.0.1" "curl/7.81.0" "d66b02b3-51e4-98e2-b8e1-0ff953946a6a" "www.ssoon.dev:30293" "172.16.0.6:80" inbound|80|| 127.0.0.6:40339 172.16.0.6:80 172.16.0.1:0 invalid:outbound_.80_._.svc-clusterip.default.svc.cluster.local default

🧿 Istio 서비스 메쉬의 프록시 상태 확인

  • deploy-websrv-7d7cf8586c-7kz4n.default:
    • deploy-websrv 애플리케이션의 Pod 이름입니다. .default는 이 Pod이 default 네임스페이스에 위치하고 있음을 나타냅니다.
  • istio-ingressgateway-5f9f654d46-tb2tl.istio-system:
    • Istio Ingress Gateway의 Pod 이름입니다. .istio-system은 이 Pod이 istio-system 네임스페이스에 위치하고 있음을 나타냅니다.
(⎈|default:N/A) root@k3s-s:~# istioctl proxy-status
NAME                                                   CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                      VERSION
deploy-websrv-7d7cf8586c-7kz4n.default                 Kubernetes     SYNCED (8m21s)     SYNCED (8m21s)     SYNCED (8m21s)     SYNCED (8m21s)     IGNORED     istiod-7f8b586864-cwgvw     1.23.2
istio-ingressgateway-5f9f654d46-tb2tl.istio-system     Kubernetes     SYNCED (5m32s)     SYNCED (5m32s)     SYNCED (8m21s)     SYNCED (5m32s)     IGNORED     istiod-7f8b586864-cwgvw     1.23.2

🧿 Istio 사이드카 프록시(deploy-websrv)의 전체 구성 정보 확인

1. Istio 및 Envoy 정보

  • Istio Version: 1.23.2
  • Istio Proxy Version: 6c72b2179f5a58988b920a55b0be8346de3f7b35
  • Envoy Version: 1.31.2-dev/Clean/RELEASE/BoringSSL

이 정보는 사용 중인 Istio 및 Envoy의 버전을 보여줍니다. 최신 버전의 사용을 확인하는 것은 보안 및 성능 개선을 위해 중요합니다.


2. 클러스터 구성

클러스터(Cluster)

  • inbound|80: 80 포트에 대한 인바운드 트래픽을 처리합니다. ORIGINAL_DST 타입이며, 기본 목적지는 없음.
  • BlackHoleCluster: 모든 요청을 버리는 블랙홀 클러스터입니다.
  • PassthroughCluster: 기본적인 패스스루 클러스터로, 요청을 변경 없이 전달합니다.
  • outbound|80: istio-ingressgateway와 연결된 아웃바운드 요청입니다.
  • svc-clusterip: default 네임스페이스의 서비스 클러스터 IP입니다.

이러한 클러스터들은 서비스 메쉬의 다양한 요청 처리 및 라우팅 방식을 지원합니다.


3. 리스너(Listener)

각 리스너는 특정 IP와 포트에서 수신 대기하며, 다양한 전송 및 애플리케이션 프로토콜을 지원합니다. 예를 들어:

  • listener/0.0.0.0_80: 모든 IP에서 80 포트에서 HTTP 요청을 수신합니다.
  • listener/10.10.200.183_80: 특정 IP에서 80 포트에서 요청을 수신하며, 이 리스너는 svc-clusterip 클러스터와 연결되어 있습니다.
  • listener/virtualOutbound: 가상 아웃바운드 리스너로, 패스스루 클러스터에 연결되어 있습니다.

이 리스너들은 외부 요청을 해당 서비스로 라우팅하는 역할을 합니다.


4. 라우트(Route)

라우트는 요청을 특정 서비스로 전달하는 방법을 정의합니다. 예를 들어:

  • route/svc-clusterip.default.svc.cluster.local:80: 기본 svc-clusterip 서비스에 대한 라우트입니다.
  • route/80: istio-ingressgateway에 대한 라우트입니다.
  • route/inbound|80||: 인바운드 요청에 대한 기본 라우트입니다.

각 라우트는 특정 서비스의 도메인 이름 및 경로와 연관되어 있습니다.


5. 엔드포인트(Endpoint)

각 엔드포인트는 서비스가 요청을 처리하기 위해 연결할 수 있는 실제 네트워크 위치를 나타냅니다. 예를 들어:

  • endpoint/172.16.0.6:80: svc-clusterip.default.svc.cluster.local 서비스의 엔드포인트입니다.
  • endpoint/172.16.0.3:15012: istiod 서비스의 엔드포인트입니다.

모든 엔드포인트가 HEALTHY 상태로 표시되고 있어, 해당 서비스에 정상적으로 연결할 수 있음을 의미합니다.


6. 보안 및 인증서

  • secret/default: 기본 인증서 체인으로 활성화 상태입니다.
  • secret/ROOTCA: 루트 CA로 활성화 상태입니다.

이 정보는 클러스터 내에서 TLS 보안 통신을 위한 인증서와 관련된 상태를 나타냅니다.

(⎈|default:N/A) root@k3s-s:~# istioctl proxy-config all deploy-websrv-7d7cf8586c-7kz4n
Istio Version:       1.23.2
Istio Proxy Version: 6c72b2179f5a58988b920a55b0be8346de3f7b35
Envoy Version:       1.31.2-dev/Clean/RELEASE/BoringSSL

NAME                                                                            SERVICE FQDN                                            PORT      SUBSET     DIRECTION     TYPE             DESTINATION RULE
cluster/inbound|80||                                                                                                                    80        -          inbound       ORIGINAL_DST
cluster/BlackHoleCluster                                                        cluster/BlackHoleCluster                                -         -          -             STATIC
cluster/InboundPassthroughCluster                                               cluster/InboundPassthroughCluster                       -         -          -             ORIGINAL_DST
cluster/PassthroughCluster                                                      cluster/PassthroughCluster                              -         -          -             ORIGINAL_DST
cluster/agent                                                                   cluster/agent                                           -         -          -             STATIC
cluster/outbound|80||istio-ingressgateway.istio-system.svc.cluster.local        istio-ingressgateway.istio-system.svc.cluster.local     80        -          outbound      EDS
cluster/outbound|443||istio-ingressgateway.istio-system.svc.cluster.local       istio-ingressgateway.istio-system.svc.cluster.local     443       -          outbound      EDS
cluster/outbound|15021||istio-ingressgateway.istio-system.svc.cluster.local     istio-ingressgateway.istio-system.svc.cluster.local     15021     -          outbound      EDS
cluster/outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local     istio-ingressgateway.istio-system.svc.cluster.local     15443     -          outbound      EDS
cluster/outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local     istio-ingressgateway.istio-system.svc.cluster.local     31400     -          outbound      EDS
cluster/outbound|443||istiod.istio-system.svc.cluster.local                     istiod.istio-system.svc.cluster.local                   443       -          outbound      EDS
cluster/outbound|15010||istiod.istio-system.svc.cluster.local                   istiod.istio-system.svc.cluster.local                   15010     -          outbound      EDS
cluster/outbound|15012||istiod.istio-system.svc.cluster.local                   istiod.istio-system.svc.cluster.local                   15012     -          outbound      EDS
cluster/outbound|15014||istiod.istio-system.svc.cluster.local                   istiod.istio-system.svc.cluster.local                   15014     -          outbound      EDS
cluster/outbound|53||kube-dns.kube-system.svc.cluster.local                     kube-dns.kube-system.svc.cluster.local                  53        -          outbound      EDS
cluster/outbound|9153||kube-dns.kube-system.svc.cluster.local                   kube-dns.kube-system.svc.cluster.local                  9153      -          outbound      EDS
cluster/outbound|443||kubernetes.default.svc.cluster.local                      kubernetes.default.svc.cluster.local                    443       -          outbound      EDS
cluster/outbound|443||metrics-server.kube-system.svc.cluster.local              metrics-server.kube-system.svc.cluster.local            443       -          outbound      EDS
cluster/prometheus_stats                                                        cluster/prometheus_stats                                -         -          -             STATIC
cluster/sds-grpc                                                                cluster/sds-grpc                                        -         -          -             STATIC
cluster/outbound|80||svc-clusterip.default.svc.cluster.local                    svc-clusterip.default.svc.cluster.local                 80        -          outbound      EDS
cluster/xds-grpc                                                                cluster/xds-grpc                                        -         -          -             STATIC

NAME                         ADDRESSES     PORT  MATCH                                                               DESTINATION
listener/10.10.200.10_53     10.10.200.10  53    ALL                                                                 Cluster: outbound|53||kube-dns.kube-system.svc.cluster.local
listener/0.0.0.0_80          0.0.0.0       80    Trans: raw_buffer; App: http/1.1,h2c                                Route: 80
listener/0.0.0.0_80          0.0.0.0       80    ALL                                                                 PassthroughCluster
listener/10.10.200.183_80    10.10.200.183 80    Trans: raw_buffer; App: http/1.1,h2c                                Route: svc-clusterip.default.svc.cluster.local:80
listener/10.10.200.183_80    10.10.200.183 80    ALL                                                                 Cluster: outbound|80||svc-clusterip.default.svc.cluster.local
listener/10.10.200.1_443     10.10.200.1   443   ALL                                                                 Cluster: outbound|443||kubernetes.default.svc.cluster.local
listener/10.10.200.136_443   10.10.200.136 443   ALL                                                                 Cluster: outbound|443||metrics-server.kube-system.svc.cluster.local
listener/10.10.200.196_443   10.10.200.196 443   ALL                                                                 Cluster: outbound|443||istiod.istio-system.svc.cluster.local
listener/10.10.200.254_443   10.10.200.254 443   ALL                                                                 Cluster: outbound|443||istio-ingressgateway.istio-system.svc.cluster.local
listener/10.10.200.10_9153   10.10.200.10  9153  Trans: raw_buffer; App: http/1.1,h2c                                Route: kube-dns.kube-system.svc.cluster.local:9153
listener/10.10.200.10_9153   10.10.200.10  9153  ALL                                                                 Cluster: outbound|9153||kube-dns.kube-system.svc.cluster.local
listener/virtualOutbound     0.0.0.0       15001 ALL                                                                 PassthroughCluster
listener/virtualOutbound     0.0.0.0       15001 Addr: *:15001                                                       Non-HTTP/Non-TCP
listener/virtualInbound      0.0.0.0       15006 Addr: *:15006                                                       Non-HTTP/Non-TCP
listener/virtualInbound      0.0.0.0       15006 Trans: tls; App: istio-http/1.0,istio-http/1.1,istio-h2             InboundPassthroughCluster
listener/virtualInbound      0.0.0.0       15006 Trans: raw_buffer; App: http/1.1,h2c                                InboundPassthroughCluster
listener/virtualInbound      0.0.0.0       15006 Trans: tls; App: TCP TLS                                            InboundPassthroughCluster
listener/virtualInbound      0.0.0.0       15006 Trans: raw_buffer                                                   InboundPassthroughCluster
listener/virtualInbound      0.0.0.0       15006 Trans: tls                                                          InboundPassthroughCluster
listener/virtualInbound      0.0.0.0       15006 Trans: tls; App: istio-http/1.0,istio-http/1.1,istio-h2; Addr: *:80 Cluster: inbound|80||
listener/virtualInbound      0.0.0.0       15006 Trans: raw_buffer; App: http/1.1,h2c; Addr: *:80                    Cluster: inbound|80||
listener/virtualInbound      0.0.0.0       15006 Trans: tls; App: TCP TLS; Addr: *:80                                Cluster: inbound|80||
listener/virtualInbound      0.0.0.0       15006 Trans: raw_buffer; Addr: *:80                                       Cluster: inbound|80||
listener/virtualInbound      0.0.0.0       15006 Trans: tls; Addr: *:80                                              Cluster: inbound|80||
listener/0.0.0.0_15010       0.0.0.0       15010 Trans: raw_buffer; App: http/1.1,h2c                                Route: 15010
listener/0.0.0.0_15010       0.0.0.0       15010 ALL                                                                 PassthroughCluster
listener/10.10.200.196_15012 10.10.200.196 15012 ALL                                                                 Cluster: outbound|15012||istiod.istio-system.svc.cluster.local
listener/0.0.0.0_15014       0.0.0.0       15014 Trans: raw_buffer; App: http/1.1,h2c                                Route: 15014
listener/0.0.0.0_15014       0.0.0.0       15014 ALL                                                                 PassthroughCluster
listener/                    0.0.0.0       15021 ALL                                                                 Inline Route: /healthz/ready*
listener/10.10.200.254_15021 10.10.200.254 15021 Trans: raw_buffer; App: http/1.1,h2c                                Route: istio-ingressgateway.istio-system.svc.cluster.local:15021
listener/10.10.200.254_15021 10.10.200.254 15021 ALL                                                                 Cluster: outbound|15021||istio-ingressgateway.istio-system.svc.cluster.local
listener/                    0.0.0.0       15090 ALL                                                                 Inline Route: /stats/prometheus*
listener/10.10.200.254_15443 10.10.200.254 15443 ALL                                                                 Cluster: outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local
listener/10.10.200.254_31400 10.10.200.254 31400 ALL                                                                 Cluster: outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local

NAME                                                                VHOST NAME                                                    DOMAINS
                            MATCH                  VIRTUAL SERVICE
route/svc-clusterip.default.svc.cluster.local:80                    svc-clusterip.default.svc.cluster.local:80                    *
                            /*
route/80                                                            istio-ingressgateway.istio-system.svc.cluster.local:80        istio-ingressgateway.istio-system, 10.10.200.254     /*
route/80                                                            svc-clusterip.default.svc.cluster.local:80                    svc-clusterip, svc-clusterip.default + 1 more...     /*
route/15014                                                         istiod.istio-system.svc.cluster.local:15014                   istiod.istio-system, 10.10.200.196                   /*
route/kube-dns.kube-system.svc.cluster.local:9153                   kube-dns.kube-system.svc.cluster.local:9153                   *
                            /*
route/15010                                                         istiod.istio-system.svc.cluster.local:15010                   istiod.istio-system, 10.10.200.196                   /*
route/istio-ingressgateway.istio-system.svc.cluster.local:15021     istio-ingressgateway.istio-system.svc.cluster.local:15021     *
                            /*
route/                                                              backend                                                       *
                            /healthz/ready*
route/InboundPassthroughCluster                                     inbound|http|0                                                *
                            /*
route/                                                              backend                                                       *
                            /stats/prometheus*
route/inbound|80||                                                  inbound|http|80                                               *
                            /*
route/inbound|80||                                                  inbound|http|80                                               *
                            /*
route/InboundPassthroughCluster                                     inbound|http|0                                                *
                            /*

RESOURCE NAME      TYPE           STATUS     VALID CERT     SERIAL NUMBER                        NOT AFTER                NOT BEFORE
secret/default     Cert Chain     ACTIVE     true           7268948a382636541ea4d0ac10c53027     2024-10-16T11:48:54Z     2024-10-15T11:46:54Z
secret/ROOTCA      CA             ACTIVE     true           3c4d452dc0536d1a68b9a55eef051379     2034-10-13T11:08:21Z     2024-10-15T11:08:21Z

NAME                                                      STATUS      LOCALITY     CLUSTER
endpoint/172.16.0.6:80                                    HEALTHY                  inbound|80||
endpoint/127.0.0.1:15020                                  HEALTHY                  agent
endpoint/172.16.0.5:8080                                  HEALTHY                  outbound|80||istio-ingressgateway.istio-system.svc.cluster.local
endpoint/172.16.0.5:8443                                  HEALTHY                  outbound|443||istio-ingressgateway.istio-system.svc.cluster.local
endpoint/172.16.0.5:15021                                 HEALTHY                  outbound|15021||istio-ingressgateway.istio-system.svc.cluster.local
endpoint/172.16.0.5:15443                                 HEALTHY                  outbound|15443||istio-ingressgateway.istio-system.svc.cluster.local
endpoint/172.16.0.5:31400                                 HEALTHY                  outbound|31400||istio-ingressgateway.istio-system.svc.cluster.local
endpoint/172.16.0.3:15017                                 HEALTHY                  outbound|443||istiod.istio-system.svc.cluster.local
endpoint/172.16.0.3:15010                                 HEALTHY                  outbound|15010||istiod.istio-system.svc.cluster.local
endpoint/172.16.0.3:15012                                 HEALTHY                  outbound|15012||istiod.istio-system.svc.cluster.local
endpoint/172.16.0.3:15014                                 HEALTHY                  outbound|15014||istiod.istio-system.svc.cluster.local
endpoint/172.16.2.2:53                                    HEALTHY                  outbound|53||kube-dns.kube-system.svc.cluster.local
endpoint/172.16.2.2:9153                                  HEALTHY                  outbound|9153||kube-dns.kube-system.svc.cluster.local
endpoint/192.168.10.10:6443                               HEALTHY                  outbound|443||kubernetes.default.svc.cluster.local
endpoint/172.16.0.2:10250                                 HEALTHY                  outbound|443||metrics-server.kube-system.svc.cluster.local
endpoint/127.0.0.1:15000                                  HEALTHY                  prometheus_stats
endpoint/./var/run/secrets/workload-spiffe-uds/socket     HEALTHY                  sds-grpc
endpoint/172.16.0.6:80                                    HEALTHY                  outbound|80||svc-clusterip.default.svc.cluster.local
endpoint/./etc/istio/proxy/XDS                            HEALTHY                  xds-grpc

🧿 deploy/deploy-websrv의 Istio 사이드카 컨테이너인 istio-proxy 내부에서 /etc/passwd 파일의 마지막 3줄을 출력

  • istio-proxy: Istio 사이드카 프록시를 위한 전용 사용자
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- tail -n 3 /etc/passwd
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
tcpdump:x:100:102::/nonexistent:/usr/sbin/nologin
istio-proxy:x:1337:1337::/home/istio-proxy:/bin/sh

🧿 열려 있는 소켓과 포트 정보를 확인

  • Istio 프록시(envoy)와 Pilot Agent가 여러 개의 포트를 열어 두어, 다양한 서비스를 처리하고 있습니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- ss -nlp
Netid   State     Recv-Q    Send-Q                                    Local Address:Port        Peer Address:Port   Process
nl      UNCONN    0         0                                                     0:0                       *
nl      UNCONN    4352      0                                                     4:40                      *
nl      UNCONN    896       0                                                     4:0                       *
nl      UNCONN    0         0                                                     9:0                       *
nl      UNCONN    0         0                                                    10:0                       *
nl      UNCONN    0         0                                                    12:0                       *
nl      UNCONN    0         0                                                    15:0                       *
nl      UNCONN    0         0                                                    16:0                       *
u_str   LISTEN    0         4096                                etc/istio/proxy/XDS 74238                  * 0       users:(("pilot-agent",pid=1,fd=11))
u_str   LISTEN    0         4096         var/run/secrets/workload-spiffe-uds/socket 74237                  * 0       users:(("pilot-agent",pid=1,fd=9))
tcp     LISTEN    0         511                                             0.0.0.0:80               0.0.0.0:*
tcp     LISTEN    0         4096                                          127.0.0.1:15000            0.0.0.0:*       users:(("envoy",pid=13,fd=18))
tcp     LISTEN    0         4096                                          127.0.0.1:15004            0.0.0.0:*       users:(("pilot-agent",pid=1,fd=12))
tcp     LISTEN    0         4096                                            0.0.0.0:15090            0.0.0.0:*       users:(("envoy",pid=13,fd=21))
tcp     LISTEN    0         4096                                            0.0.0.0:15090            0.0.0.0:*       users:(("envoy",pid=13,fd=20))
tcp     LISTEN    0         4096                                            0.0.0.0:15021            0.0.0.0:*       users:(("envoy",pid=13,fd=23))
tcp     LISTEN    0         4096                                            0.0.0.0:15021            0.0.0.0:*       users:(("envoy",pid=13,fd=22))
tcp     LISTEN    0         4096                                            0.0.0.0:15006            0.0.0.0:*       users:(("envoy",pid=13,fd=37))
tcp     LISTEN    0         4096                                            0.0.0.0:15006            0.0.0.0:*       users:(("envoy",pid=13,fd=36))
tcp     LISTEN    0         4096                                            0.0.0.0:15001            0.0.0.0:*       users:(("envoy",pid=13,fd=35))
tcp     LISTEN    0         4096                                            0.0.0.0:15001            0.0.0.0:*       users:(("envoy",pid=13,fd=34))
tcp     LISTEN    0         511                                                [::]:80                  [::]:*
tcp     LISTEN    0         4096                                                  *:15020                  *:*       users:(("pilot-agent",pid=1,fd=3))

🧿 현재 열린 소켓 연결의 상태와 해당 소켓을 사용하는 프로세스 정보 확

  • Istio 프록시(envoy)와 Pilot Agent가 서로 연결되어 있으며, 여러 소켓을 통해 상호 작용하고 있음을 보여줍니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- ss -np
Netid   State   Recv-Q   Send-Q                                  Local Address:Port            Peer Address:Port    Process
u_str   ESTAB   0        0                                 etc/istio/proxy/XDS 75399                      * 73716    users:(("pilot-agent",pid=1,fd=13))
u_str   ESTAB   0        0                                                   * 73716                      * 75399    users:(("envoy",pid=13,fd=19))
u_str   ESTAB   0        0          var/run/secrets/workload-spiffe-uds/socket 75409                      * 76811    users:(("pilot-agent",pid=1,fd=15))
u_str   ESTAB   0        0                                                   * 76811                      * 75409    users:(("envoy",pid=13,fd=32))
u_str   ESTAB   0        0                                                   * 75357                      * 75356
u_str   ESTAB   0        0                                                   * 75359                      * 75358
u_str   ESTAB   0        0                                                   * 75361                      * 75360
u_str   ESTAB   0        0                                                   * 75360                      * 75361
u_str   ESTAB   0        0                                                   * 75362                      * 75363
u_str   ESTAB   0        0                                                   * 75356                      * 75357
u_str   ESTAB   0        0                                                   * 75358                      * 75359
u_str   ESTAB   0        0                                                   * 75363                      * 75362
tcp     ESTAB   0        0                                          172.16.0.6:15006             172.16.0.5:36520    users:(("envoy",pid=13,fd=42))
tcp     ESTAB   0        0                                          172.16.0.6:39604          10.10.200.196:15012    users:(("pilot-agent",pid=1,fd=14))
tcp     ESTAB   0        0                                          172.16.0.6:39592          10.10.200.196:15012    users:(("pilot-agent",pid=1,fd=10))
tcp     ESTAB   0        0                                           127.0.0.1:39094              127.0.0.1:15020    users:(("envoy",pid=13,fd=41))
tcp     ESTAB   0        0                                           127.0.0.1:42604              127.0.0.1:15020    users:(("envoy",pid=13,fd=39))
tcp     ESTAB   0        0                                          172.16.0.6:15006             172.16.0.5:51868    users:(("envoy",pid=13,fd=38))
tcp     ESTAB   0        0                                  [::ffff:127.0.0.1]:15020     [::ffff:127.0.0.1]:39094    users:(("pilot-agent",pid=1,fd=18))
tcp     ESTAB   0        0                                  [::ffff:127.0.0.1]:15020     [::ffff:127.0.0.1]:42604    users:(("pilot-agent",pid=1,fd=16))

🧿 현재 열려 있는 TCP 및 UNIX 도메인 소켓 연결의 상태 확인

  • 현재 Istio 사이드카 컨테이너는 여러 TCP 및 UNIX 도메인 소켓을 통해 외부 서비스 및 내부 구성 요소와 연결되어 있으며, envoy와 pilot-agent 간의 연결이 활발히 이루어지고 있습니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- netstat -np
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 172.16.0.6:15021        172.16.0.1:50232        TIME_WAIT   -
tcp        0      0 172.16.0.6:15006        172.16.0.5:36520        ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:39604        10.10.200.196:15012     ESTABLISHED 1/pilot-agent
tcp        0      0 172.16.0.6:39592        10.10.200.196:15012     ESTABLISHED 1/pilot-agent
tcp        0      0 127.0.0.1:39094         127.0.0.1:15020         ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:15021        172.16.0.1:40052        TIME_WAIT   -
tcp        0      0 127.0.0.1:42604         127.0.0.1:15020         ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:15021        172.16.0.1:50974        TIME_WAIT   -
tcp        0      0 172.16.0.6:15021        172.16.0.1:45778        TIME_WAIT   -
tcp        0      0 172.16.0.6:15006        172.16.0.5:51868        ESTABLISHED 13/envoy
tcp6       0      0 127.0.0.1:15020         127.0.0.1:39094         ESTABLISHED 1/pilot-agent
tcp6       0      0 127.0.0.1:15020         127.0.0.1:42604         ESTABLISHED 1/pilot-agent
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
unix  3      [ ]         STREAM     CONNECTED     75399    1/pilot-agent        etc/istio/proxy/XDS
unix  3      [ ]         STREAM     CONNECTED     73716    13/envoy
unix  3      [ ]         STREAM     CONNECTED     75409    1/pilot-agent        var/run/secrets/workload-spiffe-uds/socket
unix  3      [ ]         STREAM     CONNECTED     76811    13/envoy
unix  3      [ ]         STREAM     CONNECTED     75357    -
unix  3      [ ]         STREAM     CONNECTED     75359    -
unix  3      [ ]         STREAM     CONNECTED     75361    -
unix  3      [ ]         STREAM     CONNECTED     75360    -
unix  3      [ ]         STREAM     CONNECTED     75362    -
unix  3      [ ]         STREAM     CONNECTED     75356    -
unix  3      [ ]         STREAM     CONNECTED     75358    -
unix  3      [ ]         STREAM     CONNECTED     75363    -

🧿 Istio 사이드카 컨테이너인 istio-proxy에서 실행 중인 프로세스의 목록을 조회

  • PID 1: pilot-agent
    • /usr/local/bin/pilot-agent p
    • Istio의 pilot-agent는 서비스 메시에 있는 서비스의 로드 밸런싱과 관련된 프로세스입니다. pilot-agent는 Envoy 프록시와 함께 작동하며, 서비스의 메타데이터를 관리하고 Envoy의 구성 요소를 설정합니다.
  • PID 13: envoy
    • /usr/local/bin/envoy -c etc/
    • Istio의 envoy 프록시는 L7 프록시로서, 클라이언트와 서비스 간의 모든 요청을 중계합니다. 이는 요청 라우팅, 로깅, 모니터링, 보안 기능 등을 제공합니다. -c etc/ 옵션은 Envoy의 구성 파일 경로를 지정하는 것입니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
istio-p+       1       0  0 11:48 ?        00:00:00 /usr/local/bin/pilot-agent p
istio-p+      13       1  0 11:48 ?        00:00:02 /usr/local/bin/envoy -c etc/
istio-p+      58       0 99 12:01 pts/0    00:00:00 ps -ef

🧿 Kubernetes 클러스터에서 실행 중인 Pod와 Service의 상태 확인

  • Pods :
    • istio-ingressgateway: 외부 요청을 수신하고 적절한 서비스로 라우팅하는 Istio의 Ingress Gateway.
    • istiod: Istio의 제어 평면으로, Envoy 프록시와 통신하며 서비스 메시의 구성을 관리합니다.

  • Services :
    • istio-ingressgateway: 외부 트래픽을 수신하는 NodePort 서비스. 여러 포트를 통해 트래픽을 처리합니다.
    • istiod: Istio의 제어 평면으로, Envoy 프록시와의 통신을 위한 ClusterIP 서비스입니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get pod,svc -A -o wide
NAMESPACE      NAME                                          READY   STATUS    RESTARTS   AGE    IP           NODE     NOMINATED NODE   READINESS GATES
default        pod/deploy-websrv-7d7cf8586c-7kz4n            2/2     Running   0          13m    172.16.0.6   k3s-s    <none>           <none>
istio-system   pod/istio-ingressgateway-5f9f654d46-tb2tl     1/1     Running   0          53m    172.16.0.5   k3s-s    <none>           <none>
istio-system   pod/istiod-7f8b586864-cwgvw                   1/1     Running   0          54m    172.16.0.3   k3s-s    <none>           <none>
kube-system    pod/coredns-7b98449c4-hsplk                   1/1     Running   0          119m   172.16.2.2   k3s-w2   <none>           <none>
kube-system    pod/local-path-provisioner-6795b5f9d8-vdwqf   1/1     Running   0          119m   172.16.1.2   k3s-w1   <none>           <none>
kube-system    pod/metrics-server-cdcc87586-lwjz9            1/1     Running   0          119m   172.16.0.2   k3s-s    <none>           <none>

NAMESPACE      NAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE    SELECTOR
default        service/kubernetes             ClusterIP   10.10.200.1     <none>        443/TCP                                                                      119m   <none>
default        service/svc-clusterip          ClusterIP   10.10.200.183   <none>        80/TCP                                                                       13m    app=deploy-websrv
istio-system   service/istio-ingressgateway   NodePort    10.10.200.254   <none>        15021:30339/TCP,80:30293/TCP,443:31536/TCP,31400:30427/TCP,15443:31921/TCP   53m    app=istio-ingressgateway,istio=ingressgateway
istio-system   service/istiod                 ClusterIP   10.10.200.196   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        54m    app=istiod,istio=pilot
kube-system    service/kube-dns               ClusterIP   10.10.200.10    <none>        53/UDP,53/TCP,9153/TCP                                                       119m   k8s-app=kube-dns
kube-system    service/metrics-server         ClusterIP   10.10.200.136   <none>        443/TCP                                                                      119m   k8s-app=metrics-server

🧿 TCP 연결과 포트 리스닝 상태 확인

  • Envoy는 Istio의 핵심 구성 요소로, 서비스 간의 트래픽을 관리하고 모니터링합니다.
    • Envoy는 클라이언트 요청을 받고 이를 해당 서비스로 라우팅합니다.
    • Pilot Agent는 Envoy 프록시와 통신하여 서비스의 상태 및 구성을 업데이트합니다.
    • HTTP/HTTPS 트래픽은 포트 80을 통해 외부에서 수신됩니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/deploy-websrv -c istio-proxy -- netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:15000         0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 127.0.0.1:15004         0.0.0.0:*               LISTEN      1/pilot-agent
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15090           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15021           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15021           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15006           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15006           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 0.0.0.0:15001           0.0.0.0:*               LISTEN      13/envoy
tcp        0      0 172.16.0.6:15006        172.16.0.5:36520        ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:39604        10.10.200.196:15012     ESTABLISHED 1/pilot-agent
tcp        0      0 172.16.0.6:39592        10.10.200.196:15012     ESTABLISHED 1/pilot-agent
tcp        0      0 127.0.0.1:39094         127.0.0.1:15020         ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:15021        172.16.0.1:59624        TIME_WAIT   -
tcp        0      0 172.16.0.6:15021        172.16.0.1:46460        TIME_WAIT   -
tcp        0      0 127.0.0.1:42604         127.0.0.1:15020         ESTABLISHED 13/envoy
tcp        0      0 172.16.0.6:15021        172.16.0.1:43708        TIME_WAIT   -
tcp        0      0 172.16.0.6:15021        172.16.0.1:47944        TIME_WAIT   -
tcp        0      0 172.16.0.6:15006        172.16.0.5:51868        ESTABLISHED 13/envoy
tcp6       0      0 :::80                   :::*                    LISTEN      -
tcp6       0      0 :::15020                :::*                    LISTEN      1/pilot-agent
tcp6       0      0 127.0.0.1:15020         127.0.0.1:39094         ESTABLISHED 1/pilot-agent
tcp6       0      0 127.0.0.1:15020         127.0.0.1:42604         ESTABLISHED 1/pilot-agent

🧿 Istio의 istiod Pod 내부에서 실행 중인 프로세스의 정보 확인

  • /usr/local/bin/pilot-discovery
    • PID 1: 이 프로세스는 istiod의 주요 프로세스입니다. pilot-discovery는 Istio의 서비스 발견 기능을 담당합니다.
    • pilot-discovery는 Istio의 Control Plane에서 동작하며, Envoy 프록시와 통신하여 서비스의 구성을 관리하고 업데이트합니다. 또한, 클러스터 내에서 서비스 간의 라우팅을 조정하고, 정책 및 telemetry 데이터를 수집하는 역할을 합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/istiod -n istio-system -- ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
istio-p+       1       0  0 11:08 ?        00:00:09 /usr/local/bin/pilot-discove
istio-p+      33       0 50 12:03 pts/0    00:00:00 ps -ef

🧿 istiod Pod 내부에서 실행 중인 네트워크 연결 정보 확인

  • istiod Pod 내에서 pilot-discovery 프로세스는 여러 포트에서 수신 요청을 대기하고 있으며, 다른 서비스와의 통신을 위한 여러 ESTABLISHED 연결이 활성화되어 있습니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/istiod -n istio-system -- netstat -antp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:9876          0.0.0.0:*               LISTEN      1/pilot-discovery
tcp        0      0 172.16.0.3:39912        10.10.200.1:443         ESTABLISHED 1/pilot-discovery
tcp6       0      0 :::15010                :::*                    LISTEN      1/pilot-discovery
tcp6       0      0 :::15014                :::*                    LISTEN      1/pilot-discovery
tcp6       0      0 :::15012                :::*                    LISTEN      1/pilot-discovery
tcp6       0      0 :::15017                :::*                    LISTEN      1/pilot-discovery
tcp6       0      0 :::8080                 :::*                    LISTEN      1/pilot-discovery
tcp6       0      0 172.16.0.3:8080         172.16.0.1:48308        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:40806        TIME_WAIT   -
tcp6       0      0 172.16.0.3:15012        172.16.0.6:39604        ESTABLISHED 1/pilot-discovery
tcp6       0      0 172.16.0.3:8080         172.16.0.1:48294        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:56094        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:37138        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:48290        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:56086        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:49692        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:37150        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:49674        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:48278        TIME_WAIT   -
tcp6       0      0 172.16.0.3:15012        172.16.0.5:47076        ESTABLISHED 1/pilot-discovery
tcp6       0      0 172.16.0.3:8080         172.16.0.1:40780        TIME_WAIT   -
tcp6       0      0 172.16.0.3:15012        172.16.0.6:39592        ESTABLISHED 1/pilot-discovery
tcp6       0      0 172.16.0.3:8080         172.16.0.1:49856        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:40794        TIME_WAIT   -
tcp6       0      0 172.16.0.3:8080         172.16.0.1:37134        TIME_WAIT   -

🧿 istiod Pod에서 열린 네트워크 소켓의 상태 확인

  • istiod Pod의 pilot-discovery 프로세스는 여러 TCP 포트에서 요청을 수신 대기하고 있으며, 내부 및 외부 통신을 처리합니다.
15010 gRPC 서버 포트, 서비스 등록과 관리에 사용
15012 Envoy 프록시와의 통신에 사용
15014 gRPC 서버 포트, 일반적인 서비스 통신에 사용
15017 제어 평면 및 데이터 평면 간 통신에 사용
8080 HTTP API 요청을 처리하는 포트
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/istiod -n istio-system -- ss -nlp
Netid      State       Recv-Q      Send-Q             Local Address:Port              Peer Address:Port      Process
nl         UNCONN      0           0                              0:0                             *
nl         UNCONN      4352        0                              4:45                            *
nl         UNCONN      896         0                              4:0                             *
nl         UNCONN      0           0                              9:0                             *
nl         UNCONN      0           0                             10:0                             *
nl         UNCONN      0           0                             12:0                             *
nl         UNCONN      0           0                             15:0                             *
nl         UNCONN      0           0                             16:0                             *
tcp        LISTEN      0           4096                   127.0.0.1:9876                   0.0.0.0:*          users:(("pilot-discovery",pid=1,fd=8))
tcp        LISTEN      0           4096                           *:15010                        *:*          users:(("pilot-discovery",pid=1,fd=11))
tcp        LISTEN      0           4096                           *:15014                        *:*          users:(("pilot-discovery",pid=1,fd=9))
tcp        LISTEN      0           4096                           *:15012                        *:*          users:(("pilot-discovery",pid=1,fd=10))
tcp        LISTEN      0           4096                           *:15017                        *:*          users:(("pilot-discovery",pid=1,fd=12))
tcp        LISTEN      0           4096                           *:8080                         *:*          users:(("pilot-discovery",pid=1,fd=3))

🧿 istiod Pod에서 활성화된 TCP 연결의 상태 확인

  • 172.16.0.3 : pod/istiod-7f8b586864-cwgvw
  • 172.16.0.5 : pod/istio-ingressgateway-5f9f654d46-tb2tl
  • 172.16.0.6 : pod/deploy-websrv-7d7cf8586c-7kz4n  
172.16.0.3:39912 10.10.200.1:443 Kubernetes API 서버와의 HTTPS 연결
[::ffff:172.16.0.3]:15012 [::ffff:172.16.0.6]:39604 다른 Pod(Envoy)와의 gRPC 연결
[::ffff:172.16.0.3]:15012 [::ffff:172.16.0.5]:47076 다른 Pod(Envoy)와의 gRPC 연결
[::ffff:172.16.0.3]:15012 [::ffff:172.16.0.6]:39592 다른 Pod(Envoy)와의 gRPC 연결
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/istiod -n istio-system -- ss -np
Netid     State     Recv-Q     Send-Q               Local Address:Port                 Peer Address:Port      Process
tcp       ESTAB     0          0                       172.16.0.3:39912                 10.10.200.1:443        users:(("pilot-discovery",pid=1,fd=7))
tcp       ESTAB     0          0              [::ffff:172.16.0.3]:15012         [::ffff:172.16.0.6]:39604      users:(("pilot-discovery",pid=1,fd=16))
tcp       ESTAB     0          0              [::ffff:172.16.0.3]:15012         [::ffff:172.16.0.5]:47076      users:(("pilot-discovery",pid=1,fd=13))
tcp       ESTAB     0          0              [::ffff:172.16.0.3]:15012         [::ffff:172.16.0.6]:39592      users:(("pilot-discovery",pid=1,fd=15))

 

Comments