Ssoon
[7주차] Service Mesh : Istio 통한 외부 노출 본문
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-init Init Container는 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 수준의 로그는 일반적인 정보성 메시지를 포함합니다.
- proxy:
(⎈|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은 서비스의 포트 번호입니다. 이 포트로 트래픽이 전달됩니다.
- hosts:
- 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번 포트로 향하고 있다는 것을 의미합니다.
- outbound:
- outbound|<port>|<protocol>|<service>
- 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))
'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글
[7주차] Service Mesh : Traffic Management : Request Routing (0) | 2024.10.15 |
---|---|
[7주차] Service Mesh : Bookinfo 실습 & Istio 기능 (0) | 2024.10.15 |
[7주차] Service Mesh : Istio 설치 (Sidecar mode) (0) | 2024.10.15 |
[6주차] Gateway API (0) | 2024.10.08 |
[6주차] Ingress (0) | 2024.10.07 |
Comments