0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

EKSのAPIサーバーエンドポイントの設定の違いをまとめた

Posted at

背景

普段は現場のクローズドなEKSしか触っていなかったため、APIサーバのエンドポイントのパブリックアクセスなるものを知らなかった。
公式ドキュメントを読んでなんとなく理解したものの、実際の挙動が気になってしまったので動作検証してまとめてみた。

概要

マネジメントコンソール上での名称 パブリックアクセス プライベートアクセス 同一VPCからのアクセス インターネット経由でのアクセス
パブリック 有効 無効 -
パブリックおよびプライベート 有効 有効
プライベート 無効 有効 -

「パブリック」設定時の挙動

  • EKSクラスターの作成時のデフォルトの設定
  • VPC内の踏み台サーバやワーカノードからのコントロールプレーンへのアクセスはVPC外の通信となる
  • 必要に応じてパブリックエンドポイントへのアクセスできるCIDRを設定可能

chart-ページ2.drawio (1).png

同じVPC上のサーバからアクセス

名前解決
EKSクラスターと同じVPCに立てたEKS管理サーバから、APIサーバのエンドポイントの名前解決をするとグローバルIPアドレスが返ってくる。つまり、コントロールプレーンへのリクエストはVPCを離れることになる。

[root@ip-192-168-0-50 ~]# nslookup XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Server:         192.168.0.2
Address:        192.168.0.2#53

Non-authoritative answer:
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: グローバルIPアドレス①
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: グローバルIPアドレス②

接続確認

[root@ip-192-168-0-50 ~]# k get ns
NAME              STATUS   AGE
default           Active   18h
kube-node-lease   Active   18h
kube-public       Active   18h
kube-system       Active   18h

CIDRブロックでアクセス制御

APIサーバのエンドポイントをパブリックにした場合、CIDRブロックでアクセス制御を設定する事ができる。デフォルトは「0.0.0.0/0」だが、任意のCIDRブロックからのアクセスだけを許可することも可能。 CIDRブロックのアクセス制御をした場合、範囲外のIPアドレスからAPIサーバへアクセスすると設定どおりブロックされる。

[root@ip-10-1-1-102 ~]# k get ns
E1229 02:55:17.693490    2657 memcache.go:265] couldn't get current server API group list: Get "https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com/api?timeout=32s": dial tcp XX.XX.XX.XX:443: i/o timeout
^C

なお、EKSクラスターに設定したセキュリティグループはVPC内の通信にのみ適用されるため、インバウンドルールに許可設定がなくともAPIサーバにアクセスする事ができる。

「パブリックおよびプライベート」設定時の挙動

  • VPC内の踏み台サーバやワーカノードからのコントロールプレーンへのアクセスはVPC内の通信となる
  • つまり、VPC内からAPIサーバへのアクセスはVPC内で完結するけど、インターネットからもアクセスできるよって設定
  • こちらも必要に応じてパブリックエンドポイントへのアクセスできるCIDRを設定可能

chart-ページ2のコピー.drawio.png

同じVPC上のサーバからアクセス

名前解決
EKSクラスターと同じVPCに立てたEKS管理サーバから、APIサーバのエンドポイントの名前解決をするとクラスターを構築したVPC上のプライベートIPアドレスが解決される。

[root@ip-192-168-0-50 ~]# nslookup XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Server:         192.168.0.2
Address:        192.168.0.2#53

Non-authoritative answer:
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: 192.168.0.110
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: 192.168.2.137

接続確認

[root@ip-192-168-0-50 ~]# k get ns
NAME              STATUS   AGE
default           Active   18h
kube-node-lease   Active   18h
kube-public       Active   18h
kube-system       Active   18h

EKS管理サーバの通信はVPC間の通信となるため、EKSクラスターのセキュリティグループのインバウンドルールで許可をしないとタイムアウトとなってしまうので注意。

[root@ip-192-168-0-50 ~]# k get ns
Unable to connect to the server: dial tcp 192.168.0.110:443: i/o timeout

VPC外のEC2インスタンスからアクセス

名前解決
「パブリック」設定時と同じグローバルIPアドレスが返ってくる。
アクセスが許可されたCIDRブロック内のIPアドレスであれば、このインスタンスからもAPIサーバへアクセスすることができる。

[root@ip-10-1-1-102 ~]# nslookup XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Server:         10.1.1.2
Address:        10.1.1.2#53

Non-authoritative answer:
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: グローバルIPアドレス①
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: グローバルIPアドレス②

接続確認

[root@ip-10-1-1-102 ~]# k get ns
NAME              STATUS   AGE
default           Active   18h
kube-node-lease   Active   18h
kube-public       Active   18h
kube-system       Active   18h

この通信はVPC外からのアクセスになるので、EKSクラスターのセキュリティグループで許可されいなくても、アクセスが許可されたCIDRブロック内のIPアドレスであれば接続することができる。

「プライベート」設定時の挙動

  • Kubernetes APIサーバへのアクセスはすべてVPC経由のアクセスに限定される。

chart-ページ2のコピーのコピー.drawio.png

同じVPC上のサーバからアクセス

名前解決
クラスターを構築したVPC上のプライベートIPアドレスが解決される。

[root@ip-192-168-0-50 ~]# nslookup XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Server:         192.168.0.2
Address:        192.168.0.2#53

Non-authoritative answer:
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: 192.168.0.110
Name:   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.gr7.ap-northeast-1.eks.amazonaws.com
Address: 192.168.2.137

接続確認

[root@ip-192-168-0-50 ~]# k get ns
NAME              STATUS   AGE
default           Active   18h
kube-node-lease   Active   18h
kube-public       Active   18h
kube-system       Active   18h

ちなみに、どの環境でこのエンドポイントの名前解決をした場合でも同じ回答が返ってきた。従って、別のVPC(相互接続していない)やインターネット経由でAPIサーバへアクセスすることは出来ない。

まとめ

  • クローズドな環境であれば「プライベート」の設定で良さそう
  • どうしても別のVPCやインターネット越しにコントロールプレーン(APIサーバ)へアクセスする必要がある場合は「パブリック」を設定する
    • ただし、その場合は接続元のIPアドレスを限定するのが良さそう
  • VPCの中からのリクエストなのか外からのリクエストなのかによって送信元を制御する方法が異なるので注意
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?