Google Kubernetes Engine ๋ฐ ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ์„œ๋น„์Šค ์„ค์ •

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Google Kubernetes Engine, gRPC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, Cloud Service Mesh์— ํ•„์š”ํ•œ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์˜ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด๊ธฐ ์ „์— ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ์„œ๋น„์Šค๋กœ Cloud Service Mesh ์„ค์ • ์ค€๋น„๋ฅผ ๊ฒ€ํ† ํ•˜์„ธ์š”.

๊ฐœ์š”

GKE ๋ฐ ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ์„œ๋น„์Šค๋กœ Cloud Service Mesh๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. GKE ํด๋Ÿฌ์Šคํ„ฐ ์ค€๋น„
  2. gRPC ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Kubernetes ์„œ๋น„์Šค๋กœ ๋ฐฐํฌ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน(NEG)์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค๋„๋ก GKE ๋ฐฐํฌ ์‚ฌ์–‘์— ์ฃผ์„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. NEG ๋ฐ ๊ธฐํƒ€ Google Cloud ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Service Mesh ๊ตฌ์„ฑ
  4. ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ gRPC ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํŠธ๋ž˜ํ”ฝ์„ ์ „์†กํ•˜์—ฌ ๋ฐฐํฌ๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Cloud Service Mesh์šฉ GKE ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ

์ด ์„น์…˜์—์„œ๋Š” Cloud Service Mesh์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

GKE ํด๋Ÿฌ์Šคํ„ฐ ์š”๊ตฌ์‚ฌํ•ญ

GKE ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

GKE ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” us-central1-a zone์—์„œ grpc-td-cluster๋ผ๋Š” GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ฝ˜์†”

Google Cloud ์ฝ˜์†”์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. Google Cloud ์ฝ˜์†”์—์„œ Kubernetes Engine ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Google Kubernetes Engine ๋ฉ”๋‰ด๋กœ ์ด๋™

  2. ํด๋Ÿฌ์Šคํ„ฐ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ํ‘œ์ค€ ํด๋Ÿฌ์Šคํ„ฐ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์›Œํฌ๋กœ๋“œ์— ์ ํ•ฉํ•œ ํ…œํ”Œ๋ฆฟ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  4. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์„ ๋งž์ถค์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ•„๋“œ๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.

    • ์ด๋ฆ„: grpc-td-cluster๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
    • ์œ„์น˜ ์œ ํ˜•: Zonal
    • ์˜์—ญ: us-central1-a
    • ๋…ธ๋“œ ํ’€:
  5. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ default-pool์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  6. ์ด๋ฆ„์„ grpc-td-cluster๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  7. ํฌ๊ธฐ์— ๋งŒ๋“ค ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ ๋ฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค(์˜ˆ: ๋ฐฉํ™”๋ฒฝ ๊ฒฝ๋กœ)์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค ํ• ๋‹น๋Ÿ‰์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  8. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ ๋…ธ๋“œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  9. ๋จธ์‹  ๊ตฌ์„ฑ์˜ ๋จธ์‹  ๊ณ„์—ด์—์„œ ์ปดํ“จํŒ… ์ตœ์ ํ™”๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  10. ๋จธ์‹  ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋จธ์‹  ์œ ํ˜• ๊ฐ€๊ฒฉ ์ฑ…์ • ์ •๋ณด๋Š” Compute Engine ๊ฐ€๊ฒฉ ์ฑ…์ • ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  11. ๋„คํŠธ์›Œํ‚น์—์„œ ๋„คํŠธ์›Œํฌ ํƒœ๊ทธ allow-health-checks๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  12. ์™ผ์ชฝ ๋ฉ”๋‰ด์—์„œ ๋…ธ๋“œ ๋ณด์•ˆ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  13. ์•ก์„ธ์Šค ๋ฒ”์œ„์—์„œ ๋ชจ๋“  Cloud API์— ๋Œ€ํ•œ ์ „์ฒด ์•ก์„ธ์Šค ํ—ˆ์šฉ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  14. ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“  ํ›„ ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ ค๋ฉด kubectl์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ kubeconfig ํ•ญ๋ชฉ ์ƒ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

