Slide 1

Slide 1 text

kindでも ”type LoadBalancer” が使いたい!

Slide 2

Slide 2 text

Profile 2 上村 真也 ● 所属: Z Lab ● Twitter: @uesyn

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

このスライドは個人の見解であり、 所属する組織の公式見解ではありません。 4

Slide 5

Slide 5 text

5 kind ● DockerコンテナをノードとしてK8sクラスタを作成 ○ マルチノードの構成も可能 ● 詳しくは以下の@amsy810さんの資料を参照 ○ “Kubernetes in Docker で始めるお手軽 Kubernetes 環境” https://speakerdeck.com/masayaaoyama/cloudnativejp-09-kubernetes-in-docker-kind

Slide 6

Slide 6 text

6 "type LoadBalancer"なService ● LoadBalancerとServiceをいい感じに繋ぐ ● それぞれの環境にあった実装がなければ利用できない

Slide 7

Slide 7 text

7 ● “type LoadBalancer”は利用できない ○ Cloud Providerの実装やLBのコントローラを持ってないはず … ● 設定しないと接続できるのはAPI Serverのみ ○ NodePortへの接続も設定が必要 kindと”type LoadBalancer” kindでも”type LoadBalancer”を使いたい!

Slide 8

Slide 8 text

“type LoadBalancer”な Serviceへのアクセス 8 “type LoadBalancerを…” 3. MetalLBを利用 4. カスタムコントローラを実装 1. NodePortとextraPortMappings 2. kubectl port-forward 諦める 諦めない

Slide 9

Slide 9 text

NodePortとextraPortMappings 9 ● ホストとNodeコンテナのPortをマッピング ○ NodePort経由でPodへ接続できる ● Serviceを作るときNodePortを意識する必要 kind: Cluster apiVersion: kind.sigs.k8s.io/v1alpha3 nodes: - role: control-plane - role: worker extraPortMappings: - containerPort: 80 hostPort: 80 listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0" protocol: udp # Optional, defaults to tcp 諦める

Slide 10

Slide 10 text

kubectl port-forward 10 ● API Server経由でNode上のPodへ ○ TCPのみ対応 ● Serviceも指定できるが... ○ Service配下のどれか1つのPodへPortForward Pod1 Pod2 Pod3 K8s API Server kubectl port-forward 諦める 例) kubectl port-forward svc/test-service 10000:9000

Slide 11

Slide 11 text

MetalLBを利用 11 ● Linux環境であればMetalLBのL2-modeを使うと"type LoadBalancer"が利用可能 ● Docker Desktopではdockerのnetworkに疎通が難しくMetalLBは難しい ○ https://mauilion.dev/posts/kind-metallb/ 諦めない

Slide 12

Slide 12 text

12 Macを使っていても手軽に"type LoadBalancer"が使えないか?

Slide 13

Slide 13 text

カスタムコントローラを実装した 13 Pod1 Pod2 Pod3 LBPod K8s API Server port-forward ClusterIP ● Podとして動かしたLBでトラフィックをバランシング ○ そのLBのPodに対してPortForward ○ バランシングにはCluster-IPを利用 ○ kubectl port-forwardと同じくTCPのみ対応 ○ API Serverにつながれば良いだけ! 諦めない

Slide 14

Slide 14 text

実装の概要 14 ● コントローラはローカルのコマンドとして実行 LocalLB-controller ・"type LoadBalancer"なServiceをwatch ・上記ServiceのLBPodを作成 ・LBPodへPort-forward LBPod kind:Service Spec: type: LoadBalancer K8s API Server Port-Forward ・ServiceをownerReferenceとして持つ ・ServiceがなくなればGCされる ・コントローラを実行 ・"type LoadBalancer"なServiceを作成

Slide 15

Slide 15 text

15 デモ ● したいけど多分時間ない ● 気になる人はあとで個別で見に来てください ● ソースコードは後ほど展開します ○ 現在Private Repository ○ https://github.com/uesyn/k8s-local-loadbalancer

Slide 16

Slide 16 text

16 ご静聴ありがとうございました!