🐍
Kubernetes に Tailscale の Subnet-router を配置して、クラスターの外からアクセスできるようにする
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