Ssoon

[7주차] Service Mesh : Istio 설치 (Sidecar mode) 본문

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

[7주차] Service Mesh : Istio 설치 (Sidecar mode)

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

✅ 기본환경

🧿 curl 명령어를 사용하여 Istio를 설치

(⎈|default:N/A) root@k3s-s:~# export ISTIOV=1.23.2

(⎈|default:N/A) root@k3s-s:~# echo "export ISTIOV=1.23.2" >> /etc/profile

(⎈|default:N/A) root@k3s-s:~# curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV TARGET_ARCH=x86_64 sh -

Downloading istio-1.23.2 from https://github.com/istio/istio/releases/download/1.23.2/istio-1.23.2-linux-amd64.tar.gz ...

Istio 1.23.2 Download Complete!

Istio has been successfully downloaded into the istio-1.23.2 folder on your system.

Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,
add the /root/istio-1.23.2/bin directory to your environment path variable with:
         export PATH="$PATH:/root/istio-1.23.2/bin"

Begin the Istio pre-installation check by running:
         istioctl x precheck

Need more information? Visit https://istio.io/latest/docs/setup/install/

(⎈|default:N/A) root@k3s-s:~# tree istio-$ISTIOV -L 2
istio-1.23.2
├── LICENSE
├── README.md
├── bin
│   └── istioctl
├── manifest.yaml
├── manifests
│   ├── charts
│   └── profiles
├── samples
│   ├── README.md
│   ├── addons
│   ├── ambient-argo
│   ├── bookinfo
│   ├── builder
│   ├── certs
│   ├── cicd
│   ├── custom-bootstrap
│   ├── extauthz
│   ├── external
│   ├── grpc-echo
│   ├── health-check
│   ├── helloworld
│   ├── httpbin
│   ├── jwt-server
│   ├── kind-lb
│   ├── multicluster
│   ├── open-telemetry
│   ├── operator
│   ├── ratelimit
│   ├── security
│   ├── sleep
│   ├── tcp-echo
│   ├── wasm_modules
│   └── websockets
└── tools
    ├── _istioctl
    ├── certs
    └── istioctl.bash

31 directories, 7 files

(⎈|default:N/A) root@k3s-s:~# cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl

(⎈|default:N/A) root@k3s-s:~# istioctl version --remote=false
client version: 1.23.2

🧿 istioctl profile list 

  • Istio에서 제공하는 istioctl profile list 명령어는 Istio의 다양한 설치 및 구성 프로파일을 보여줍니다.
  • 각 프로파일은 Istio를 어떻게 설치하고 설정할지를 정의한 템플릿으로, 다양한 환경과 요구에 맞춰 적절한 기능을 활성화하거나 비활성화합니다
(⎈|default:N/A) root@k3s-s:~# istioctl profile list
Istio configuration profiles:
    ambient
    default
    demo
    empty
    minimal
    openshift
    openshift-ambient
    preview
    remote
    stable

🧿 istioctl profile dump default

  • Istio의 default 프로파일에 대한 세부 설정을 출력합니다. 이를 통해 Istio가 어떤 구성으로 설치되었는지를 알 수 있습니다.

default

  • 일반적인 Istio 설치에 사용되는 기본 프로파일입니다.

 components:

  • Istio의 여러 구성 요소들이 여기서 정의됩니다. Istio는 다양한 기능을 가진 여러 컴포넌트로 이루어져 있고, 이 섹션에서는 각 컴포넌트를 활성화할지 여부를 설정할 수 있습니다.
    • base:
      • enabled: true: Istio의 기본 시스템이 활성화되어 설치됩니다. 기본적인 Istio 리소스들이 포함됩니다.
    • egressGateways:
      • enabled: false: Istio Egress Gateway는 외부 네트워크로 나가는 트래픽을 제어하는 역할을 하지만, 이 설정에서는 비활성화(false) 상태입니다.
    • ingressGateways:
      • enabled: true: Istio Ingress Gateway는 외부에서 클러스터로 들어오는 트래픽을 제어하며, 활성화(true) 상태입니다. 즉, 외부 트래픽을 받아들이기 위한 게이트웨이가 설치됩니다.
    • pilot:
      • enabled: true: Pilot은 Istio의 Control Plane 에서 중요한 역할을 하는 컴포넌트입니다. 이 설정에서는 활성화되어 있으며, Istio의 트래픽 라우팅 및 서비스 디스커버리 기능을 제공합니다.
(⎈|default:N/A) root@k3s-s:~# istioctl profile dump default
apiVersion: install.istio.io/v1alpha1	#Istio 설치에 관한 API 버전
kind: IstioOperator	#Istio를 설치하고 관리하기 위한 설정을 정의하는 리소스
spec:
  components:
    base:
      enabled: true
    egressGateways:
    - enabled: false
      name: istio-egressgateway
    ingressGateways:
    - enabled: true
      name: istio-ingressgateway
    pilot:
      enabled: true
  hub: docker.io/istio	#Istio의 컨테이너 이미지가 저장된 레지스트리 경로
  profile: default	#현재 사용 중인 프로파일
  tag: 1.23.2	#Istio의 설치 버전
  values:
    defaultRevision: ""
    gateways:	#istio-egressgateway와 istio-ingressgateway는 게이트웨이의 세부 설정
      istio-egressgateway: {}
      istio-ingressgateway: {}
    global:
      configValidation: true	#잘못된 설정이 적용되는 것을 방지
      istioNamespace: istio-system	# Istio가 설치된 네임스페이스

