はじめに
こんにちは。エンジニアリング&デザインマネジメント室(EDMO) SREチームの堀江です。
昨今、クラウドサービスはますます多様化しており、AWS、GCP、Azureをはじめ、さまざまな選択肢があります。ワンダープラネットでもマルチクラウド戦略を採用しており、時代の変化に合わせて最適なクラウドサービスを選択できるようにすること、そして特定のベンダーへのロックインを軽減することを目的としています。
今回は、そんなマルチクラウド環境の中で触れる機会があったAlibaba CloudのKubernetes CNI「Terway」が非常に便利だったので、その特徴をご紹介します。
KubernetesのCNIとは
KubernetesのPodは、一般的に仮想ネットワーク上で構成されます。このネットワークの実装を担うのがCNI(Container Network Interface)であり、どのCNIを採用するかによってネットワークの挙動や特性が異なります。
大手クラウドベンダーの多くは、自社のネットワークサービスと密に統合したCNIを提供しています。例えば、AWSではVPC CNI、GCPではGKE Dataplane V2などがあります。Alibaba Cloudが提供するTerwayもその一つで、VPCやvSwitchとシームレスに統合されており、非常に使い勝手が良いと感じました。
Terwayの特徴
Terwayは、PodにENI(Elastic Network Interface)が直接割り当てられるタイプのCNIです。
最大の特徴は、PodがvSwitch(AWSでいうサブネットに相当するもの)に直接接続されているように見える点です。一般的なKubernetesのCNIでは、Pod間通信用の仮想ネットワークが構築され、Podには仮想ネットワーク上のIPアドレスが割り当てられます。しかしTerwayでは、vSwitchのCIDRから直接IPアドレスが割り当てられます。そのため、VPC内の他のリソースからPodへ直接アクセスでき、ネットワーク構成がシンプルになります。
また、NodeのENIを親として、PodのENIが子として紐付く「Trunk ENI」という構成で管理されます。これにより、1つのノードで多数のPodに対して効率的にネットワークリソースを割り当てられ、トラフィックの流れも把握しやすくなっています。
さらに、ALB Ingressとの接続においても、Serviceを介した構成であっても、実体としてはALBのターゲットに直接PodのENIが指定されます。そのため、NATを介さずに効率的な通信が実現でき、パフォーマンス面でもメリットがあります。
PodにグローバルIPアドレス(EIP)を付与する
Terwayでは、PodのENIにEIP(Elastic IP Address)を関連付けることもできます。これにより、Podに直接グローバルIPアドレスを付与することが可能になります。
今回、この機能を活用してsshdが動作するPodを作成してみました。Podにsshでログインすると、VPCのプライベートIPアドレスも同時に持っていることが確認できます。この特性を活かして、VPC PeeringやIPアドレスのホワイトリストを適切に設定すれば、踏み台サーバー(Bastion)として活用できるのではないかと考えました。
EIP付きPodを作成する手順
それでは、実際にEIPが付与されたPodを作成する手順をご紹介します。
1. ack-extend-network-controllerのインストール
まず、EIPをPodに関連付けるためのコントローラーをインストールします。Associate an EIP with a pod - Alibaba Cloud を参考に、Marketplaceから最新版をインストールしてください。
実体はHelmによるインストールになります。この際、EIPの有効化と、Kubernetesクラスターが存在するVPCのID、リージョンIDを指定します。
enableControllers:
- eip
networkController:
region: ap-northeast-1
vpcid: vpc-クラスタのあるVPCのID
2. IAMポリシーの割り当て
次に、ワーカーノードがEIPを操作できるように、k8s-workersロールにEIP操作権限を持つポリシーを割り当てます。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"vpc:DescribeVSwitches",
"vpc:AllocateEipAddress",
"vpc:AllocateEipAddressPro",
"vpc:DescribeEipAddresses",
"vpc:AssociateEipAddress",
"vpc:UnassociateEipAddress",
"vpc:ReleaseEipAddress",
"vpc:AddCommonBandwidthPackageIp",
"vpc:RemoveCommonBandwidthPackageIp",
"vpc:TagResources",
"ecs:DescribeNetworkInterfaces"
],
"Resource": "*"
}
]
}
3. EIPの作成
Alibaba Cloudのコンソールから、Podに割り当てるEIPを事前に作成しておきます。
4. sshdコンテナの作成とアノテーションの設定
sshdが動作するコンテナを用意し、Podにアノテーションを設定します。
なお、EIPを利用する場合はDeploymentではなくStatefulSetを使用する必要があります。これは、Podが再作成されたときに同じEIPを再度割り当てるために必要な制約です。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: bastion
spec:
serviceName: bastion
replicas: 1 # EIPが1つなのでレプリカ数も1にします
template:
annotations:
k8s.aliyun.com/pod-eip-instanceid: "eip-作成したEIPのID"
k8s.aliyun.com/pod-eip-release-strategy: "Never"
これだけの設定で、PodにEIPを付与することができます。
5. セキュリティグループの設定
セキュリティグループを指定したい場合は、PodNetworkingリソースを作成して設定します。
apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
name: bastion
spec:
selector:
podSelector:
matchLabels:
app: bastion
securityGroupIDs:
- sg-作成したセキュリティグループID
eniOptions:
eniType: Trunk
以上の手順で、わざわざ仮想マシンインスタンスを作成しなくても、EIPとVPCのプライベートIPアドレスの両方を持ったsshd Podが作成できました。
sshを使用するため、ポートフォワードやSOCKSプロキシとしても利用できます。ちょっとした作業や緊急時のアクセス手段など、さまざまな用途に応用できるのではないでしょうか。
まとめ
今回は、Alibaba CloudのKubernetes CNI「Terway」の特徴と、EIPをPodに付与する方法をご紹介しました。
TerwayはVPCとの統合度が高く、Podが直接vSwitchに接続されているかのように扱える点が大きな特徴です。さらにEIPを付与することで、踏み台サーバーのような用途にも活用できることがわかりました。
マルチクラウド環境で様々なクラウドサービスを触る機会がありますが、それぞれのクラウドベンダーが提供する独自の機能を理解し、活用していくことで、より効率的なインフラ構築ができると感じています。
Alibaba Cloudを使う機会がある方は、ぜひTerwayの機能を試してみてください。