์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๋ ธ์ถ
๊ฐ์
Cloud Service Mesh๋ฅผ ์ฌ์ฉํ๋ฉด ์๋น์ค ๋ฉ์์ ์ผ๋ถ๋ก ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ(ํด๋ฌ์คํฐ ์ธ๋ถ์ ์๋ ๋ฌผ๋ฆฌ์ ๋๋ ์ํํธ์จ์ด ๋ถํ ๋ถ์ฐ๊ธฐ)๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ํฝ์ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ก ์ ์กํด Cloud Service Mesh๋ก ํด๋ฌ์คํฐ ๋ถํ ๋ถ์ฐ์ ์ถ๊ฐ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ด ํ์ด์ง์์๋ Cloud Service Mesh๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋๋ ์ฌ๋ฌ ๋ฐฑ์๋ ๊ตฌ์ฑ์ผ๋ก ์ธ๊ทธ๋ ์ค๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
์์ํ๊ธฐ ์ ์
์ด ๋ฌธ์์ ๋จ๊ณ๋ฅผ ์๋ฃํ๋ ค๋ฉด ๋ค์ ๋ฆฌ์์ค๊ฐ ํ์ํฉ๋๋ค.
Cloud Service Mesh๊ฐ ์ค์น๋ Kubernetes ํด๋ฌ์คํฐ
ํด๋ฌ์คํฐ๊ฐ ์คํ ์ค์ธ ๋ ธ๋์ ์ก์ธ์คํ ์ ์๋ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ. ์ด ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๊ฐ ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ์์ํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
ํ๊ฒฝ ์ค์ ํ๊ธฐ
์ฌ์ฉํ๋ ค๋ ํด๋ฌ์คํฐ์ ์ก์ธ์คํ ์ ์๋ ์ํฌ์คํ
์ด์
์์ ๋ค์ ๋ช
๋ น์ด๋ฅผ ์คํํฉ๋๋ค. kubectl
๋๊ตฌ๊ฐ ํด๋ฌ์คํฐ์ ๋ํ ํด๋ฌ์คํฐ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํฉ๋๋ค.
ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ๊ณ ,
export ASM_INGRESSGATEWAY_NAMESPACE=asm-ingressgateway export ASM_INGRESSGATEWAY_DEPLOYMENT_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_SERVICE_NAME=asm-ingressgateway export ASM_INGRESSGATEWAY_NODE_LABEL=asm-ingressgateway
์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ์
IP address
๋ฅผ ์ค์ ํฉ๋๋ค.export EXTERNAL_LB_IP_ADDRESS=EXTERNAL_LB_IP_ADDRESS
[\์ ํ์ฌํญ/] ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๋ ธ๋์ ๋ผ๋ฒจ์ ์ง์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๊ฒ์ดํธ์จ์ด๊ฐ ํด๋ฌ์คํฐ์ ํน์ ๋ ธ๋์ ๋ฐฐํฌ๋ฉ๋๋ค.
kubectl label nodes INGRESSGATEWAY_NODE_IP ${ASM_INGRESSGATEWAY_NODE_LABEL}=
- INGRESSGATEWAY_NODE_IP: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ํธ์คํ
ํ๋ Kubernetes ํด๋ฌ์คํฐ์ ๋
ธ๋์
๋๋ค.
kubectl
๋ช ๋ น์ด๋ฅผ ๋ณด์ ํ ์ธ๊ทธ๋ ์ค ๋ ธ๋ ์๋งํผ ์คํํฉ๋๋ค.
- INGRESSGATEWAY_NODE_IP: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ํธ์คํ
ํ๋ Kubernetes ํด๋ฌ์คํฐ์ ๋
ธ๋์
๋๋ค.
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๋ง๋ค๊ธฐ
์ด ์น์ ์ ์๋ด๋ฅผ ์๋ฃํ๊ธฐ ์ ์ ์ปจํธ๋กค ํ๋ ์ธ ๊ตฌํ์ ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ปจํธ๋กค ํ๋ ์ธ ๊ตฌํ ์๋ณ์ ์๋ด๋ฅผ ์ํํฉ๋๋ค.
๋ค์์คํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค. ์ด ๋ค์์คํ์ด์ค๋ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
kubectl create namespace ${ASM_INGRESSGATEWAY_NAMESPACE}
๋ค์์คํ์ด์ค์ ์ฝ์ ์ ์ฌ์ฉ ์ค์ ํฉ๋๋ค. ์ด ๋จ๊ณ๋ ์ปจํธ๋กค ํ๋ ์ธ ๊ตฌํ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
๊ด๋ฆฌํ(TD)
- ๊ธฐ๋ณธ ์ฝ์ ๋ผ๋ฒจ์ ๋ค์์คํ์ด์ค์ ์ ์ฉํฉ๋๋ค.
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
๊ด๋ฆฌํ(Istiod)
๊ถ์ฅ: ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ค์์คํ์ด์ค์ ๊ธฐ๋ณธ ์ฝ์ ๋ผ๋ฒจ์ ์ ์ฉํฉ๋๋ค.
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
๊ด๋ฆฌํ Istiod ์ปจํธ๋กค ํ๋ ์ธ์ด ์๋ ๊ธฐ์กด ์ฌ์ฉ์: ๊ธฐ๋ณธ ์ฝ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง๋ง ๋ฒ์ ๊ธฐ๋ฐ ์ฝ์ ์ ์ง์๋ฉ๋๋ค. ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ ์ถ์ ์ฑ๋์ ์ฐพ์ต๋๋ค.
kubectl -n istio-system get controlplanerevision
์ถ๋ ฅ์ ๋ค์๊ณผ ๋น์ทํฉ๋๋ค.
NAME AGE asm-managed-rapid 6d7h
์ฐธ๊ณ : ์ ๋ชฉ๋ก์ ๋ ๊ฐ์ ์ปจํธ๋กค ํ๋ ์ธ ๋ฒ์ ์ด ํ์๋๋ฉด ํ๋๋ฅผ ์ญ์ ํฉ๋๋ค. ํด๋ฌ์คํฐ์ ์ฌ๋ฌ ์ปจํธ๋กค ํ๋ ์ธ ์ฑ๋์ ๋๋ ๋ฐฉ์์ ์ง์๋์ง ์์ต๋๋ค.
์ถ๋ ฅ์์
NAME
์ด ์๋์ ๊ฐ์ Cloud Service Mesh ๋ฒ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ถ์ ์ฑ๋์ ํด๋นํ๋ ๋ฒ์ ๋ผ๋ฒจ์ ๋๋ค.๋ค์์คํ์ด์ค์ ๋ฒ์ ๋ผ๋ฒจ์ ์ ์ฉํฉ๋๋ค.
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
ํด๋ฌ์คํฐ ๋ด
๊ถ์ฅ: ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ค์์คํ์ด์ค์ ๊ธฐ๋ณธ ์ฝ์ ๋ผ๋ฒจ์ ์ ์ฉํฉ๋๋ค.
kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio.io/rev- istio-injection=enabled --overwrite
๊ธฐ๋ณธ ์ฝ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ง๋ง ๋ฒ์ ๊ธฐ๋ฐ ์ฝ์ ์ด ์ง์๋ฉ๋๋ค. ๋ค์ ์๋ด๋ฅผ ๋ฐ๋ฅด์ธ์.
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ
istiod
์์ ๋ฒ์ ๋ผ๋ฒจ์ ์ฐพ์ต๋๋ค.kubectl get deploy -n istio-system -l app=istiod -o \ jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
๋ค์์คํ์ด์ค์ ๋ฒ์ ๋ผ๋ฒจ์ ์ ์ฉํฉ๋๋ค. ๋ค์ ๋ช ๋ น์ด์์
REVISION_LABEL
์ ์ด์ ๋จ๊ณ์์ ํ์ธํistiod
๋ฒ์ ๋ผ๋ฒจ์ ๊ฐ์ ๋๋ค.kubectl label namespace ${ASM_INGRESSGATEWAY_NAMESPACE} \ istio-injection- istio.io/rev=REVISION_LABEL --overwrite
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๋งค๋ํ์คํธ ํ์ผ์ ์ ์ฉํฉ๋๋ค.
kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} apply --filename https://raw.githubusercontent.com/GoogleCloudPlatform/anthos-service-mesh-samples/main/docs/ingress-gateway-external-lb/ingress-gateway.yaml
์์ ์ถ๋ ฅ:
serviceaccount/asm-ingressgateway created role.rbac.authorization.k8s.io/asm-ingressgateway created rolebinding.rbac.authorization.k8s.io/asm-ingressgateway created deployment.apps/asm-ingressgateway created service/asm-ingressgateway created poddisruptionbudget.policy/asm-ingressgateway created horizontalpodautoscaler.autoscaling/asm-ingressgateway created
ingressgateway
์๋น์ค๋ฅผ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ IP ์ฃผ์๋ก ํจ์นํฉ๋๋ค.cat <<EOF > asm-external-ip-patch.yaml spec: externalIPs: - ${EXTERNAL_LB_IP_ADDRESS} loadBalancerIP: ${EXTERNAL_LB_IP_ADDRESS} EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --patch "$(cat asm-external-ip-patch.yaml)"
[์ ํ์ฌํญ] ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๋ ธ๋ ๋ผ๋ฒจ ์ดํผ๋ํฐ์ ๋ํ
ingressgateway
๋ฐฐํฌ๋ฅผ ํจ์นํฉ๋๋ค.cat <<EOF > asm-ingress-node-label-patch.yaml spec: template: spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ${ASM_INGRESSGATEWAY_NODE_LABEL} operator: Exists EOF kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} patch deployment/${ASM_INGRESSGATEWAY_DEPLOYMENT_NAME} --patch "$(cat asm-ingress-node-label-patch.yaml)"
์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ ์ค์
์ด ์น์ ์์๋ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ๊ฐ ํด๋ฌ์คํฐ์์ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ ์ฐ๊ฒฐ๋๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด Service
ํฌํธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
NodePorts
๋ฅผ ๊ฐ์ ธ์ต๋๋ค.export HTTP_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}') export HTTPS_INGRESS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="https")].nodePort}') export STATUS_PORT=$(kubectl --namespace ${ASM_INGRESSGATEWAY_NAMESPACE} get service/${ASM_INGRESSGATEWAY_SERVICE_NAME} --output jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
NodePorts
๋ฅผ ํ์ํฉ๋๋ค.echo HTTP_INGRESS_PORT=${HTTP_INGRESS_PORT} echo HTTPS_INGRESS_PORT=${HTTPS_INGRESS_PORT} echo STATUS_PORT=${STATUS_PORT}
์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ ๊ตฌ์ฑ
์ด์ ๋จ๊ณ์ ํ์๋ NodePorts
๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด ๊ฐ์ ์ฐ๊ฒฐ์ ๊ตฌ์ฑํฉ๋๋ค.
๋ถํ ๋ถ์ฐ๊ธฐ ๊ตฌ์ฑ์์ ์ํ ์ ๊ฒ์ ๊ตฌ์ฑํฉ๋๋ค.
hosts: CLUSTER_NODE_IP Protocol: HTTP Port: STATUS_PORT Path: /healthz/ready
CLUSTER_NODE_IP: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ํธ์คํ ํ๋ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ๋ ธ๋์ IP ์ฃผ์์ ๋๋ค. ์ด IP ์ฃผ์๋ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ์์ ์ฐ๊ฒฐํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด ๊ตฌ์ฑ์ ํด๋ฌ์คํฐ ๋ ธ๋๋น ํ ๋ฒ์ฉ ์ฌ๋ฌ ๋ฒ ์ค์ ํด์ผ ํ ์ ์์ต๋๋ค.
STATUS_PORT: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ ์ํ API๊ฐ ๋ ธ์ถ๋๋
NodePort
์ ๋๋ค. ์ด์ ๋จ๊ณ์์ ์ด ์ ๋ณด๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ฐ์ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ๋์ผํฉ๋๋ค.
HTTP
๋ฐHTTPS
ํธ๋ํฝ์ ๋ผ์ฐํ ํ๋๋ก ๋ถํ ๋ถ์ฐ๊ธฐ์์ ๋ ธ๋ ํ์ ๊ตฌ์ฑํฉ๋๋ค. ํฌํธ 80(HTTP
) ๋ฐ ํฌํธ 443(HTTPS
)์์ ํธ๋ํฝ์ ๋ค์IP:PORT
๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค.80 -> CLUSTER_NODE_IP:HTTP_INGRESS_PORT 443 -> CLUSTER_NODE_IP:HTTPS_INGRESS_PORT
CLUSTER_NODE_IP: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด๋ฅผ ํธ์คํ ํ๋ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ๋ ธ๋์ IP ์ฃผ์์ ๋๋ค. ์ด IP ์ฃผ์๋ ์ธ๋ถ ๋ถํ ๋ถ์ฐ๊ธฐ์์ ์ฐ๊ฒฐํ ์ ์์ด์ผ ํฉ๋๋ค. ์ด ๊ตฌ์ฑ์ ํด๋ฌ์คํฐ ๋ ธ๋๋น ํ ๋ฒ์ฉ ์ฌ๋ฌ ๋ฒ ์ค์ ํด์ผ ํ ์ ์์ต๋๋ค.
HTTP_INGRESS_PORT: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ HTTP ํธ๋ํฝ์ด ๋ ธ์ถ๋๋
NodePort
์ ๋๋ค. ์ด์ ๋จ๊ณ์์ ์ด ์ ๋ณด๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ฐ์ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ๋์ผํฉ๋๋ค.HTTPS_INGRESS_PORT: ์ธ๊ทธ๋ ์ค ๊ฒ์ดํธ์จ์ด์ HTTPS ํธ๋ํฝ์ด ๋ ธ์ถ๋๋
NodePort
์ ๋๋ค. ์ด์ ๋จ๊ณ์์ ์ด ์ ๋ณด๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ฐ์ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋ ธ๋์์ ๋์ผํฉ๋๋ค.
์ค์ ์ ํ์ธํ๋ ค๋ฉด ๋ถํ ๋ถ์ฐ๊ธฐ์ ์ํ ์ ๊ฒ์ ํต๊ณผํ๋์ง ํ์ธํฉ๋๋ค.
๋ค์ ๋จ๊ณ
- ๊ฒ์ดํธ์จ์ด ์ค์น ๋ฐ ์ ๊ทธ๋ ์ด๋์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