🧿 Istio 프로파일에서 Ingress Gateway 설정

  • enabled: true:
    • Istio Ingress Gateway가 활성화되어 있음을 나타냅니다. 즉, 외부 트래픽이 클러스터 내부로 들어올 수 있도록 트래픽을 수신하고 관리하는 게이트웨이가 설정되어 있습니다.
  • name: istio-ingressgateway:
    • 게이트웨이의 이름은 istio-ingressgateway입니다. 이 이름은 기본적으로 Istio에서 제공하는 Ingress Gateway의 이름으로, Istio가 외부 요청을 클러스터로 받아들이기 위해 사용하는 기본 구성 요소입니다.

  • 출력된 {}는 해당 경로에 대해 특별히 추가된 설정 값이 없다는 것을 의미합니다. 즉, istio-ingressgateway는 기본 설정대로 동작하고 있으며, 설정 파일에서 해당 게이트웨이에 대해 커스터마이징된 값이 따로 지정되지 않았다는 뜻입니다.
(⎈|default:N/A) root@k3s-s:~# istioctl profile dump --config-path components.ingressGateways
- enabled: true
  name: istio-ingressgateway

(⎈|default:N/A) root@k3s-s:~# istioctl profile dump --config-path values.gateways.istio-ingressgateway
{}

🧿 istioctl profile dump demo

components:

  • Istio의 여러 구성 요소(컴포넌트)가 포함된 섹션으로, 각 컴포넌트가 활성화(enabled: true)되어 있는지를 확인할 수 있습니다.
    • base:
      • enabled: true: Istio의 기본 리소스들이 설치됩니다. 필수적인 시스템 설정이 활성화됩니다.
    • egressGateways:
      • enabled: true: 외부로 나가는 트래픽을 제어하는 Egress Gateway가 활성화되어 있습니다. 일반적으로 'demo' 프로파일에서는 내부에서 외부로 나가는 트래픽을 제어하는 게이트웨이도 포함됩니다.
    • ingressGateways:
      • enabled: true: 외부에서 클러스터로 들어오는 트래픽을 관리하는 Ingress Gateway도 활성화되어 있습니다. 외부의 요청을 클러스터 내부로 받아들이는 기능을 제공합니다.
(⎈|default:N/A) root@k3s-s:~# istioctl profile dump demo
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  components:
    base:
      enabled: true
    egressGateways:
    - enabled: true
      name: istio-egressgateway
    ingressGateways:
    - enabled: true
      name: istio-ingressgateway
    pilot:
      enabled: true
  hub: docker.io/istio
  profile: demo
  tag: 1.23.2
  values:
    defaultRevision: ""
    gateways:
      istio-egressgateway: {}
      istio-ingressgateway: {}
    global:
      configValidation: true
      istioNamespace: istio-system
    profile: demo

🧿 Istio의 'demo' 프로파일을 덤프한 후, 해당 파일에서 Egress Gateway를 비활성화

  • istioctl profile dump demo 명령어로 현재 'demo' 프로파일의 설정을 demo-profile.yaml 파일에 저장했습니다.
  • vi 에디터를 사용해 파일을 열었고, egressGateways 항목에서 enabled: false로 값을 변경했습니다.

  • egressGateways:
    • enabled: false: 이 설정은 Egress Gateway 비활성화합니다. 즉, 클러스터 내부에서 외부로 나가는 트래픽을 제어하는 게이트웨이가 설치되지 않으며, 외부 트래픽 관리 기능이 제거됩니다.
(⎈|default:N/A) root@k3s-s:~# istioctl profile dump demo > demo-profile.yaml
(⎈|default:N/A) root@k3s-s:~# vi demo-profile.yaml
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
...
    egressGateways:
    - enabled: false
...

🧿 Istio 1.23.2의 'demo' 프로파일을 기반으로 설치

  • Istio Core: Istio의 핵심 시스템이 설치되었습니다. 이는 클러스터 내에서 Istio의 모든 기본 기능을 제공하는 필수적인 구성 요소입니다.
  • Istiod: Istio의 Control Plane 역할을 하는 컴포넌트가 설치되었습니다. Istiod는 서비스 디스커버리, 트래픽 관리, 보안 정책 등을 담당합니다.
  • Ingress Gateways: 외부 트래픽을 클러스터로 받아들이기 위한 Ingress Gateway가 설치되었습니다. 이를 통해 외부의 요청이 클러스터 내부 서비스로 라우팅될 수 있습니다.
  • Egress Gateways: 이전에 수정한 대로 egressGateways는 비활성화되어 설치되지 않았습니다. 클러스터에서 외부로 나가는 트래픽을 제어하는 게이트웨이가 설치되지 않은 상태입니다
