Ssoon
[7주차] Service Mesh : Istio 설치 (Sidecar mode) 본문
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의 트래픽 라우팅 및 서비스 디스커버리 기능을 제공합니다.
- base:
(⎈|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도 활성화되어 있습니다. 외부의 요청을 클러스터 내부로 받아들이는 기능을 제공합니다.
- base:
(⎈|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를 사용합니다.
- path: /healthz/ready
- 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:
- *로 표시된 포트는 모든 주소에서 수신 대기 중인 포트입니다. 여기서 사용하는 프로세스 정보는 표시되지 않았습니다.
- envoy:
(⎈|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
'쿠버네티스 네트워크 스터디 3기' 카테고리의 다른 글
[7주차] Service Mesh : Bookinfo 실습 & Istio 기능 (0) | 2024.10.15 |
---|---|
[7주차] Service Mesh : Istio 통한 외부 노출 (0) | 2024.10.15 |
[6주차] Gateway API (0) | 2024.10.08 |
[6주차] Ingress (0) | 2024.10.07 |
[5주차] IPVS (0) | 2024.10.03 |
Comments