GKE(Google Kubernetes Engine)のServiceについて
- 本記事は、公式ドキュメント(https://cloud.google.com/kubernetes-engine/docs/concepts/service)の内容をかいつまんだもの(その他、参考したドキュメント・ブログ記事は本記事の末尾参照)
- GKE以外でのKubernetesのServiceは、本記事の内容と当てはまらない部分がある
- Ingressについてはこちらも参照:Kubernetes Ingressについて
Serviceとは
- 固定のIPアドレスをもつRESTのオブジェクト
- Cluster内外からのPod群(や、その他のバックエンド)へのアクセスを抽象化し、L4負荷分散の役割も担う
- PodもIPアドレスを持つが、同じPodが複数ある場合や、頻繁に破棄・再生成される場合があり、サービスに対するIPアドレスが定まらない
- 負荷分散アルゴリズムの設定については別途調査予定
Serviceのtype
ClusterIP
- デフォルトのモード
- Cluster内部からのみアクセス可能なService
- Pod間通信をさせたいがCluster外部からPodへアクセスさせたくない場合はこれを使う
apiVersion: v1
kind: Service
metadata:
name: my-cip-service
spec:
selector:
app: metrics
department: sales
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 8080
apiVersion: v1
kind: Service
metadata:
name: my-cip-service
spec:
selector:
app: metrics
department: sales
type: ClusterIP
ports:
- protocol: TCP
port: 80
targetPort: 8080
apiVersion: v1 kind: Service metadata: name: my-cip-service spec: selector: app: metrics department: sales type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 8080
NodePort
- ノードのある特定のポートへのアクセスを受け付けるService
- ノード:マシンのこと
- ポート番号は、Kuberentesが自動で指定する(非推奨だが、マニフェスト内の
nodePort
というキーに割り当てる値(30000~32767)で指定することもできる)
- ノードのある特定のポートにアクセスすればよいので、Cluster外からもアクセスできる
- Cluster外部からPodへのアクセスを受け付けたい場合はこれを使うが、基本的に直接アクセスできてしまいセキュリティ的によろしくないので、デバッグかdemoアプリのみで使う
- ClusterIPの拡張版
apiVersion: v1
kind: Service
metadata:
name: my-np-service
spec:
selector:
app: products
department: sales
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
apiVersion: v1
kind: Service
metadata:
name: my-np-service
spec:
selector:
app: products
department: sales
type: NodePort
ports:
- protocol: TCP
port: 80
targetPort: 8080
apiVersion: v1 kind: Service metadata: name: my-np-service spec: selector: app: products department: sales type: NodePort ports: - protocol: TCP port: 80 targetPort: 8080
LoadBalancer
- Cloud Load Balancingのロードバランサ―が作成されるService
- Cluster内外から、作成されたロードバランサ―のIPアドレスにアクセスすることでServiceにアクセスできる
- NodePortの拡張版
- 作成できるロードバランサ―の種類は下記の種類
- 内部ロードバランサ―
- Clusterが所属するVPC(Virtual Private Cloud)ネットワークに接続されたネットワークにあるクライアントのみがServiceにアクセスすることができる
metadata.annotations[]
に、下記のアノテーションを設定する必要があるnetworking.gke.io/load-balancer-type: "Internal"
(GKE 1.17 以降)cloud.google.com/load-balancer-type: "Internal"
(1.17 より前のバージョン)
- 外部ロードバランサ―
- 外部からServiceにアクセスすることができる
- 負荷分散の方法が異なる下記の種類のロードバランサ―を設定可能
(違いの詳細については要追加調査)- バックエンドサービスベースのロードバランサー
metadata.annotations[]
にcloud.google.com/l4-rbs: "enabled"
を設定する
- ターゲットプールベースのロードバランサ―
- バックエンドサービスベースのロードバランサー
- 内部ロードバランサ―
ExternalName
- Cluster外のサービスへのアクセスを、Cluster内にあるかのように抽象化できるService
- metadata下のnameキーに設定した値が
my-xn-service
で、spec
下のexternalName
というキーに設定した値がexample.com
だった場合(節末の例を参照)、Cluster内のPodからmy-xn-service.default.svc.cluster.local
へアクセスすると、example.com
へリダイレクトされるdefault
の部分はServiceのnamespace名
- Cluster内からCluster外のサービスを、IPアドレスを抽象化して使いたいときにこれを使う
apiVersion: v1
kind: Service
metadata:
name: my-xn-service
spec:
type: ExternalName
externalName: example.com
apiVersion: v1
kind: Service
metadata:
name: my-xn-service
spec:
type: ExternalName
externalName: example.com
apiVersion: v1 kind: Service metadata: name: my-xn-service spec: type: ExternalName externalName: example.com
Headless
- 負荷分散の機能とIPアドレスを持たないService
spec
下のclusterIP
というキーにNone
を設定することでHeadless Serviceを構成できる- ServiceとしてのIPアドレスは持たない(Cluster IPは持たない)が、
selector
に設定したPod群のIPアドレスすべてをDNAが返す- 下の例であれば、
hl-service.default.svc.cluster.local
のIPアドレスをCluster内のDNSに問い合わせると、app: mongodb
のPod群のIPアドレスがすべて返ってくる(hl-service
のnamespaceがdefault
と想定)
- 下の例であれば、
- (Serviceにより抽象化されない)ある特定のPodと直接通信したい場合にこれを使う
- 状態を持つアプリケーション(例えばDBなど)のデバッグ用途が主
- NodePort Serviceを使うとどのPodにアクセスできるかわからない
apiVersion: v1
kind: Service
metadata:
name: hl-service
spec:
clusterIP: None
selector:
app: mongodb
ports:
- protocol: TCP
port: 27107
targetPort: 27107
apiVersion: v1
kind: Service
metadata:
name: hl-service
spec:
clusterIP: None
selector:
app: mongodb
ports:
- protocol: TCP
port: 27107
targetPort: 27107
apiVersion: v1 kind: Service metadata: name: hl-service spec: clusterIP: None selector: app: mongodb ports: - protocol: TCP port: 27107 targetPort: 27107
参考
- https://cloud.google.com/kubernetes-engine/docs/concepts/service-load-balancer
- https://cloud.google.com/kubernetes-engine/docs/concepts/network-overview
- http://oad-balancing/docs/network/networklb-backend-service
- https://cloud.google.com/load-balancing/docs/backend-service
- https://kubernetes.io/ja/docs/concepts/services-networking/service/
- https://blog.mosuke.tech/entry/2021/08/26/kubernetes-externalname-service/
- https://www.youtube.com/watch?v=T4Z7visMM4E
- https://medium.com/swlh/discovering-running-pods-by-using-dns-and-headless-services-in-kubernetes-7002a50747f4
ディスカッション
コメント一覧
まだ、コメントがありません