(⎈|default:N/A) root@k3s-s:~# istioctl install -f demo-profile.yaml
        |\
        | \
        |  \
        |   \
      /||    \
     / ||     \
    /  ||      \
   /   ||       \
  /    ||        \
 /     ||         \
/______||__________\
____________________
  \__       _____/
     \_____/

This will install the Istio 1.23.2 "demo" profile (with components: Istio core, Istiod, and Ingress gateways) into the cluster. Proceed? (y/N) y
✔ Istio core installed ⛵️                                                                                                                                 
✔ Istiod installed 🧠
✔ Ingress gateways installed 🛬
✔ Installation complete
Made this installation the default for cluster-wide operations.

🧿 클러스터에서 Istio의 다양한 리소스

  • istio-ingressgateway-5f9f654d46-tb2tl:
    • Istio의 Ingress Gateway Pod가 정상적으로 실행 중입니다. 이 Pod는 외부 트래픽을 받아들이고 클러스터 내부로 전달하는 역할을 합니다.
  • istiod-7f8b586864-cwgvw:
    • Istio의 제어면인 istiod Pod도 정상적으로 실행 중입니다. istiod는 트래픽 제어, 정책 관리 등을 담당합니다.

  • istio-ingressgateway:
    • 타입: LoadBalancer
    • 클러스터 IP: 10.10.200.254
    • 외부 IP: 192.168.10.10,192.168.10.101,192.168.10.102
    • 포트: HTTP(80), HTTPS(443), TCP(31400), TLS(15443) 등 여러 포트가 개방되어 있습니다.
    • 이 서비스는 외부 트래픽을 클러스터 내부로 전달하기 위해 LoadBalancer로 설정된 Ingress Gateway입니다. 외부 IP는 여러 노드에 할당된 것을 보여주며, 다양한 포트를 통해 트래픽을 처리할 수 있습니다.
  • istiod:
    • 타입: ClusterIP
    • 클러스터 IP: 10.10.200.196
    • 포트: 15010, 15012, 443, 15014
    • istiod 제어면의 서비스입니다. 이 서비스는 주로 클러스터 내부에서만 접근 가능하며, 제어면에서 제공하는 API와 트래픽 제어에 사용됩니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get all,svc,ep,sa,cm,secret -n istio-system
NAME                                        READY   STATUS    RESTARTS   AGE
pod/istio-ingressgateway-5f9f654d46-tb2tl   1/1     Running   0          45s
pod/istiod-7f8b586864-cwgvw                 1/1     Running   0          61s

NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP                                   PORT(S)                                                                      AGE
service/istio-ingressgateway   LoadBalancer   10.10.200.254   192.168.10.10,192.168.10.101,192.168.10.102   15021:30339/TCP,80:30293/TCP,443:31536/TCP,31400:30427/TCP,15443:31921/TCP   45s
service/istiod                 ClusterIP      10.10.200.196   <none>                                        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        61s

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-ingressgateway   1/1     1            1           45s
deployment.apps/istiod                 1/1     1            1           61s

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/istio-ingressgateway-5f9f654d46   1         1         1       45s
replicaset.apps/istiod-7f8b586864                 1         1         1       61s

NAME                             ENDPOINTS                                                        AGE
endpoints/istio-ingressgateway   172.16.0.5:15443,172.16.0.5:15021,172.16.0.5:31400 + 2 more...   45s
endpoints/istiod                 172.16.0.3:15012,172.16.0.3:15010,172.16.0.3:15017 + 1 more...   61s

NAME                                                  SECRETS   AGE
serviceaccount/default                                0         64s
serviceaccount/istio-ingressgateway-service-account   0         45s
serviceaccount/istio-reader-service-account           0         62s
serviceaccount/istiod                                 0         61s

NAME                                            DATA   AGE
configmap/istio                                 2      61s
configmap/istio-ca-root-cert                    1      48s
configmap/istio-gateway-status-leader           0      49s
configmap/istio-leader                          0      49s
configmap/istio-namespace-controller-election   0      48s
configmap/istio-sidecar-injector                2      61s
configmap/kube-root-ca.crt                      1      64s

NAME                     TYPE               DATA   AGE
secret/istio-ca-secret   istio.io/ca-root   5      50s

🧿 Istio가 설치한 Custom Resource Definitions(CRDs)

  • CRDs는 Kubernetes에서 사용자 정의 리소스를 정의하는 데 사용되며, Istio는 이를 통해 다양한 네트워크 및 보안 정책을 관리합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get crd  | grep istio.io | sort