gcloud

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud container clusters create grpc-td-cluster \
   --zone us-central1-a \
   --scopes=https://www.googleapis.com/auth/cloud-platform \
   --tags=allow-health-checks \
   --enable-ip-alias

ํ•„์ˆ˜ GKE ํด๋Ÿฌ์Šคํ„ฐ ๊ถŒํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฉ๊ธˆ ๋งŒ๋“  ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด kubectl์ด ์˜ฌ๋ฐ”๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

gcloud

gcloud container clusters get-credentials grpc-td-cluster \
    --zone us-central1-a

GKE ์„œ๋น„์Šค ๊ตฌ์„ฑ

์ด ์„น์…˜์—์„œ๋Š” Cloud Service Mesh์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก GKE ๋ฐฐํฌ ์‚ฌ์–‘์„ ์ค€๋น„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” NEG ์ฃผ์„์ด ์žˆ๋Š” GKE helloworld ์˜ˆ์‹œ ์„œ๋น„์Šค ๊ตฌ์„ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

helloworld ์˜ˆ์‹œ ์„œ๋น„์Šค๋Š” gRPC ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” gRPC ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. helloworld ์„œ๋น„์Šค์—๋Š” ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๋ชจ๋“  gRPC ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

'ํ”„๋ก์‹œ๋ฆฌ์Šค' ๋ถ€๋ถ„์€ gRPC ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Cloud Service Mesh์— ์—ฐ๊ฒฐํ•  ๋•Œ์—๋งŒ ์ž‘๋™ํ•˜๋ฏ€๋กœ IP ์ฃผ์†Œ๋‚˜ DNS ๊ธฐ๋ฐ˜ ์ด๋ฆ„ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•  ํ•„์š” ์—†์ด helloworld ์„œ๋น„์Šค๋ฅผ ์•Œ์•„๋ณด๊ณ  ํŠธ๋ž˜ํ”ฝ์„ helloworld์™€ ์—ฐ๊ฒฐ๋œ ํฌ๋“œ์— ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

NEG๋กœ GKE ์„œ๋น„์Šค ๊ตฌ์„ฑ

Cloud Service Mesh์—์„œ ์‚ฌ์šฉํ•  GKE ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” NEG๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NEG๋ฅผ ํ†ตํ•ด ๋…ธ์ถœํ•˜๋ ค๋ฉด ๊ฐ ์‚ฌ์–‘์— ๋…ธ์ถœํ•  ํฌํŠธ์™€ ์ผ์น˜ํ•˜๋Š” ๋‹ค์Œ ์ฃผ์„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

...
metadata:
  annotations:
    cloud.google.com/neg: '{"exposed_ports":{"8080":{"name": "example-grpc-server"}}}'

์ด ์ฃผ์„์€ ์„œ๋น„์Šค๋ฅผ ์ฒ˜์Œ ๋ฐฐํฌํ•  ๋•Œ ๋…๋ฆฝํ˜• NEG๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด NEG์—๋Š” ํฌ๋“œ์˜ IP ์ฃผ์†Œ์™€ ํฌํŠธ์ธ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์‹œ๋Š” ๋…๋ฆฝํ˜• ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ํฌํŠธ 8080์œผ๋กœ ์ œ๊ณต๋˜๋Š” helloworld Kubernetes ์„œ๋น„์Šค๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌํŠธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์„œ๋น„์Šค๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ํฌํŠธ์ž…๋‹ˆ๋‹ค. ํฌ๋“œ์˜ gRPC ์„œ๋น„์Šค๋Š” targetPort 50051์—์„œ ๋ฆฌ์Šจํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌํŠธ๋Š” ์š”์ฒญ์ด ์ „์†ก๋˜๋Š” ํฌ๋“œ์˜ ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ port ๋ฐ targetPort๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋™์ผํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์ง€๋งŒ, ์ด ์˜ˆ์‹œ์—์„œ๋Š” NEG ์ฃผ์„์— ์‚ฌ์šฉํ•  ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

