誰でもできる Istio Service Mesh with Kubernetes

Kenta Kosugi
42 min readDec 7, 2022

--

Docker Desktop で Kubernetes を稼働

Docker Desktop をインストールします。

ただし、Docer Desktop は商用利用が禁止されたため、自己学習用に使いましょう。

Docker Desktop をインストールした後、GUI を立ち上げます。まずは下記サイトを参考に、Istio を展開可能なリソースが設定されているかを確認してみましょう。

その後歯車アイコンをクリックします。

左メニューから「Kubernetes」を選択します。

「Enable Kubernetes」を選択し、「Apply & restart」を選択します。

ちなみに「Show system containers(advanced)」を選択すると、docker ps コマンド実行時に以下の通り、Kubernetes 上で動作するコンテナの一覧も表示されるようになります。これでは開発中のコンテナを探すにも一苦労です。チェックは付与せずに起動しましょう。

restart が終わったら、kubectl コマンドが利用できるようになっているはずです。以下のコマンドを実行してみましょう。

$ kubectl get pods 
NAME READY STATUS RESTARTS AGE

これで Docker Desktop で Kubernetes を利用する準備は整いました。

Istio のダウンロードとインストール

Istio のダウンロードとインストールは下記サイトを参考にしています。

まず、Istio をダウンロードします。

$ curl -L https://istio.io/downloadIstio | sh -

次に展開された istio のディレクトリに移動します。私の場合は istio-1.16.0 でした。

$ cd istio-.16.0

PATH 環境変数に上記のディレクトリのパスを通します。

$ export PATH=$PWD/bin:$PATH

Istio をインストールします。この部分は Istio のセットアップ手順書とは異なるため注意が必要です。istio-ingressgateway は ClusterIP で構成されてしまいます。そのため、引数を付与して、NodePort を選択するように構成しています。

$ istioctl install --set profile=demo --set values.gateways.istio-ingressgateway.type=NodePort -y
✔ Istio core installed
✔ Istiod installed
✔ Egress gateways installed
✔ Ingress gateways installed
✔ Installation complete
Making this installation the default for injection and validation.

Thank you for installing Istio 1.16. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/99uiMML96AmsXY5d6

default ネームスペースに istio-injection=true のラベルを付与します。

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

実際に namespace=default にラベルが設定されたか確認してみましょう。

$ kubectl get namespaces/default -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: "2022-12-07T06:00:36Z"
labels:
istio-injection: enabled
kubernetes.io/metadata.name: default
name: default
resourceVersion: "1907"
uid: 2d3a430f-60de-4042-830c-a0015f24f889
spec:
finalizers:
- kubernetes
status:
phase: Active

labels の箇所に istio-injection: enabled が設定されているのが確認できました。

これで Istio のインストールは完了です。

Istio のサンプルアプリケーションの概要

Istio のサンプルは以下の簡単なマイクロサービスから形成されており、かつ reviews は複数のバージョンがデプロイされるよう構成されています。

  • productpage v1
  • details v1
  • reviews v1, v2, v3
  • ratings v1 (reviews v2, v3 からしか呼び出されない)
productpage の画面と productpage から呼び出される各サービス

Kubernetes 上には同一のサービスであっても複数バージョンデプロイできる機能が備わっています。

サービスはお互い連携し「The Comedy of Errors(間違いの悲劇)」という書籍を表示する画面を持っています(上記画像)。

では実際にアプリケーションをデプロイしていきましょう。

サンプルアプリケーションのデプロイ

Istio を検証するためのサンプルアプリは以下の yaml 構成になっています。サンプルアプリケーションの構成で説明したことがただ yaml で表現されているだけなので、詳細な説明は割愛します。

# Copyright Istio Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

##################################################################################################
# This file defines the services, service accounts, and deployments for the Bookinfo sample.
#
# To apply all 4 Bookinfo services, their corresponding service accounts, and deployments:
#
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
#
# Alternatively, you can deploy any resource separately:
#
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l service=reviews # reviews Service
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews # reviews ServiceAccount
# kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v3 # reviews-v3 Deployment
##################################################################################################