authorizationpolicies.security.istio.io    2024-10-15T11:08:08Z
destinationrules.networking.istio.io       2024-10-15T11:08:08Z
envoyfilters.networking.istio.io           2024-10-15T11:08:08Z
gateways.networking.istio.io               2024-10-15T11:08:08Z
peerauthentications.security.istio.io      2024-10-15T11:08:08Z
proxyconfigs.networking.istio.io           2024-10-15T11:08:08Z
requestauthentications.security.istio.io   2024-10-15T11:08:08Z
serviceentries.networking.istio.io         2024-10-15T11:08:09Z
sidecars.networking.istio.io               2024-10-15T11:08:09Z
telemetries.telemetry.istio.io             2024-10-15T11:08:09Z
virtualservices.networking.istio.io        2024-10-15T11:08:09Z
wasmplugins.extensions.istio.io            2024-10-15T11:08:09Z
workloadentries.networking.istio.io        2024-10-15T11:08:09Z
workloadgroups.networking.istio.io         2024-10-15T11:08:09Z

🧿 Istio Ingress Gateway 내에서 Envoy 프록시의 버전 확인

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deploy/istio-ingressgateway -n istio-system -c istio-proxy -- envoy --version

envoy  version: 6c72b2179f5a58988b920a55b0be8346de3f7b35/1.31.2-dev/Clean/RELEASE/BoringSSL

🧿 Istio Ingress Gateway 서비스의 타입을 NodePort로 변경

  • TYPE: NodePort — 서비스 유형으로, 이제 NodePort 방식으로 외부에서 접근할 수 있습니다.
  • CLUSTER-IP: 10.10.200.254 — 클러스터 내에서 이 서비스에 접근할 수 있는 IP 주소입니다.
  • EXTERNAL-IP: <none> — NodePort 서비스를 사용하므로 별도의 외부 IP가 없습니다. 대신, 클러스터의 노드 IP를 사용하여 접근해야 합니다.
  • PORT(S): 다양한 포트와 NodePort의 매핑 정보입니다.
    • 15021:30339/TCP — 서비스 포트 15021이 NodePort 30339에 매핑되어 있습니다.
    • 80:30293/TCP — HTTP 트래픽을 위한 포트입니다.
    • 443:31536/TCP — HTTPS 트래픽을 위한 포트입니다.
    • 31400:30427/TCP — gRPC 트래픽을 위한 포트입니다.
    • 15443:31921/TCP — mTLS를 위한 포트입니다.

  • ENDPOINTS: 172.16.0.5:15443, 172.16.0.5:15021, 172.16.0.5:31400 + 2 more... — Istio Ingress Gateway에 연결된 Pod의 IP 주소와 포트입니다. 이 경우, 모든 트래픽이 172.16.0.5 IP의 여러 포트로 전달됩니다.
(⎈|default:N/A) root@k3s-s:~# kubectl patch svc -n istio-system istio-ingressgateway -p '{"spec":{"type":"NodePort"}}'
service/istio-ingressgateway patched

(⎈|default:N/A) root@k3s-s:~# kubectl get svc,ep -n istio-system istio-ingressgateway
NAME                           TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                      AGE
service/istio-ingressgateway   NodePort   10.10.200.254   <none>        15021:30339/TCP,80:30293/TCP,443:31536/TCP,31400:30427/TCP,15443:31921/TCP   2m42s

NAME                             ENDPOINTS                                                        AGE
endpoints/istio-ingressgateway   172.16.0.5:15443,172.16.0.5:15021,172.16.0.5:31400 + 2 more...   2m42s

🧿  Istio Ingress Gateway 서비스의 포트 설정을 JSON 형식으로 출력

  • 출력된 JSON 객체는 각 포트에 대한 상세 정보를 담고 있습니다
(⎈|default:N/A) root@k3s-s:~# kubectl get svc -n istio-system istio-ingressgateway -o jsonpath={.spec.ports[*]} | jq
{
  "name": "status-port",
  "nodePort": 30339,
  "port": 15021,
  "protocol": "TCP",
  "targetPort": 15021
}
{
  "name": "http2",
  "nodePort": 30293,
  "port": 80,
  "protocol": "TCP",
  "targetPort": 8080
}
{
  "name": "https",
  "nodePort": 31536,
  "port": 443,
  "protocol": "TCP",
  "targetPort": 8443
}
{
  "name": "tcp",
  "nodePort": 30427,
  "port": 31400,
  "protocol": "TCP",
  "targetPort": 31400
}
{
  "name": "tls",
  "nodePort": 31921,
  "port": 15443,
  "protocol": "TCP",
  "targetPort": 15443
}