cat << EOF > grpc-td-helloworld.yaml
apiVersion: v1
kind: Service
metadata:
  name: helloworld
  annotations:
    cloud.google.com/neg: '{"exposed_ports":{"8080":{"name": "example-grpc-server"}}}'
spec:
  ports:
  - port: 8080
    name: helloworld
    protocol: TCP
    targetPort: 50051
  selector:
    run: app1
  type: ClusterIP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: app1
  name: app1
spec:
  selector:
    matchLabels:
      run: app1
  replicas: 2
  template:
    metadata:
      labels:
        run: app1
    spec:
      containers:
      - image: grpc/java-example-hostname:1.50.2
        name: app1
        ports:
        - protocol: TCP
          containerPort: 50051
EOF
kubectl apply -f grpc-td-helloworld.yaml

์ƒˆ helloworld ์„œ๋น„์Šค๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get svc

kubectl get svc์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

NAME           TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
helloworld     ClusterIP   10.71.9.71   <none>        8080/TCP  41m
[..skip..]

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

kubectl get pods

kubectl get pods์˜ ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

NAME                        READY     STATUS    RESTARTS   AGE
app1-6db459dcb9-zvfg2   1/1       Running   0          6m
app1-6db459dcb9-hlvhj   1/1       Running   0          6m
[..skip..]

NEG ์ด๋ฆ„์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜์†”

๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน์˜ ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด Google Cloud ์ฝ˜์†”์˜ ๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์„ธ์š”. example-grpc-server๋ผ๋Š” NEG๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
๋„คํŠธ์›Œํฌ ์—”๋“œํฌ์ธํŠธ ๊ทธ๋ฃน ํŽ˜์ด์ง€๋กœ ์ด๋™

gcloud

# List the NEGs
gcloud compute network-endpoint-groups list \
    --filter "name=example-grpc-server" --format "value(name)"

# Optionally examine the NEG
gcloud compute network-endpoint-groups describe example-grpc-server \
    --zone us-central1-a

# Optionally examine the endpoint(s) contained
gcloud compute network-endpoint-groups list-network-endpoints example-grpc-server \
    --zone us-central1-a

๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์š”์†Œ๋กœ Cloud Service Mesh ๊ตฌ์„ฑ

์ด ์„น์…˜์—์„œ๋Š” ์„œ๋น„์Šค์— Google Cloud ๋ถ€ํ•˜ ๋ถ„์‚ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์š”์†Œ์—๋Š” ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ๊ฐ€ GKE ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ตฌ์„ฑ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ Cloud Service Mesh ๊ตฌ์„ฑ ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

  • NEG ๋ฐ ๊ธฐํƒ€ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” us-central1-a ์˜์—ญ์˜ ์ž๋™ ๋ชจ๋“œ ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ์—์„œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ NEG ์ด๋ฆ„์€ example-grpc-server์ž…๋‹ˆ๋‹ค.

์ƒํƒœ ํ™•์ธ, ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™ ๋ฐ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

์ด ์„น์…˜์—์„œ๋Š” ์ƒํƒœ ํ™•์ธ ๋ฐ ์ƒํƒœ ํ™•์ธ์šฉ ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ƒํƒœ ํ™•์ธ์€ gRPC ์ƒํƒœ ํ™•์ธ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ ํ™•์ธ ํ”„๋กœ๋ธŒ๊ฐ€ ๋ฐฐํฌ์— ์žˆ๋Š” VM์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --use-serving-port ์ง€์‹œ๋ฌธ์€ ์ƒํƒœ ํ™•์ธ์ด ๊ฐ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ ์ˆ˜์‹  ํฌํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฐฉํ™”๋ฒฝ ๊ทœ์น™์€ ๋„คํŠธ์›Œํฌ์˜ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ˆ˜์‹  ์ƒํƒœ ํ™•์ธ ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” INTERNAL_SELF_MANAGED ๋ฐ ํ”„๋กœํ† ์ฝœ GRPC์˜ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „์—ญ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“  ํ›„ ์ƒํƒœ ํ™•์ธ์„ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ƒํƒœ ํ™•์ธ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

