Service Entry とは(Istioのサイトより
- ServiceEntryは、Istioの内部サービスレジストリに追加のエントリを追加し、メッシュ内の自動検出サービスがこれらの手動で指定したサービスにアクセス/ルーティングできるようにします。
- ServiceEntryは、サービスのプロパティ(DNS名、VIP、ポート、プロトコル、エンドポイント)を記述します。
- これらのサービスは、メッシュの外部サービス(例:Web API)、またはプラットフォームのサービスレジストリの一部ではないメッシュ内部サービス(例:Kubernetesのサービスと対話するVMのセット)である可能性があります。
- さらに、ServiceEntryのエンドポイントは、workloadSelectorフィールドを使用して動的に選択することもできます。
- これらのエンドポイントは、WorkloadEntryオブジェクトを使用して宣言されたVMワークロードまたはKubernetesポッドにすることができます。
- 1つのサービスでポッドとVMの両方を選択できるため、サービスに関連する既存のDNS名を変更することなく、VMからKubernetesへのサービスの移行が可能になります。
やりたいこと
2つある。
- クラスタ外のサービスをサービスメッシュの外部サービスとして識別させて、Kialiで表示させたい
- クラスタ外の名前解決ができない自前のサーバをサービスメッシュの外部サービスとして識別させて、アクセスしたい
- サーバの自己証明書の検証をスキップさせたい or 真面目に検証したい
クラスタ外のサービスをサービスメッシュの外部サービスとして識別させる
YAMLをつくる。
- 外部サービスの宛先は、dropbox、google、facebookとする
- サービスメッシュの外部サービスとして識別させる
- リスナーは443;TLSでスキーマはhttps
- 名前解決はDNSでやる
extapi-se.yaml
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-svc-https
spec:
hosts:
- api.dropboxapi.com
- www.googleapis.com
- api.facebook.com
location: MESH_EXTERNAL
ports:
- number: 443
name: https
protocol: TLS
resolution: DNS
リソースをつくる
oc apply -f ./extapi-se.yaml
bookinfoサンプルアプリのratingsのPodに侵入して、リクエストを撃ちまくる
while true; do curl -k https://api.facebook.com; sleep 1; done
Kialiを見る。ちゃんとratingsのPodからexternal-svc-httpsへの経路が表示されている。
クラスタ外の名前解決ができない自前のサーバをサービスメッシュの外部サービスとして識別させて、アクセスしたい
Serviceをつくって、applyする。
apiVersion: v1
kind: Service
metadata:
name: external-myapi
spec:
clusterIP: None
ports:
- protocol: TCP
port: 443
Endpointsをつくって、applyする。
192.168.50.231
は自前のサーバのIPアドレス。
apiVersion: v1
kind: Endpoints
metadata:
name: external-myapi
subsets:
- addresses:
- ip: 192.168.50.231
ports:
- port: 443
ServiceEntryをつくって、applyする。
- hostsにはServiceのhostnameをいれる(Endpointsに通じる)
- Istio側での名前解決はNone
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-se-myapi
spec:
hosts:
- external-myapi.default.svc.cluster.local
ports:
- number: 443
name: https
protocol: TLS
location: MESH_EXTERNAL
resolution: NONE
bookinfoサンプルアプリのratingsのPodに侵入して、リクエストを撃つ。
うまくいった。
$ curl -k https://external-myapi.default.svc.cluster.local
Example web content
-k
(証明書検証を無視)を外すとエラーになる。
$ curl https://external-myapi.default.svc.cluster.local
curl: (77) error setting certificate verify locations:
CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
サーバの自己証明書の検証をスキップさせたい or 真面目に検証したい
TODO