🧿 Istio Ingress Gateway의 컨테이너에서 사용하는 포트 정보를 JSON 형식으로 출

  • containerPort: 15021
    • Ingress Gateway의 기본 상태 포트입니다. 이 포트는 Istio의 상태 정보를 확인하는 데 사용됩니다.
  • containerPort: 8080
    • HTTP 트래픽을 처리하는 포트입니다. 주로 HTTP 요청을 처리하는 데 사용됩니다.
  • containerPort: 8443
    • HTTPS 트래픽을 처리하는 포트입니다. 주로 보안된 HTTP 요청을 처리하는 데 사용됩니다.
  • containerPort: 31400
    • 일반 TCP 트래픽을 처리하는 포트입니다. 주로 사용자 정의 TCP 서비스와의 통신에 사용됩니다.
  • containerPort: 15443
    • mTLS(서비스 간 암호화 통신)를 사용하는 포트입니다. Istio 내에서 보안 통신을 위한 포트입니다.
  • containerPort: 15090
    • Envoy 프록시의 HTTP 메트릭 포트입니다. Prometheus와 같은 모니터링 도구에서 메트릭을 수집하는 데 사용됩니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get deploy/istio-ingressgateway -n istio-system -o jsonpath={.spec.template.spec.containers[0].ports[*]} | jq
{
  "containerPort": 15021,
  "protocol": "TCP"
}
{
  "containerPort": 8080,
  "protocol": "TCP"
}
{
  "containerPort": 8443,
  "protocol": "TCP"
}
{
  "containerPort": 31400,
  "protocol": "TCP"
}
{
  "containerPort": 15443,
  "protocol": "TCP"
}
{
  "containerPort": 15090,
  "name": "http-envoy-prom",
  "protocol": "TCP"
}

🧿 Istio Ingress Gateway의 컨테이너에서 사용하는 readiness probe에 대한 정보를 JSON 형식 출

  • Readiness probe는 Kubernetes에서 Pod가 트래픽을 받을 준비가 되었는지를 확인하기 위해 사용
  • failureThreshold: 30
    • readiness probe가 실패로 간주되기까지의 최대 실패 횟수입니다. 이 값에 도달하면 Pod는 "not ready" 상태로 간주되어 트래픽을 받지 않습니다..
  • httpGet:
    • path: /healthz/ready
      • readiness probe가 호출할 HTTP 경로입니다. 이 경로에서 응답이 성공적이어야 Pod가 "ready" 상태로 간주됩니다.
    • port: 15021
      • readiness probe가 요청을 보낼 포트입니다. 이 경우, Ingress Gateway의 상태를 확인하는 포트입니다.
    • scheme: HTTP
      • 사용되는 프로토콜입니다. 이 경우 HTTP를 사용합니다.
  • initialDelaySeconds: 1
    • 컨테이너가 시작된 후 readiness probe가 처음으로 실행되기까지의 대기 시간입니다. 이 경우, 1초 후에 첫 번째 체크가 수행됩니다.
  • periodSeconds: 2
    • readiness probe가 체크되는 주기입니다. 이 경우, 2초마다 readiness probe가 실행됩니다.
  • successThreshold: 1
    • Pod가 "ready" 상태로 간주되기 위해 필요한 성공적인 응답 횟수입니다. 이 경우, 단 한 번의 성공적인 응답으로 충분합니다.
  • timeoutSeconds: 1
    • readiness probe에 대한 요청이 타임아웃되기까지의 시간입니다. 이 경우, 1초 이내에 응답이 오지 않으면 실패로 간주됩니다.
(⎈|default:N/A) root@k3s-s:~# kubectl get deploy/istio-ingressgateway -n istio-system -o jsonpath={.spec.template.spec.containers[0].readinessProbe} | jq
{
  "failureThreshold": 30,
  "httpGet": {
    "path": "/healthz/ready",
    "port": 15021,
    "scheme": "HTTP"
  },
  "initialDelaySeconds": 1,
  "periodSeconds": 2,
  "successThreshold": 1,
  "timeoutSeconds": 1
}

🧿 Istio의 제어 평면을 담당하는 Istiod 컨테이너 내부에서 활성화된 TCP 소켓의 상태를 확인

  • Istiod가 사용하는 포트와 그 포트에 바인딩된 프로세스에 대한 정보를 제공
    • 15010: Istiod의 gRPC 메트릭 포트로, Envoy 프록시와의 통신에 사용됩니다.
    • 15012: XDS (Envoy Discovery Service) 포트로, Envoy 프록시가 제어 평면과 통신할 때 사용됩니다.
    • 15014: HTTPS 포트로, 보안된 XDS 통신에 사용됩니다.
    • 15017: mTLS 통신을 위한 포트입니다.
    • 8080: 일반 HTTP 요청을 처리하는 포트입니다.
  • Istiod는 여러 포트를 통해 Envoy 프록시와 통신하며, 이를 통해 Istio의 서비스 메시를 관리합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istiod -n istio-system -- ss -tnlp