gcloud

  1. ์ƒํƒœ ํ™•์ธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute health-checks create grpc grpc-gke-helloworld-hc \
     --use-serving-port
    
  2. ๋ฐฉํ™”๋ฒฝ ๊ทœ์น™ ๋งŒ๋“ค๊ธฐ

    gcloud compute firewall-rules create grpc-gke-allow-health-checks \
      --network default --action allow --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags allow-health-checks \
      --rules tcp:50051
    
  3. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute backend-services create grpc-gke-helloworld-service \
       --global \
       --load-balancing-scheme=INTERNAL_SELF_MANAGED \
       --protocol=GRPC \
       --health-checks grpc-gke-helloworld-hc
    
  4. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋ฐฑ์—”๋“œ NEG๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    gcloud compute backend-services add-backend grpc-gke-helloworld-service \
       --global \
       --network-endpoint-group example-grpc-server \
       --network-endpoint-group-zone us-central1-a \
       --balancing-mode RATE \
       --max-rate-per-endpoint 5
    

๋ผ์šฐํŒ… ๊ทœ์น™ ๋งต ๋งŒ๋“ค๊ธฐ

์ด ์„น์…˜์—์„œ๋Š” ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ๋ฐ ๊ฒฝ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋ผ์šฐํŒ…ํ•˜๋Š” URL ๋งต, ๊ฒฝ๋กœ ์ผ์น˜์ž, ํ˜ธ์ŠคํŠธ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” helloworld-gke๋ฅผ ์„œ๋น„์Šค ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. gRPC ํด๋ผ์ด์–ธํŠธ๋Š” helloworld ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•  ๋•Œ ๋Œ€์ƒ URI์— ์ด ์„œ๋น„์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ gRPC ํ”„๋ก์‹œ ๋ฐ ์ „๋‹ฌ ๊ทœ์น™๋„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ผ์šฐํŒ… ๊ทœ์น™ ๋งต์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„ helloworld-gke ๋ฐ 8000 ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, gRPC ํด๋ผ์ด์–ธํŠธ๋Š” xds:///helloworld-gke:8000์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์„œ๋น„์Šค์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋ฉฐ URL ๋งต์— ํ˜ธ์ŠคํŠธ ๊ทœ์น™ helloworld-gke:8000์ด ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. helloworld-gke:8000์€ targetPort 50051์—์„œ ๋ฆฌ์Šจํ•˜๋Š” NEG ์—”๋“œํฌ์ธํŠธ๋กœ ์ง์ ‘ ํ™•์ธ๋˜๋ฏ€๋กœ ์ด์ „ ์„น์…˜์˜ Kubernetes ์„œ๋น„์Šค ์‚ฌ์–‘์— ํ‘œ์‹œ๋œ ์„œ๋น„์Šค ํฌํŠธ 8080์€ Cloud Service Mesh์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ URL ๋งต ํ˜ธ์ŠคํŠธ ๊ทœ์น™์˜ ํฌํŠธ์™€ Kubernetes ์„œ๋น„์Šค ์‚ฌ์–‘ port ๋ฐ targetPort ๋ชจ๋‘ ํŽธ์˜์ƒ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ์„ค์ •๋˜์ง€๋งŒ ์ด ์˜ˆ์‹œ์—์„œ๋Š” Cloud Service Mesh๊ฐ€ ์„œ๋น„์Šค ์‚ฌ์–‘์˜ port๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. URL ๋งต์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute url-maps create grpc-gke-url-map \
    --default-service grpc-gke-helloworld-service
    
  2. ๊ฒฝ๋กœ ์ผ์น˜์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute url-maps add-path-matcher grpc-gke-url-map \
    --default-service grpc-gke-helloworld-service \
    --path-matcher-name grpc-gke-path-matcher \
    --new-hosts helloworld-gke:8000
    
  3. ๋Œ€์ƒ gRPC ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute target-grpc-proxies create grpc-gke-proxy \
    --url-map grpc-gke-url-map \
    --validate-for-proxyless
    
  4. ์ „๋‹ฌ ๊ทœ์น™์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud compute forwarding-rules create grpc-gke-forwarding-rule \
    --global \
    --load-balancing-scheme=INTERNAL_SELF_MANAGED \
    --address=0.0.0.0 \
    --target-grpc-proxy=grpc-gke-proxy \
    --ports 8000 \
    --network default
    

