SummerWind

Web, Photography, Space Development

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 はこの記事を書いている時点ではベータ版なので無料で使えるものの、正式版では有料になるらしい。非常に手軽に使えてとても気に入ったので、値段次第ではあるものの有料になっても使ってしまいそうだ。

Moto Ishizawa

Moto Ishizawa
ソフトウェアエンジニア。ロケットの打上げを見学するために、たびたびフロリダや種子島にでかけるなど、宇宙開発分野のファンでもある。