##################################################################################################
# Details service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: details
labels:
app: details
service: details
spec:
ports:
- port: 9080
name: http
selector:
app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-details
labels:
account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: details-v1
labels:
app: details
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: details
version: v1
template:
metadata:
labels:
app: details
version: v1
spec:
serviceAccountName: bookinfo-details
containers:
- name: details
image: docker.io/istio/examples-bookinfo-details-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
securityContext:
runAsUser: 1000
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: ratings
labels:
app: ratings
service: ratings
spec:
ports:
- port: 9080
name: http
selector:
app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-ratings
labels:
account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ratings-v1
labels:
app: ratings
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: ratings
version: v1
template:
metadata:
labels:
app: ratings
version: v1
spec:
serviceAccountName: bookinfo-ratings
containers:
- name: ratings
image: docker.io/istio/examples-bookinfo-ratings-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
securityContext:
runAsUser: 1000
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: reviews
labels:
app: reviews
service: reviews
spec:
ports:
- port: 9080
name: http
selector:
app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-reviews
labels:
account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v1
labels:
app: reviews
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v1
template:
metadata:
labels:
app: reviews
version: v1
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v1:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v2
labels:
app: reviews
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v2
template:
metadata:
labels:
app: reviews
version: v2
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v2:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: reviews-v3
labels:
app: reviews
version: v3
spec:
replicas: 1
selector:
matchLabels:
app: reviews
version: v3
template:
metadata:
labels:
app: reviews
version: v3
spec:
serviceAccountName: bookinfo-reviews
containers:
- name: reviews
image: docker.io/istio/examples-bookinfo-reviews-v3:1.17.0
imagePullPolicy: IfNotPresent
env:
- name: LOG_DIR
value: "/tmp/logs"
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
- name: wlp-output
mountPath: /opt/ibm/wlp/output
securityContext:
runAsUser: 1000
volumes:
- name: wlp-output
emptyDir: {}
- name: tmp
emptyDir: {}
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
name: productpage
labels:
app: productpage
service: productpage
spec:
ports:
- port: 9080
name: http
selector:
app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: bookinfo-productpage
labels:
account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: productpage-v1
labels:
app: productpage
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: productpage
version: v1
template:
metadata:
labels:
app: productpage
version: v1
spec:
serviceAccountName: bookinfo-productpage
containers:
- name: productpage
image: docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9080
volumeMounts:
- name: tmp
mountPath: /tmp
securityContext:
runAsUser: 1000
volumes:
- name: tmp
emptyDir: {}
---

デプロイします。

$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created

Service が生成されたことを確認します。

$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
details ClusterIP 10.110.46.148 <none> 9080/TCP 9s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m22s
productpage ClusterIP 10.109.231.108 <none> 9080/TCP 9s
ratings ClusterIP 10.109.178.40 <none> 9080/TCP 9s
reviews ClusterIP 10.105.29.98 <none> 9080/TCP 9s

Pod が準備完了になったかを確認します。

$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
details-v1-5ffd6b64f7-9s8s2 2/2 Running 0 38s
productpage-v1-979d4d9fc-wh24g 2/2 Running 0 37s
ratings-v1-5f9699cfdf-5sgg9 2/2 Running 0 38s
reviews-v1-569db879f5-77lt6 2/2 Running 0 38s
reviews-v2-65c4dc6fdc-2qv6d 2/2 Running 0 37s
reviews-v3-c9c4fb987-lztht 2/2 Running 0 37s

すべての Pod が 2/2 になれば準備完了なので Ctrl+C を押して kubectl コマンドを終了します。

実際にコンテナから応答が返ってくるかを確認してみましょう。

$ kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

<title>Simple Bookstore App</title>

<title>Sample Bookstore App</title> が返却されれば問題ありません。

続いて Gateway を構成します。

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
$ istioctl analyze

✔ No validation issues found when analyzing namespace: default.

