1. OpenStackメタデータサービスについて OpenStack 仮想マシンは、ネットワーク カード構成、ホスト名、初期化パスワード、キー構成などの初期化構成を cloud-init を通じて完了することがわかっています。 Cloud-init は仮想マシン内で実行されるプロセスです。データソースを通じて仮想マシンの構成情報 (メタデータ) を取得します。 Cloud-init はさまざまなデータソースを実装しており、異なるデータソースの実装原則はそれぞれ異なります。最も一般的に使用されるデータソースは主に次の 2 つです。
ConfigDriver の実装原理は比較的単純なので、この記事では紹介しません。ここでは、主に次の 2 つの問題を解決するメタデータに焦点を当てます。
2. メタデータサービスの構成 2.1 Novaの設定 Nova のメタデータ サービスの名前は nova-api-metadata ですが、このサービスは通常 nova-api サービスと統合されます。
さらに、仮想マシンは、Nova のメタデータ サービスにアクセスするために Neutron を転送する必要があります。理由は後ほど説明します。ここでは、nova.conf の設定にのみ注意する必要があります。
2.2 中性子の構成 前述のように、仮想マシンは Neutron を介して Nova のメタデータ サービスへのアクセスを転送する必要があります。 l3-agent または dhcp-agent を介して転送できます。選択は実際の状況によって異なります。
メタデータはデフォルトで l3-agent によって転送されます。ただし、実際の状況では、仮想マシンのネットワークでは DHCP 機能が有効になっていることがほとんどですが、必ずしもルーターが必要なわけではありません。したがって、私は dhcp-agent 経由で転送することを選択することを好みます。構成は次のとおりです。
この記事の以下の内容はすべて上記の構成環境に基づいています。 3 OpenStack VMからNovaメタデータサービスにアクセスする方法 3.1 仮想マシンからのメタデータ サービスへのアクセス cloud-init がメタデータ サービスにアクセスするための URL アドレスは http://169.254.169.254 です。この IP は非常に特別です。主にAWSのメタデータサービスアドレスを模倣します。ネットワークセグメントは 169.254.0.0/16 です。この IP セグメントは実際には予約済みです。つまり、IPv4 リンク ローカル アドレスです。プライベート IP (10.0.0.0/8、172.16.0.0/12、192.168.0.0/16) と同様であり、インターネット ルーティングには使用できません。通常、直接接続されたネットワークにのみ使用されます。オペレーティング システム (Windows) が IP アドレスを取得できない場合、169.254.0.0/16 ネットワーク セグメント内の IP アドレスとして自動的に構成されることがあります。 では、なぜ AWS は IP 169.254.169.254 を選択したのでしょうか?これは、リンク ローカル IP を選択すると、ユーザーの IP との競合を回避できるためです。 169.254.0.0/24 で他の IP ではなく 169.254.169.254 という IP が選ばれたのは、おそらく覚えやすくするためでしょう。 さらに、AWS には興味深いアドレスがいくつかあります。
169.254.169.254 の詳細については、「whats-special-about-169-254-169-254-ip-address-for-aws」を参照してください。 OpenStack 仮想マシンは、http://169.254.169.254 を通じて仮想マシンの初期構成情報も取得します。
上記の出力から、メタデータ サービスから仮想マシンの uuid、名前、プロジェクト ID、availability_zone、ホスト名などを取得したことがわかります。 仮想マシンは、アドレス 169.254.169.254 にアクセスしてメタデータ情報を取得するにはどうすればよいですか?まず、仮想マシンのルーティング テーブルを確認しましょう。
169.254.169.254 の次のホップは 10.0.0.66 であることがわかります。 IP 10.0.0.66 とは何ですか? Neutron のポート情報を確認します。
10.0.0.66 はネットワーク 2c4b658c-f2a0-4a17-9ad2-c07e45e13a8a の DHCP アドレスとまったく同じであることがわかります。これはさらに次のように確認できます。
このことから、OpenStack 仮想マシンが 169.254.169.254 にアクセスすると、仮想マシンが配置されているネットワークの DHCP アドレスにルーティングされることがわかります。 DHCP アドレスと仮想マシンの IP は相互運用可能である必要があり、これにより仮想マシンの内部からホスト マシンの外部への通信の問題が解決されます。 DHCP を Nova メタデータ サービスに転送するにはどうすればよいですか?次のセクションでは、この問題を解決する方法を紹介します。 3.2 メタデータ要求の最初の転送 前述のように、仮想マシンはメタデータ サービス アドレス 169.254.169.254 にアクセスし、それを DHCP アドレスに転送します。 Neutron の DHCP ポートが名前空間に配置されていることがわかります。仮想マシンが配置されているネットワークの名前空間を入力しましょう。
まず、名前空間のルーティングを確認します。
ルーティング テーブルから、169.254.0.0/16 がネットワーク カード tap1332271e-0d から送信されていることがわかります。ネットワーク カードのアドレス情報を確認しましょう。
169.254.169.254 は実際にはネットワーク カード tap1332271e-0d に割り当てられた仮想 IP であることがわかりました。仮想マシンがアドレス 169.254.169.254 にアクセスできるのは当然のことです。この記事のメタデータ転送構成は、dhcp-agent を通じて実装されていることに注意してください。 l3-agent の場合、169.254.169.254 は iptables を通じて転送されます。 curl http://169.254.169.254 にアクセスでき、このアドレスではポート 80 が開いている必要があることがわかります。
出力から、DHCP サービス (ポート 53) が有効になっていることに加えて、環境がポート 80 を監視しており、プロセス pid が 11334/haproxy であることがわかります。 haproxy プロセスを見ると、それがプロキシとリクエストの転送を担当していることが推測できます。つまり、OpenStack 仮想マシンはまず、DHCP が配置されている名前空間の haproxy リスニング ポート 80 に要求を転送します。 問題が再び発生します。 DHCP が配置されている名前空間ネットワークはまだ Nova Metadata に接続されていません。では、haproxy はどのようにしてリクエストを Nova メタデータ サービスに転送するのでしょうか?次のセクションで紹介します。 3.3 メタデータ要求の2回目の転送 先ほど、OpenStack 仮想マシンが http://169.254.169.254 にアクセスすると、DHCP が配置されている名前空間で haproxy がリッスンしているポート 80 に転送されることを紹介しました。ただし、Nova メタデータ サービスはまだ名前空間内でアクセスできません。 解決策を検討するために、まず haproxy プロセス情報を見てみましょう。
2c4b658c-f2a0-4a17-9ad2-c07e45e13a8a.conf 構成ファイルの内容は次のとおりです。
haproxy にバインドされているポートは 80 であり、バックエンド アドレスはファイル /opt/stack/data/neutron/metadata_proxy であることがわかりました。バックエンドは IP/TCP アドレスではなく、UNIX ソケット ファイルである必要があります。
したがって、haproxy プロセスは OpenStack 仮想マシンのメタデータ要求をローカル ソケット ファイルに転送すると結論付けられます。 UNIX ドメイン ソケットはソケット アーキテクチャに基づいて開発され、同じホスト上のプロセス間通信 (IPC) に使用されます。アプリケーション層データをあるプロセスから別のプロセスにコピーするためにネットワーク プロトコル スタックを経由する必要がないため、Unix パイプラインに多少似ています。 ここで再び質問です:
最初の問題は実は以前に解決されていました。 HAProxy は、仮想マシンが配置されているネットワークの DHCP 名前空間で起動されます。確認できること:
2 番目の質問に関しては、別の転送レイヤーが必要であることは明らかです。詳細については次のセクションを参照してください。 また、新しいバージョンの OpenStack では転送に haproxy プロキシを直接使用しますが、一部の古いバージョンでは転送に neutron-ns-metadata-proxy プロセスを使用することにも注意してください。実装コードは neutron/agent/metadata/namespace_proxy.py にあります。
リクエスト URL 169.254.169.254 について質問があるかもしれません。自分自身に転送するにはどうすればいいでしょうか?これは UNIX ドメイン ソケット要求であるためです。実際、この URL は単なるパラメータ プレースホルダーです。何を記入しても構いません。このリクエストは次のものと同等です:
3.4 メタデータ要求が3回目に転送される 前述したように、haproxy はメタデータ要求をローカル ソケット ファイルに転送するので、どのプロセスが /opt/stack/data/neutron/metadata_proxysocket ファイルをリッスンしているのでしょうか? lsof で確認します:
neutron-metadata-agent がこのソケット ファイルをリッスンしていることがわかります。これは、haproxy がソケット ファイルを介してメタデータ サービスを neutron-metadata-agent サービスに転送することと同じです。
さらに、neutron-metadata-agent が /opt/stack/data/neutron/metadata_proxysocket ファイルをリッスンしていることが検証されます。 neutron-metadata-agent は制御ノード上のプロセスであるため、Nova Metadata サービスに確実に接続されます。 OpenStack 仮想マシンが Nova メタデータ サービスにアクセスする方法の問題は基本的に解決されています。
つまり、合計 3 回の転送が必要になります。 しかし、Nova メタデータ サービスはどの仮想マシンがリクエストを送信したかをどうやって知るのでしょうか?つまり、仮想マシンの uuid を取得する方法については次の章で紹介します。 4 メタデータ サービスはどのようにして仮想マシンの情報を取得しますか? 前の章では、OpenStack 仮想マシンが 169.254.169.254 を介して Nova メタデータ サービスに到達する方法について説明しました。サービスに到達した後、どの仮想マシンがメッセージを送信したかをどのように判断しますか? OpenStack は、neutron-metadata-agent を通じて仮想マシンの uuid を取得します。同じ Neutron ネットワーク内で、複数のサブネットが存在する場合でも、IP の重複は許可されない、つまり、Neutron ポート情報は IP アドレスによって一意に決定できることがわかっています。 neutron ポートは、コンシューマー情報を識別するために device_id を設定します。仮想マシンの場合、これは仮想マシンの UUID です。 したがって、neutron-metadata-agent は、ネットワーク UUID と仮想マシンの IP を通じて仮想マシンの UUID を取得できます。 haproxy 構成ファイルに構成項目があることをまだ覚えていますか?
つまり、haproxy は転送前にリクエスト ヘッダーにネットワーク ID を追加し、HTTP ヘッダー X-Forwarded-For を通じて IP を取得できます。そのため、neutron-metadata-agent には仮想マシンの uuid とプロジェクト ID (テナント ID) を取得するための条件があります。 neutron-metadata-agent の実装を表示して、仮想マシンの uuid とプロジェクト ID を取得できます。コードは neutron/agent/metadata/agent.py にあります:
誰かがメタデータ要求を偽造して仮想マシンのメタデータ情報を取得できる場合、それは明らかに安全ではないため、Nova メタデータ サービスに転送する前に、秘密を送信する必要があります。
metadata_proxy_shared_secret は管理者が設定する必要があり、その後、仮想マシンの uuid と組み合わせてキーとしてランダムな文字列を生成します。 最後に、neutron-metadata-agent は仮想マシン情報をヘッダーに配置し、Nova Metadata サービスに送信されるヘッダー情報は次のようになります。
この時点で、Nova Metadata は仮想マシンの uuid を通じてメタデータ情報を照会できます。コードは nova/api/metadata/base.py にあります:
5 仮想マシンの外部から仮想マシンのメタデータを取得する方法 前のセクションでは、OpenStack 仮想マシンが Nova メタデータ サービスからメタデータを取得する方法について説明しました。送信されたデータが正しいかどうかを確認するために、仮想マシンのメタデータ情報をデバッグする必要がある場合がありますが、面倒すぎるため、仮想マシンにアクセスしてデバッグしたくない場合があります。 nova-api-metadata サービスを直接呼び出して仮想マシンの情報を取得する方法はありますか? 上記で紹介した原則に従って、実装する 2 つのスクリプトを作成しました。 *** シークレットを生成するには、Python スクリプト sign_instance.py を使用します。
2 番目の bash スクリプト get_metadata.py は、仮想マシンのメタデータの取得を実装します。
metadata_server は Nova メタデータ サービスのアドレスです。 使用方法は次のとおりです。
5 結論 ***ワークフロー図でまとめると次のようになります: OpenStack メタデータ ワークフロー ソースコード:
【この記事は51CTOコラムニスト「Fu Guangping」によるオリジナル記事です。転載が必要な場合は51CTOまでご連絡ください] この著者の他の記事を読むにはここをクリックしてください |
<<: 仮想化を選択する理由は何ですか?ネットワーク管理業務にどのような効果がありますか?各メーカーの仮想化技術を比較!
>>: 清華紫光集団は、12のカテゴリーで267のクラウドサービス製品を含む清華紫光集団パブリッククラウドの商用試験を開始したと発表した。
2018年を振り返ると、寒くて忘れられない年でした。過去 20 年間で、インターネット従事者をこれほ...
raksmart は長年にわたり VPS サービスを提供しています。同社の VPS は、香港 (中国...
民間資本が銀行業界に参入できるという警鐘が鳴らされるやいなや、アリババ、テンセント、蘇寧などのネット...
最近、Baidu のアルゴリズムが継続的にアップグレードされるにつれて、SEO 作業者のスキルも大幅...
今では、私の周りの誰もが自分のWeiboを持っています。 Weiboはあらゆる人々の空間に浸透しまし...
最近、多くの伝統的な求人サイトが営業損失に直面しています。Zhaopin.comや51job.com...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています2018年...
企業ウェブサイトが百度プロモーションを行うにせよ、SEOを行うにせよ、最終的な目標は受注を獲得するこ...
私のような老人にとって、 Pinduoduo を理解するのはまだ少し難しいですが、業界では、Alib...
現在、ビッグデータの急速な発展は、世界中のさまざまな産業の情報化と高度化を推進しています。クラウドコ...
インターネットの拡大に伴い、今年のタオバオ11フェスティバルも取引高の記録を更新しました。しかし...
2019年10月31日、工業情報化部と3大通信事業者は5Gサービスの開始を正式に発表し、中国は正式に...
本日の Google グローバル アップデートは、すべてのウェブマスターの間で議論の的となることは間...
さらに読む: Baidu の PC 検索結果が異常、モバイル検索の調整による可能性あり百度の検索エン...
ブランドとしてユーザーの心を掴むには、ユニークで際立ったイメージが必要です。歴史を振り返ると、成功し...