vmでのIstioトラフィック管理

前提条件#

•2台の仮想マシン

1つ目はistioをデプロイするためのk8として使用され、2つ目はvmとして使用され、システムはcentos8であり、centos 7はglibcのアップグレードに非常に面倒です。2つ目は、静的ルーティングを介してk8s内のポッドにアクセスします。

この環境:

vm1:192.168.8.131vm1のK8sポッドcird:10.201.0.0/24vm2:192.168.8.170vm2静的ルートの追加:ルート追加-net 10.201.0.0 gw 192.168.8.131 netmask 255.255.255.0

•1.16以降のk8s•k8sapiserverオープンサービスアカウントのボリューム予測

- - - service-account-api-audiences=api,istio-ca    ---service-account-issuer=kubernetes.default.svc    ---service-account-signing-key-file=/etc/kubernetes/pki/sa.key

•環境変数VM_APP、WORK_DIR、VM_NAMESPACE、およびSERVICE_ACCOUNTを設定します

# VM_APP:この仮想マシンが実行するサービスの名前#VM_NAMESPACE:サービス名前名#WORK_DIR:作業ディレクトリ#SERVICE_この仮想マシンcatvmに使用されるACCOUNTk8sサービスアカウント名.envexport VM_APP=testexport VM_NAMESPACE=testexport WORK_DIR=./testexport SERVICE_ACCOUNT=test. vm.env

•作業ディレクトリを作成します

mkdir -p "${WORK_DIR}"

Istioコントロールパネルをインストールします#

•Istioをインストールします。

 istioctl install --set profile=demo  --set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE='\"true\"'

展開時に問題が発生しました。ポッドのパイロットエージェントがISTIO_META_DNS_CAPTUREを正常に認識できなかったため、dnsの解決がオンになりませんでした。文字の接続に問題があるか、姿勢が間違っているように感じました。
istioctlmanifestを手動でエクスポートする--setprofile = demo --set meshConfig.defaultConfig.proxyMetadata.ISTIO_META_DNS_CAPTURE = \ 'true \'> config.yaml次に、ISTIO_META_DNS_CAPTURE: "true"を変更します

•東西ゲートウェイを展開する

この例では、仮想マシンは展開せずにポッドIPに直接接続されます

samples/multicluster/gen-eastwest-gateway.sh --single-cluster | istioctl install -y -f -

•提供されている構成例を使用して、コントロールプレーンを公開します

kubectl apply -f samples/multicluster/expose-istiod.yaml

仮想マシンの名前付けを構成する#

•仮想マシンをホストする名前名を作成します。

kubectl create namespace "${VM_NAMESPACE}"

•仮想マシンのサービスアカウントを作成します。

kubectl create serviceaccount "${SERVICE_ACCOUNT}"-n "${VM_NAMESPACE}"

仮想マシンに転送するファイルを作成します#

•vmのWorkloadGroupテンプレートを作成します

WorkloadGroupは、1.8で新しく追加されたCRDであり、ワークロードインスタンスのコレクションを記述するために使用されます。これは、ワークロードインスタンスを使用して、メタデータやIDなどのエージェントをブートストラップできるという仕様を提供します。これは、k8以外のワークロード(仮想マシンなど)でのみ使用することを目的としており、IstioエージェントをブートストラップするためのKubernetesワークロードの既存のSidecarインジェクションおよびデプロイメント仕様モデルを模倣することを目的としています。

istioctl x workload group create --name "${VM_APP}"--namespace "${VM_NAMESPACE}"--labels app="${VM_APP}"--serviceAccount "${SERVICE_ACCOUNT}"> workloadgroup.yaml

• istioctl x Workload entryコマンドを使用して、仮想マシンのインストールに必要なファイルを生成します。

istioctl x workload entry configure -f workloadgroup.yaml -o "${WORK_DIR}"#cluster.env:キャプチャする名前名、サービスアカウント、ネットワークCIDR、および(オプションの)インバウンドポートを識別するメタデータが含まれます。#istio-トークン:CAから証明書を取得するために使用されるKubernetesトークン。#mesh.yaml:ネットワーク名、信頼ドメイン、その他の値など、その他のIstioメタデータを提供します。#root-cert.pem:認証に使用されるルート証明書。#ホスト:istiodがバインドされているホスト

仮想マシンを構成する#

Istioグリッドに追加する仮想マシンで次のコマンドを実行します。

•workdirの内容を仮想マシンに送信します。これらのファイルを安全に転送する方法を選択するときは、情報セキュリティ戦略を検討する必要があります。便宜上、必要なすべてのファイルを仮想マシンの「$ {HOME}」ディレクトリに転送します。 •ルート証明書/ etc / certsを次の場所にインストールします。

sudo mkdir -p /etc/certssudo cp "${HOME}"/root-cert.pem /etc/certs/root-cert.pem

•トークンを次の場所/ var / run / secrets / tokensにインストールします。

sudo  mkdir -p /var/run/secrets/tokenssudo cp "${HOME}"/istio-token /var/run/secrets/tokens/istio-token

•Istio仮想マシンの統合ランタイムを含むソフトウェアパッケージをインストールします。