istio-ingressgateway が NodePort で構成されていることを確認します。NodePort の部分が ClusterIP になっている場合は失敗です。

$ kubectl get svc istio-ingressgateway -n istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway NodePort 10.108.227.118 <none> 15021:30117/TCP,80:31815/TCP,443:30074/TCP,31400:31583/TCP,15443:32617/TCP 5m31s

Istio ダッシュボード — Kiali — の適用

Kubernetes 上にアプリケーションをデプロイ完了したので、続いて Istio のダッシュボード(Kiali) を Kubernetes 上にデプロイします。

$ kubectl apply -f samples/addons
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali-viewer created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created
serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created
$ kubectl rollout status deployment/kiali -n istio-system
deployment "kiali" successfully rolled out

Kiali の起動

以下のコマンドを起動すると、Kiali が起動してブラウザが開きます。

$ istioctl dashboard kiali 
http://localhost:20001/kiali
Kialiの画面

このように Empty Graph という画面が出力されます。

サンプルアプリケーションの呼び出し

サンプルアプリケーションを Ingressgateway 経由で呼び出します。ここでは curl コマンドを利用してアプリケーションを呼び出します。

以下のコマンドを実行して、INGRESS_PORT、INGRESS_HOST 環境変数を設定し、GATEWAY_URL を設定します。

$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
$ export INGRESS_HOST=localhost
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

私の環境では GATEWAY_URL は以下の通りとなりました。

$ echo $GATEWAY_URL
localhost:31815

それでは以下のコマンドを実行して、URL を呼び出してみましょう。以下のコマンドは curl で URL を呼び出しあと1秒スリープしているので、実行にしばらく時間がかかることに注意が必要です。

for i in {1..100}; do curl -s -o /dev/null "http://$GATEWAY_URL/productpage" ; sleep 1 ; done

Kiali ダッシュボードの変化 — Service Graph —

更新ボタンを押して、Kiali の画面を更新してみましょう。

すると以下のような画面が表示されます。

Kiali の画面

色々触ってみましょう。

特に以下の画面から「Traffic Animation」を選択してみると、おおっとなると思います。

Traffic Animation をオンに
Traffic Animation をオンにしたケース

まとめ

マイクロサービスを運用していくと、サービス間が密接に絡み合います。Kiali を使用することでマイクロサービス間のつながりを可視化することが可能になります。Istio にはこれ以外にもさまざまな機能があります。今回はここまでにしたいと思います。

【参考】ラベル istio-injection とは

上記サイトによると以下のように記載されています。

When you set the istio-injection=enabled label on a namespace and the injection webhook is enabled, any new pods that are created in that namespace will automatically have a sidecar added to them.

Note that unlike manual injection, automatic injection occurs at the pod-level. You won’t see any change to the deployment itself. Instead, you’ll want to check individual pods (via kubectl describe) to see the injected proxy.

ネームスペースに istio-injection=enabled ラベルを設定し、インジェクション Webhook を有効にすると、そのネームスペースで作成される新しいポッドには、自動的にサイドカーが追加されるようになります。

手動インジェクションとは異なり、自動インジェクションはポッドレベルで行われることに注意してください。デプロイメント自体には何の変化も見られません。代わりに、注入されたプロキシを確認するために、個々のポッドを (kubectl describe で) チェックしたいと思うでしょう。

つまり、namespace = default に作成された新たな Pod には Istio が Proxy を Side-car として自動注入し、そのインプットやアウトプットの情報を収集することで、Service Graph やトラフィック情報を形成しています。

Side-car とは

サイドカーパターンだけで1エントリ使ってしまいそうなので、上記サイトを参考にしてください。

では本当に Pod の中にはコンテナが二つ存在しているのかを確認してみましょう。

