🐍

Kubernetes に Tailscale の Subnet-router を配置して、クラスターの外からアクセスできるようにする

2022/11/17に公開

Kubernetes の外から Service にアクセスしたい

おうちクラウドで出来ることと言えば、

  • MetalLB を入れて、外からアクセスできる仮想的な IP アドレスを持たせる
  • NodePort で、ワーカーノード経由でアクセスする

等ですが、MetalLB は IP アドレス管理を、NodePort だと空きポート番号を管理しないといけません。面倒くさいですね。(ちゃんときっちり何がどこにあるのか分かりやすいのではあるのですが……)

Tailscale で動的にトンネルを掘ってもらおう

Tailscale は、いま個人的には一番気に入ってる VPN サービスです。Free プランでも 20 デバイスまで無料で使えます。それでいてセットアップは簡単なので(ry

Tailscale を Kuberenetes にデプロイする

Tailscale on Kubernetes のドキュメントに書かれている通りだと、Pod がぽつーんと立ち上がるだけだったりします。
起動したときに配置されたワーカーノードが不意に故障したりすると、Tailscale の Pod 経由の通信は出来なくなっておしまいです。と言うことで、Deployment に直したものがこちらです。

subnet-router.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: subnet-router
  labels:
    app: tailscale
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tailscale
  template:
    metadata:
      labels:
        app: tailscale
    spec:
      serviceAccountName: "tailscale"
      containers:
      - name: tailscale
        imagePullPolicy: Always
        image: "ghcr.io/tailscale/tailscale:latest"
        env:
        # Store the state in a k8s secret
        - name: TS_KUBE_SECRET
          value: "tailscale"
        - name: TS_USERSPACE
          value: "true"
        - name: TS_AUTH_KEY
          valueFrom:
            secretKeyRef:
              name: tailscale-auth
              key: TS_AUTH_KEY
              optional: true
        - name: TS_ROUTES
          value: "10.96.0.0/12"
        securityContext:
          runAsUser: 1000
          runAsGroup: 1000

実際にデプロイするときはあらかじめ ServiceAccount や Secret を用意する必要があるので、公式ドキュメントの Makefile を使ってデプロイしていきます。

$ make rbac
$ kubectl apply -f subnet-router.yml

作成できると、Tailscale の管理画面上に Pod が表示されて通信できるようになります。

※ アドバタイズルートの承認やトークンの無期限化は必要に応じて実施してください。

Discussion