Kubernetes で Cloudflare Warp を使う
Kubernetes クラスター上のコンテナでインターネット側からの Webhook を受信したくなったので、Cloudflare Warp を使ってみた。
この Kubernetes が置いてあるネットワークは、固定 IP アドレスを使ったり、一部のポートを外部のネットワークに対して開放できないので、どこかでトンネリングする必要がある。Cloudflare Warp はまさにその要件を満たすサービスで、Warp クライアント側から Cloudflare に接続すれば、そのコネクションを通じて Cloudflare 側からトラフィックが転送されてくる仕組みになっている。Ingress Controller も提供されているので Kubernetes でも試しやすい。
また、Kubernetes を Tinker Board で構築している関係で、今回使う Ingress Controller は Arm 向けに再ビルドする必要があった。ところが当初は依存する Go パッケージのリポジトリが非公開になっていてビルドできず、同様にビルドを試みた人による Issue も放置されていたので Twitter でボヤきつつ諦めかけていたところ、Cloudflare の中の人が対応してくれてビルドできるようにしてくれた (Thank you, Dane!)。
Ingress Controller のコンテナがうまくビルドできたところで、Kubernetes にデプロイする。デプロイまでの手順は以下の通り。まず Cloudflare にアカウントを作成して Zone の初期設定を済ませてから、クライアントコマンドを使用して Warp 用のクライアント証明書を取得する。
$ curl https://warp.cloudflare.com/dl/warp-stable-darwin-amd64.tgz
$ tar -zxC /usr/local/bin
$ chmod +x /usr/local/bin/cloudflare-warp
$ cloudflare-warp login
クライアント証明書が取得できたら、Kubernetes に Secret として保存しておく。
$ kubectl create secret generic cloudflare-warp-cert \
--from-file=${HOME}/.cloudflare-warp/cert.pem
次に Ingress Controller の Manifest を Kubernetes に適用する。Manifest 一式はリポジトリから取得できる。これで Warp と Kubernetes が接続できる状態になる。
$ kubectl apply -f cloudflare-warp.yml
Ingress Controller コンテナの起動が確認できたら、以下のような nginx を起動する Manifest を Kubernetes に適用すれば Warp と nginx コンテナが接続される。Ingress リソース内の host
の値に指定したサブドメインにアクセスすれば、Cloudflare 経由でコンテナにアクセスができるようになっているはず。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
app: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
annotations:
kubernetes.io/ingress.class: cloudflare-warp
spec:
rules:
- host: nginx.example.com
http:
paths:
- backend:
serviceName: nginx
servicePort: 80
Cloudflare Warp はこの記事を書いている時点ではベータ版なので無料で使えるものの、正式版では有料になるらしい。非常に手軽に使えてとても気に入ったので、値段次第ではあるものの有料になっても使ってしまいそうだ。