์ด์ œ Cloud Service Mesh๊ฐ€ URL ๋งต์— ์ง€์ •๋œ ์„œ๋น„์Šค์˜ NEG์—์„œ ์—”๋“œํฌ์ธํŠธ ๊ฐ„์— ํŠธ๋ž˜ํ”ฝ์„ ๋ถ€ํ•˜ ๋ถ„์‚ฐํ•˜๋„๋ก ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ํ™•์ธ

๊ตฌ์„ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ helloworld gRPC ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ผ์ด์–ธํŠธ๋Š” Cloud Service Mesh์— ์—ฐ๊ฒฐ๋˜์–ด helloworld ์„œ๋น„์Šค(grpc-gke-helloworld-service ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Service Mesh๋กœ ๊ตฌ์„ฑ)์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Google Cloud ์ฝ˜์†”์˜ Cloud Service Mesh ์„น์…˜์—์„œ ๊ตฌ์„ฑ๋œ ์„œ๋น„์Šค helloworld-gke์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ฐฑ์—”๋“œ๊ฐ€ ์ •์ƒ์œผ๋กœ ๋ณด๊ณ ๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ๋กœ ๊ฒ€์ฆ

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ๋œ gRPC ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ grpcurl ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Service Mesh๊ฐ€ ๋ฉ”์‹œ์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ผ์šฐํŒ…ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ ํฌ๋“œ๋ฅผ ๋งŒ๋“  ํ›„ ์…ธ์„ ์—ด๊ณ  ์…ธ์—์„œ ์ธ์ฆ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํŒŒ์ผ ์„ค์ •

ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ์ „์†ก์„ ์œ„ํ•ด ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํŒŒ์ผ ๋ฐ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๋Š” initContainer๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์‚ฌ์–‘์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ initContainer๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์‚ฌ์–‘์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      initContainers:
      - args:
        - --output
        - "/tmp/bootstrap/td-grpc-bootstrap.json"
        image: gcr.io/trafficdirector-prod/td-grpc-bootstrap:0.16.0

        imagePullPolicy: IfNotPresent
        name: grpc-td-init
        resources:
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 10m
            memory: 100Mi
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/bootstrap/
      volumes:
      - name: grpc-td-conf
        emptyDir:
          medium: Memory

๋‹ค์Œ์„ ํฌํ•จํ•˜๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์˜ env ์„น์…˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

        env:
        - name: GRPC_XDS_BOOTSTRAP
          value: "/tmp/grpc-xds/td-grpc-bootstrap.json"
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/grpc-xds/

๋‹ค์Œ์€ ํด๋ผ์ด์–ธํŠธ Kubernetes ์‚ฌ์–‘์˜ ์ „์ฒด ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

cat << EOF  | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: client
  name: sleeper