curl -LO https://storage.googleapis.com/istio-release/releases/1.8.0/rpm/istio-sidecar.rpmsudo yum install -y istio-sidecar.rpm

•cluster.envを/ var / lib / istio / envoy /ディレクトリにインストールします

sudo cp "${HOME}"/cluster.env /var/lib/istio/envoy/cluster.env

•グリッド構成を/ etc / istio / config / meshにインストールします。

sudo cp "${HOME}"/mesh.yaml /etc/istio/config/mesh

•istiodホストを/ etc / hostsに追加します。

ここには外部lbがなく、設定する必要はありません

sudo sh -c 'cat $(eval echo ~$SUDO_USER)/hosts >> /etc/hosts'

itiodのIPを確認し、ホストをバインドします

10.201.0.14 istiod.istio-system.svc

•権限の変更:

sudo mkdir -p /etc/istio/proxysudo chown -R istio-proxy /var/lib/istio /etc/certs /etc/istio/proxy /etc/istio/config /var/run/secrets /etc/certs/root-cert.pem

仮想マシンでIstioを起動します#

Istioエージェントを起動します。

systemctl start istio

Istioが正常に機能することを確認します#

•ログイン/var/log/istio/istio.logを確認します。次のようなエントリが表示されます。

[ root@worker ~]# tail -f  /var/log/istio/istio.log2020-11-21T04:27:44.248846Z    info    sds    resource:default pushed key/cert pair to proxy2020-11-21T04:33:30.756067Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:33:31.285240Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:33:31.285453Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:150122020-11-21T04:38:48.670065Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:38:49.105717Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:38:49.105884Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:150122020-11-21T04:54:00.782318Z    info    xdsproxy    disconnected from XDS server: istiod.istio-system.svc:150122020-11-21T04:54:01.037151Z    info    xdsproxy    Envoy ADS stream established2020-11-21T04:54:01.037506Z    info    xdsproxy    connecting to upstream XDS server: istiod.istio-system.svc:15012

•ポッドベースのサービスを展開するための名前名を作成します。

kubectl create namespace samplekubectl label namespace sample istio-injection=enabled

•HelloWorldサービスを展開します。

kubectl apply -f samples/helloworld/helloworld.yaml -n sample

仮想マシンからサービスにリクエストを送信します。

[ root@worker ~]# curl helloworld.sample.svc:5000/helloHello version: v2, instance: helloworld-v2-54df5f84b-tts2z[root@worker ~]# curl helloworld.sample.svc:5000/helloHello version: v1, instance: helloworld-v1-776f57d5f6-f72k9

k8s内のvmサービスにアクセスします#

ワークロードエントリとサービスを作成する

apiVersion: networking.istio.io/v1beta1kind: WorkloadEntrymetadata:  name: test-vm-2  namespace: testspec:  serviceAccount: test  address:192.168.8.170  labels:    app: test    instance-id: vm2---apiVersion: v1kind: Servicemetadata:  name: test  namespace: test  labels:    app: testspec:  ports:- port:80    name: http-vm    targetPort:80  selector:    app: test

**vm **でhttpサーバーを起動します##

python3 -m http.server 80

テスト

kubectl exec -it helloworld-v1-776f57d5f6-nhmbc -n sample -- curl test.test.svc.cluster.localDefaulting container name to helloworld.Use 'kubectl describe pod/helloworld-v1-776f57d5f6-nhmbc -n sample' to see all of the containers inthis pod.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Directory listing for/</title></head><body><h1>Directory listing for/</h1><hr><ul><li><a href="cluster.env">cluster.env</a></li>...</ul><hr></body></html>

原則の概要#

上記から、vmがk8sの内部サービスに簡単にアクセスできることがわかります。最初に、1.8で ISTIO_META_DNS_CAPTURE関数を有効にして、dns解決を実現するパイロットエージェントの機能を実現します。パイロットエージェントは15053 udp / tcpポート、iptablesを監視します。 53のDNS要求をパイロットエージェントにリダイレクトします。ルールは次のとおりです。

- A POSTROUTING -p udp -m udp --dport 15053-j SNAT --to-source 127.0.0.1-A POSTROUTING -p udp -m udp --dport 15053-j SNAT --to-source 127.0.0.1-A POSTROUTING -p udp -m udp --dport 15053-j SNAT --to-source 127.0.0.1-A OUTPUT -p udp -m udp --dport 53-m owner --uid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-m owner --gid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-j DNAT --to-destination 127.0.0.1:15053-A OUTPUT -p udp -m udp --dport 53-m owner --uid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-m owner --gid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-j DNAT --to-destination 127.0.0.1:15053-A OUTPUT -p udp -m udp --dport 53-m owner --uid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-m owner --gid-owner 991-j RETURN-A OUTPUT -p udp -m udp --dport 53-j DNAT --to-destination 127.0.0.1:15053-A ISTIO_REDIRECT -p tcp -m tcp --dport 53-j REDIRECT --to-ports 15053

ISTIO_META_DNS_CAPTUREは通常、k8で管理されているポッドにのみ影響しますが、cluster.envでは、vmのパイロットエージェント機能は ISTIO_META_DNS_CAPTURE = trueによって有効になります。

Recommended Posts

vmでのIstioトラフィック管理