•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をインストールします。
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エージェントを起動します。
systemctl start 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
ワークロードエントリとサービスを作成する
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
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