State         Recv-Q        Send-Q               Local Address:Port                Peer Address:Port       Process
LISTEN        0             4096                     127.0.0.1:9876                     0.0.0.0:*           users:(("pilot-discovery",pid=1,fd=8))
LISTEN        0             4096                             *:15010                          *:*           users:(("pilot-discovery",pid=1,fd=11))
LISTEN        0             4096                             *:15014                          *:*           users:(("pilot-discovery",pid=1,fd=9))
LISTEN        0             4096                             *:15012                          *:*           users:(("pilot-discovery",pid=1,fd=10))
LISTEN        0             4096                             *:15017                          *:*           users:(("pilot-discovery",pid=1,fd=12))
LISTEN        0             4096                             *:8080                           *:*           users:(("pilot-discovery",pid=1,fd=3))

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istiod -n istio-system -- ss -tnp
State      Recv-Q      Send-Q                 Local Address:Port                     Peer Address:Port       Process
ESTAB      0           0                         172.16.0.3:39912                     10.10.200.1:443         users:(("pilot-discovery",pid=1,fd=7))
ESTAB      0           0                [::ffff:172.16.0.3]:15012             [::ffff:172.16.0.5]:53670       users:(("pilot-discovery",pid=1,fd=15))
ESTAB      0           0                [::ffff:172.16.0.3]:15012             [::ffff:172.16.0.5]:53660       users:(("pilot-discovery",pid=1,fd=14))

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istiod -n istio-system -- ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
istio-p+       1       0  0 11:08 ?        00:00:02 /usr/local/bin/pilot-discovery discovery --monitoringAddr=:15014 --log_output_level=default:info --doma
istio-p+      27       0  0 11:13 pts/0    00:00:00 ps -ef

🧿 Istio의 ingress gateway istio-ingressgateway 내부에서 네트워크 소켓의 상태를 확인

  • Ingress Gateway: 클러스터 외부에서 들어오는 트래픽을 처리하는 데 사용됩니다. Envoy 프록시는 이 트래픽을 수신하고 처리하여 내부 서비스로 라우팅합니다.
    • envoy:
      • 포트 15021: Envoy 프록시가 HTTP 및 gRPC 트래픽을 수신하는 기본 포트입니다. 두 개의 소켓이 LISTEN 상태이며, 동일한 프로세스(PID 15)가 이 포트를 사용 중입니다.
      • 포트 15090: Envoy의 HTTP 메트릭스 수집 포트입니다. 이 포트도 두 개의 소켓이 LISTEN 상태입니다.
    • pilot-agent:
      • 포트 15004: Envoy와 Istiod 간의 연결을 관리하는 pilot-agent가 사용하는 포트입니다.
      • 포트 15000: Envoy가 사용 중인 포트로, Envoy의 관리 엔드포인트입니다.
    • *:15020:
      • *로 표시된 포트는 모든 주소에서 수신 대기 중인 포트입니다. 여기서 사용하는 프로세스 정보는 표시되지 않았습니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- ss -tnlp
State         Recv-Q        Send-Q                Local Address:Port                  Peer Address:Port        Process
LISTEN        0             4096                        0.0.0.0:15021                      0.0.0.0:*            users:(("envoy",pid=15,fd=23))
LISTEN        0             4096                        0.0.0.0:15021                      0.0.0.0:*            users:(("envoy",pid=15,fd=22))
LISTEN        0             4096                        0.0.0.0:15090                      0.0.0.0:*            users:(("envoy",pid=15,fd=21))
LISTEN        0             4096                        0.0.0.0:15090                      0.0.0.0:*            users:(("envoy",pid=15,fd=20))
LISTEN        0             4096                      127.0.0.1:15004                      0.0.0.0:*            users:(("pilot-agent",pid=1,fd=12))
LISTEN        0             4096                      127.0.0.1:15000                      0.0.0.0:*            users:(("envoy",pid=15,fd=18))
LISTEN        0             4096                              *:15020                            *:*            users:(("pilot-agent",pid=1,fd=3))

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- ss -tnp
State Recv-Q Send-Q      Local Address:Port        Peer Address:Port Process
ESTAB 0      0               127.0.0.1:34630          127.0.0.1:15020 users:(("envoy",pid=15,fd=34))
ESTAB 0      0              172.16.0.5:53670      10.10.200.196:15012 users:(("pilot-agent",pid=1,fd=14))
ESTAB 0      0               127.0.0.1:33214          127.0.0.1:15020 users:(("envoy",pid=15,fd=36))
ESTAB 0      0              172.16.0.5:53660      10.10.200.196:15012 users:(("pilot-agent",pid=1,fd=9))
ESTAB 0      0      [::ffff:127.0.0.1]:15020 [::ffff:127.0.0.1]:34630 users:(("pilot-agent",pid=1,fd=16))
ESTAB 0      0      [::ffff:127.0.0.1]:15020 [::ffff:127.0.0.1]:33214 users:(("pilot-agent",pid=1,fd=18))

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
istio-p+       1       0  0 11:08 ?        00:00:00 /usr/local/bin/pilot-agent p
istio-p+      15       1  0 11:08 ?        00:00:01 /usr/local/bin/envoy -c etc/
istio-p+      45       0  0 11:14 pts/0    00:00:00 ps -ef