spec:
  selector:
    matchLabels:
      run: client
  template:
    metadata:
      labels:
        run: client
    spec:
      containers:
      - image: openjdk:8-jdk
        imagePullPolicy: IfNotPresent
        name: sleeper
        command:
        - sleep
        - 365d
        env:
        - name: GRPC_XDS_BOOTSTRAP
          value: "/tmp/grpc-xds/td-grpc-bootstrap.json"
        resources:
          limits:
            cpu: "2"
            memory: 2000Mi
          requests:
            cpu: 300m
            memory: 1500Mi
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/grpc-xds/
      initContainers:
      - args:
        - --output
        - "/tmp/bootstrap/td-grpc-bootstrap.json"
        image: gcr.io/trafficdirector-prod/td-grpc-bootstrap:0.16.0
        imagePullPolicy: IfNotPresent
        name: grpc-td-init
        resources:
          limits:
            cpu: 100m
            memory: 100Mi
          requests:
            cpu: 10m
            memory: 100Mi
        volumeMounts:
        - name: grpc-td-conf
          mountPath: /tmp/bootstrap/
      volumes:
      - name: grpc-td-conf
        emptyDir:
          medium: Memory
EOF

๋ฐฐํฌ๊ฐ€ ์ค€๋น„๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ ํฌ๋“œ์— ๋Œ€ํ•œ ์…ธ์„ ์—ฝ๋‹ˆ๋‹ค.

kubectl exec -it $(kubectl get pods -o custom-columns=:.metadata.name \
    --selector=run=client) -- /bin/bash

๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด ํฌ๋“œ ์…ธ์—์„œ ์ ์ ˆํ•œ ์˜ˆ์‹œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”

gRPC ์ž๋ฐ” ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์ตœ์‹  ํŒจ์น˜์™€ ํ•จ๊ป˜ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC ์ž๋ฐ”๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , xds-hello-world ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

     curl -L https://github.com/grpc/grpc-java/archive/v1.37.0.tar.gz | tar -xz
     cd grpc-java-1.37.0/examples/example-xds
     ../gradlew --no-daemon installDist
     

  2. "world"๋ฅผ ์ด๋ฆ„์œผ๋กœ, "xds:///helloworld-gke:8000"์„ ์„œ๋น„์Šค URI ๋ฐ ํฌํŠธ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ./build/install/example-xds/bin/xds-hello-world-client "world" \
    xds:///helloworld-gke:8000
    

Go

gRPC Go ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์ตœ์‹  ํŒจ์น˜์™€ ํ•จ๊ป˜ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC Go๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , xds-hello-world ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

    apt-get update -y
    apt-get install -y golang git
    curl -L https://github.com/grpc/grpc-go/archive/v1.37.0.tar.gz | tar -xz
    cd grpc-go-1.37.0/examples/features/xds/client
    go get google.golang.org/grpc@v1.37.0
    go build .
    
  2. "world"๋ฅผ ์ด๋ฆ„์œผ๋กœ, "xds:///helloworld-gke:8000"์„ ์„œ๋น„์Šค URI ๋ฐ ํฌํŠธ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ./client "world" xds:///helloworld-gke:8000
    

C++

gRPC C++ ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์ตœ์‹  ํŒจ์น˜์™€ ํ•จ๊ป˜ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC C++๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , helloworld ํด๋ผ์ด์–ธํŠธ ์˜ˆ์‹œ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

    apt-get update -y
    apt-get install -y build-essential cmake git
    git clone --recurse-submodules -b v1.37.1 https://github.com/grpc/grpc
    cd grpc
    mkdir -p cmake/build
    pushd cmake/build
    cmake ../..
    make
    make install
    popd
    mkdir -p third_party/abseil-cpp/cmake/build
    pushd third_party/abseil-cpp/cmake/build
    cmake ../..
    make
    make install
    popd
    cd examples/cpp/helloworld
    mkdir -p cmake/build
    cd cmake/build/
    cmake ../..
    make
    
  2. 'xds:///helloworld-gke:8000'์„ ์„œ๋น„์Šค URI ๋ฐ ํฌํŠธ๋กœ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    ./greeter_client --target=xds:///helloworld-gke:8000
    

grpcurl