$ kubectl describe pod/$(kubectl get pod -l app=productpage -o jsonpath=’{.items[0].metadata.name}’)
Namespace:        default
Priority: 0
Service Account: bookinfo-productpage
Node: docker-desktop/192.168.65.4
Start Time: Wed, 07 Dec 2022 09:25:12 +0900
Labels: app=productpage
pod-template-hash=979d4d9fc
security.istio.io/tlsMode=istio
service.istio.io/canonical-name=productpage
service.istio.io/canonical-revision=v1
version=v1
Annotations: kubectl.kubernetes.io/default-container: productpage
kubectl.kubernetes.io/default-logs-container: productpage
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: 10.1.0.161
IPs:
IP: 10.1.0.161
Controlled By: ReplicaSet/productpage-v1-979d4d9fc
Init Containers:
istio-init:
Container ID: docker://5b43e0a492e0a0349fbe17a065729bc40335f83d9ba6c2b89222ed6902931bc7
Image: docker.io/istio/proxyv2:1.16.0
Image ID: docker-pullable://istio/proxyv2@sha256:f6f97fa4fb77a3cbe1e3eca0fa46bd462ad6b284c129cf57bf91575c4fb50cf9
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: Wed, 07 Dec 2022 09:25:14 +0900
Finished: Wed, 07 Dec 2022 09:25:14 +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-sp5g7 (ro)
Containers:
productpage:
Container ID: docker://1963fad8c979abf1721f2b0397cad3690cff383a518acc0741d2119c0a278279
Image: docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
Image ID: docker-pullable://istio/examples-bookinfo-productpage-v1@sha256:6668bcf42ef0afb89d0ccd378905c761eab0f06919e74e178852b58b4bbb29c5
Port: 9080/TCP
Host Port: 0/TCP
State: Running
Started: Wed, 07 Dec 2022 09:25:15 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/tmp from tmp (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sp5g7 (ro)
istio-proxy:
Container ID: docker://8f49e68d07b0502e8bf0d0e32c98e82c98652d3f5ed5d6586fea7958c954e4ac
Image: docker.io/istio/proxyv2:1.16.0
Image ID: docker-pullable://istio/proxyv2@sha256:f6f97fa4fb77a3cbe1e3eca0fa46bd462ad6b284c129cf57bf91575c4fb50cf9
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
--concurrency
2
State: Running
Started: Wed, 07 Dec 2022 09:25:15 +0900
Ready: True
Restart Count: 0
Limits:
cpu: 2
memory: 1Gi
Requests:
cpu: 10m
memory: 40Mi
Readiness: http-get http://:15021/healthz/ready delay=1s timeout=3s period=2s #success=1 #failure=30
Environment:
JWT_POLICY: third-party-jwt
PILOT_CERT_PROVIDER: istiod
CA_ADDR: istiod.istio-system.svc:15012
POD_NAME: productpage-v1-979d4d9fc-fhwss (v1:metadata.name)
POD_NAMESPACE: default (v1:metadata.namespace)
INSTANCE_IP: (v1:status.podIP)
SERVICE_ACCOUNT: (v1:spec.serviceAccountName)
HOST_IP: (v1:status.hostIP)
PROXY_CONFIG: {}

ISTIO_META_POD_PORTS: [
{"containerPort":9080,"protocol":"TCP"}
]
ISTIO_META_APP_CONTAINERS: productpage
ISTIO_META_CLUSTER_ID: Kubernetes
ISTIO_META_INTERCEPTION_MODE: REDIRECT
ISTIO_META_WORKLOAD_NAME: productpage-v1
ISTIO_META_OWNER: kubernetes://apis/apps/v1/namespaces/default/deployments/productpage-v1
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-sp5g7 (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
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
tmp:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
kube-api-access-sp5g7:
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: <none>

上記の Containers に注目してください。以下二つのコンテナが存在するのがわかります。

  • product : コンテナイメージは
    docker.io/istio/examples-bookinfo-productpage-v1:1.17.0
  • istio-proxy : コンテナイメージは
    docker.io/istio/proxyv2:1.16.0

--

--

Kenta Kosugi

Javaアプリケーションサーバーの開発からCORBA製品のサポート、QA、証券外務員(第一種免許)、ストレージ屋、アーキテクト、SaaS屋と一貫性のない道を歩んでいます。Red Hatに復帰しました。