🧿 Istio Ingress Gateway에서 Envoy의 구성 파일

  •  Envoy의 설정 및 현재 상태에 대한 정보를 포함합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- cat /etc/istio/proxy/envoy-rev.json
{
  "application_log_config": {
    "log_format": {
        "text_format": "%Y-%m-%dT%T.%fZ\t%l\tenvoy %n %g:%#\t%v\tthread=%t"
    }
  },
  "node": {
    "id": "router~172.16.0.5~istio-ingressgateway-5f9f654d46-tb2tl.istio-system~istio-system.svc.cluster.local",
    "cluster": "istio-ingressgateway.istio-system",
    "locality": {
    },
    "metadata": {"ANNOTATIONS":{"istio.io/rev":"default","kubernetes.io/config.seen":"2024-10-15T20:08:26.829038201+09:00","kubernetes.io/config.source":"api","prometheus.io/path":"/stats/prometheus","prometheus.io/port":"15020","prometheus.io/scrape":"true","sidecar.istio.io/inject":"false"},"CLUSTER_ID":"Kubernetes","ENVOY_PROMETHEUS_PORT":15090,"ENVOY_STATUS_PORT":15021,"INSTANCE_IPS":"172.16.0.5","ISTIO_PROXY_SHA":"6c72b2179f5a58988b920a55b0be8346de3f7b35","ISTIO_VERSION":"1.23.2","LABELS":{"app":"istio-ingressgateway","chart":"gateways","heritage":"Tiller","install.operator.istio.io/owning-resource":"unknown","istio":"ingressgateway","istio.io/rev":"default","operator.istio.io/component":"IngressGateways","release":"istio","service.istio.io/canonical-name":"istio-ingressgateway","service.istio.io/canonical-revision":"latest","sidecar.istio.io/inject":"false"},"MESH_ID":"cluster.local","NAME":"istio-ingressgateway-5f9f654d46-tb2tl","NAMESPACE":"istio-system","NODE_NAME":"k3s-s","OWNER":"kubernetes://apis/apps/v1/namespaces/istio-system/deployments/istio-ingressgateway","PILOT_SAN":["istiod.istio-system.svc"],"PROXY_CONFIG":{"binaryPath":"/usr/local/bin/envoy","concurrency":2,"configPath":"./etc/istio/proxy","controlPlaneAuthPolicy":"MUTUAL_TLS","discoveryAddress":"istiod.istio-system.svc:15012","drainDuration":"45s","proxyAdminPort":15000,"serviceCluster":"istio-proxy","statNameLength":189,"statusPort":15020,"terminationDrainDuration":"5s"},"SERVICE_ACCOUNT":"istio-ingressgateway-service-account","UNPRIVILEGED_POD":"true","WORKLOAD_NAME":"istio-ingressgateway"}
  },
  "layered_runtime": {
      "layers": [
          {
            "name": "global config",
            "static_layer": {"envoy.deprecated_features:envoy.config.listener.v3.Listener.hidden_envoy_deprecated_use_original_dst":true,"envoy.reloadable_features.http_reject_path_with_fragment":false,"overload.global_downstream_max_connections":"2147483647","re2.max_program_size.error_level":"32768"}
          },
          {
              "name": "admin",
              "admin_layer": {}
          }
      ]
  },
  "bootstrap_extensions": [
    {
      "name": "envoy.bootstrap.internal_listener",
      "typed_config": {
        "@type":"type.googleapis.com/udpa.type.v1.TypedStruct",
        "type_url": "type.googleapis.com/envoy.extensions.bootstrap.internal_listener.v3.InternalListener",
        "value": {
          "buffer_size_kb": 64
        }
      }
    }
  ],
  ...

🧿 Istio Ingress Gateway의 Envoy 프록시에서 Unix 소켓을 사용하여 수신 대기 중인 포트 확인

  • var/run/secrets/workload-spiffe-uds/socket:
    • 이 소켓은 Istio의 SPIFFE 기반 인증을 위한 Unix 소켓입니다.
    • Istio의 "workload" 인증을 위해 사용되며, 서비스 간의 안전한 통신을 지원합니다.
  • etc/istio/proxy/XDS:
    • 이 소켓은 XDS(Envoy의 서비스 탐색 서비스)에 대한 소켓입니다.
    • Envoy가 Istiod와 통신하여 구성 업데이트를 수신하는 데 사용됩니다.
  • Istio의 SPIFFE 및 XDS:
    • SPIFFE: Istio는 서비스 간의 인증을 위해 SPIFFE를 사용하여 안전한 통신을 보장합니다. var/run/secrets/workload-spiffe-uds/socket 경로의 소켓은 서비스 메쉬 내에서 인증 및 권한 부여를 관리하는 데 사용됩니다.
    • XDS: Envoy는 XDS를 통해 Istiod와 통신하여 구성을 동적으로 업데이트합니다. etc/istio/proxy/XDS 소켓은 Envoy가 Istiod로부터 서비스 발견 및 구성을 받는 데 사용됩니다.
  •  Istio Ingress Gateway가 SPIFFE 기반 인증 및 XDS를 통해 Istiod와 통신합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- ss -xnlp
Netid State  Recv-Q Send-Q                              Local Address:Port  Peer Address:PortProcess
u_str LISTEN 0      4096   var/run/secrets/workload-spiffe-uds/socket 47026            * 0    users:(("pilot-agent",pid=1,fd=8))
u_str LISTEN 0      4096                          etc/istio/proxy/XDS 47027            * 0    users:(("pilot-agent",pid=1,fd=10))

(⎈|default:N/A) root@k3s-s:~# kubectl exec -it deployment.apps/istio-ingressgateway -n istio-system -- ss -xnp
Netid State Recv-Q Send-Q                              Local Address:Port  Peer Address:Port Process
u_str ESTAB 0      0                                               * 48639            * 48640 users:(("envoy",pid=15,fd=32))
u_str ESTAB 0      0      var/run/secrets/workload-spiffe-uds/socket 48640            * 48639 users:(("pilot-agent",pid=1,fd=15))
u_str ESTAB 0      0                                               * 47031            * 48636 users:(("envoy",pid=15,fd=19))
u_str ESTAB 0      0                             etc/istio/proxy/XDS 48636            * 47031 users:(("pilot-agent",pid=1,fd=11))

🧿 기본 네임스페이스(default)에 istio-injection=enabled 레이블을 추가

  • kubectl label namespace default istio-injection=enabled:
    • 이 명령어는 default 네임스페이스에 istio-injection 레이블을 추가하고 값을 enabled로 설정합니다.
    • 사이드카 프록시가 자동으로 주입될 수 있도록 설정하는 역할을 합니다.
  • Istio의 사이드카 프록시(Envoy)를 기본 네임스페이스 내의 모든 Pod에 자동으로 주입하도록 지정합니다.
(⎈|default:N/A) root@k3s-s:~# kubectl label namespace default istio-injection=enabled
namespace/default labeled

(⎈|default:N/A) root@k3s-s:~# kubectl get ns -L istio-injection
NAME              STATUS   AGE     ISTIO-INJECTION
default           Active   75m     enabled
istio-system      Active   9m24s
kube-node-lease   Active   75m
kube-public       Active   75m
kube-system       Active   75m

🧿 istio-ingressgateway 서비스의 HTTP 포트 번호를 환경 변수 IGWHTTP에 저장

(⎈|default:N/A) root@k3s-s:~# export IGWHTTP=$(kubectl get service -n istio-system istio-ingressgateway -o jsonpath='{.spec.ports[1].nodePort}')
(⎈|default:N/A) root@k3s-s:~# echo $IGWHTTP
30293

🧿 실행 중인 인스턴스들의 공인 IP 주소 확인

ssoon@DESKTOP-UQRJB87 MINGW64 ~
$ aws ec2 describe-instances --query "Reservations[*].Instances[*].{PublicIPAdd:PublicIpAddress,InstanceName:Tags[?Key=='Name']|[0].Value,Status:State.Name}" --filters Name=instance-state-name,Values=running --output text
k3s-w1  3.36.120.74     running
testpc  54.180.251.50   running
k3s-s   3.38.214.243    running
k3s-w2  54.180.230.224  running

🧿 [ k3s-s ] 도메인 설정을 업데이트하고, 환경 변수를 시스템 프로필에 추가

  • MYDOMAIN이라는 환경 변수를 www.ssoon.dev로 설정
  • /etc/hosts  파일에 192.168.10.10 www.ssoon.dev 항목을 추가
  • /etc/profile 파일에 MYDOMAIN 변수를 추가하여, 시스템이 시작될 때마다 이 변수가 자동으로 설정
(⎈|default:N/A) root@k3s-s:~# export MYDOMAIN=www.ssoon.dev
(⎈|default:N/A) root@k3s-s:~# echo -e "192.168.10.10 $MYDOMAIN" >> /etc/hosts
(⎈|default:N/A) root@k3s-s:~# echo -e "export MYDOMAIN=$MYDOMAIN" >> /etc/profile

🧿[ k3s-s ] curl 명령어를 사용하여 설정한 도메인(http://www.ssoon.dev)과 포트(30293)에 접근

  • "Connection refused" 오류가 발생
(⎈|default:N/A) root@k3s-s:~# curl -v -s $MYDOMAIN:$IGWHTTP
*   Trying 192.168.10.10:30293...
* connect to 192.168.10.10 port 30293 failed: Connection refused
* Failed to connect to www.ssoon.dev port 30293 after 2 ms: Connection refused
* Closing connection 0

🧿 [ testpc ]  도메인 설정을 업데이트하고, 환경 변수를 시스템 프로필에 추가

root@testpc:~# IGWHTTP=30293
root@testpc:~# export MYDOMAIN=www.ssoon.dev
root@testpc:~# echo -e "192.168.10.10 $MYDOMAIN" >> /etc/hosts
root@testpc:~# echo -e "export MYDOMAIN=$MYDOMAIN" >> /etc/profile

🧿[ testpc ]  curl 명령어를 사용하여 설정한 도메인(http://www.ssoon.dev)과 포트(30293)에 접근

  • "Connection refused" 오류가 발생
root@testpc:~# curl -v -s $MYDOMAIN:$IGWHTTP
*   Trying 192.168.10.10:30293...
* connect to 192.168.10.10 port 30293 failed: Connection refused
* Failed to connect to www.ssoon.dev port 30293 after 2 ms: Connection refused
* Closing connection 0

 

Comments