grpcurl ๋„๊ตฌ๋Š” ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ ์—ญํ• ์„ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ grpcurl์€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Service Mesh์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ grpc-gke-helloworld-service ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด Cloud Service Mesh๋กœ ๊ตฌ์„ฑ๋œ helloworld ์„œ๋น„์Šค๋ฅผ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

grpcurl ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. grpcurl ๋„๊ตฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

    curl -L https://github.com/fullstorydev/grpcurl/releases/download/v1.8.1/grpcurl_1.8.1_linux_x86_64.tar.gz | tar -xz
    
  2. 'xds:///helloworld-gke:8000'์„ ์„œ๋น„์Šค URI๋กœ, helloworld.Greeter/SayHello์„ ํ˜ธ์ถœํ•  ์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ๋ฉ”์„œ๋“œ๋กœ ์ง€์ •ํ•˜๊ณ  grpcurl ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. SayHello ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” -d ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

    ./grpcurl --plaintext \
      -d '{"name": "world"}' \
      xds:///helloworld-gke:8000 helloworld.Greeter/SayHello
    

Python

gRPC Python ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ํŒจ์น˜๊ฐ€ ์ ์šฉ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

apt-get update -y
apt-get install python3-pip -y
pip3 install virtualenv
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1/examples/python/xds
virtualenv venv -p python3
source venv/bin/activate
pip install -r requirements.txt
python client.py  xds:///helloworld-gke:8000

Ruby

gRPC Ruby ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ํŒจ์น˜๊ฐ€ ์ ์šฉ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

apt-get update -y
apt-get install -y ruby-full
gem install grpc
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1/examples/ruby
ruby greeter_client.rb john xds:///helloworld-gke:8000

PHP

gRPC PHP ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ํŒจ์น˜๊ฐ€ ์ ์šฉ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

apt-get update -y
apt-get install -y php7.3 php7.3-dev php-pear phpunit python-all zlib1g-dev git
pecl install grpc
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
curl -L https://github.com/grpc/grpc/archive/v1.37.1.tar.gz | tar -xz
cd grpc-1.37.1
export CC=/usr/bin/gcc
./tools/bazel build @com_google_protobuf//:protoc
./tools/bazel build src/compiler:grpc_php_plugin
cd examples/php
composer install
../../bazel-bin/external/com_google_protobuf/protoc --proto_path=../protos \
--php_out=. --grpc_out=. \
--plugin=protoc-gen-grpc=../../bazel-bin/src/compiler/grpc_php_plugin \
../protos/helloworld.proto
php -d extension=grpc.so greeter_client.php john xds:///helloworld-gke:8000

Node.js

gRPC Node.js ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ํŒจ์น˜๊ฐ€ ์ ์šฉ๋œ ์ตœ์‹  ๋ฒ„์ „์˜ gRPC๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

apt-get update -y
apt-get install -y nodejs npm
curl -L https://github.com/grpc/grpc/archive/v1.34.0.tar.gz | tar -xz
cd grpc-1.34.0/examples/node/xds
npm install
node ./greeter_client.js --target=xds:///helloworld-gke:8000

INSTANCE_HOST_NAME์ด VM ์ธ์Šคํ„ด์Šค์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ธ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Greetings: Hello world, from INSTANCE_HOST_NAME

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋ก์‹œ๋ฆฌ์Šค gRPC ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ Cloud Service Mesh์— ์—ฐ๊ฒฐ๋˜๊ณ  xds ์ด๋ฆ„ ๋ฆฌ์กธ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ helloworld-gke ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ๋ฅผ ์•Œ์•„๋ดค๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” IP ์ฃผ์†Œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ DNS ํ™•์ธ์„ ์ˆ˜ํ–‰ํ•  ํ•„์š” ์—†์ด ์„œ๋น„์Šค์˜ ๋ฐฑ์—”๋“œ ์ค‘ ํ•˜๋‚˜์— ์š”์ฒญ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„