メインコンテンツまでスキップ

セキュリティグループの適用

カタログPodがRDSインスタンスに正常に接続するためには、正しいセキュリティグループを使用する必要があります。このセキュリティグループはEKSワーカーノード自体に適用することもできますが、これによりクラスター内のどのワークロードでもRDSインスタンスへのネットワークアクセスが可能になってしまいます。代わりに、Podのセキュリティグループを使用して、特定のカタログPodのみがRDSインスタンスにアクセスできるようにします。

RDSデータベースへのアクセスを許可するセキュリティグループは既にセットアップされており、次のように表示できます:

~$export CATALOG_SG_ID=$(aws ec2 describe-security-groups \
--filters Name=vpc-id,Values=$VPC_ID Name=group-name,Values=$EKS_CLUSTER_NAME-catalog \
--query "SecurityGroups[0].GroupId" --output text)
~$aws ec2 describe-security-groups \
--group-ids $CATALOG_SG_ID | jq '.'
{
  "SecurityGroups": [
    {
      "Description": "Applied to catalog application pods",
      "GroupName": "eks-workshop-catalog",
      "IpPermissions": [
        {
          "FromPort": 8080,
          "IpProtocol": "tcp",
          "IpRanges": [
            {
              "CidrIp": "10.42.0.0/16",
              "Description": "Allow inbound HTTP API traffic"
            }
          ],
          "Ipv6Ranges": [],
          "PrefixListIds": [],
          "ToPort": 8080,
          "UserIdGroupPairs": []
        }
      ],
      "OwnerId": "1234567890",
      "GroupId": "sg-037ec36e968f1f5e7",
      "IpPermissionsEgress": [
        {
          "IpProtocol": "-1",
          "IpRanges": [
            {
              "CidrIp": "0.0.0.0/0",
              "Description": "Allow all egress"
            }
          ],
          "Ipv6Ranges": [],
          "PrefixListIds": [],
          "UserIdGroupPairs": []
        }
      ],
      "VpcId": "vpc-077ca8c89d111b3c1"
    }
  ]
}

このセキュリティグループは:

  • ポート8080でPodが提供するHTTP APIへのインバウンドトラフィックを許可
  • すべてのエグレストラフィックを許可
  • 先ほど見たように、RDSデータベースへのアクセスが許可される

Podがこのセキュリティグループを使用するためには、SecurityGroupPolicy CRDを使用してEKSに特定のセキュリティグループを特定のPodセットにマッピングするよう指示する必要があります。設定内容は次のとおりです:

~/environment/eks-workshop/modules/networking/securitygroups-for-pods/sg/policy.yaml
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: catalog-rds-access
namespace: catalog
spec:
podSelector:
matchLabels:
app.kubernetes.io/component: service
securityGroups:
groupIds:
- ${CATALOG_SG_ID}
A

podSelectorapp.kubernetes.io/component: serviceというラベルを持つPodをターゲットにします

B

上記でエクスポートしたCATALOG_SG_ID環境変数には、一致するPodにマッピングされるセキュリティグループIDが含まれています

これをクラスターに適用し、カタログPodを再度リサイクルします:

~$kubectl kustomize ~/environment/eks-workshop/modules/networking/securitygroups-for-pods/sg \
| envsubst | kubectl apply -f-
namespace/catalog unchanged
serviceaccount/catalog unchanged
configmap/catalog unchanged
configmap/catalog-env-97g7bft95f unchanged
configmap/catalog-sg-env-54k244c6t7 created
secret/catalog-db unchanged
service/catalog unchanged
service/catalog-mysql unchanged
service/ui-nlb unchanged
deployment.apps/catalog unchanged
statefulset.apps/catalog-mysql unchanged
securitygrouppolicy.vpcresources.k8s.aws/catalog-rds-access created
~$kubectl delete pod -n catalog -l app.kubernetes.io/component=service
pod "catalog-6ccc6b5575-glfxc" deleted
~$kubectl rollout status -n catalog deployment/catalog --timeout 30s
deployment "catalog" successfully rolled out

今回はカタログPodが起動し、ロールアウトは成功します。ログを確認してRDSデータベースに接続していることを確認できます:

~$kubectl -n catalog logs deployment/catalog
Using mysql database eks-workshop-catalog.cjkatqd1cnrz.us-west-2.rds.amazonaws.com:3306
Running database migration...
Database migration complete