おうちGKEする方法あれこれ

Kubernetesアドベントカレンダー2020 その3、12/11分です。（初・アドベントカレンダー）
https://qiita.com/advent-calendar/2020/kubernetes3
Kubernetes運用したことない初心者なのでツッコミ等歓迎です。
## これはなに？
おうちにあるラズパイなどを、GKEの一部として活用するための方法を調べてみました。
## きっかけ
おうちEKSというワードがtwitterで流れてきたのを見て
https://speakerdeck.com/ytaka23/infra-study-meetup-7th
なにそれ面白そう！！！と思ったのがきっかけです。

## はて、おうちEKS？

そういえばk3sとかもそういうエッジ向けだったはず...
GCPのAnthosもGKEをいろんなところに延伸する思想だし...
どんな技術が今あるのかちょっと調べてみよう！
とはいえ思ったよりいっぱいありそうなので、あくまでおうちGKEという観点で。

## そもそもクラウドのk8sを延伸して何が嬉しいの？

間違ってたら教えていただきたいのですが、クラウドのk8sを他所に伸ばすパターンとして、

- マルチクラウドなはなし(クラウド - クラウド)
- エッジコンピューティングなはなし(クラウド - オンプレ)

という2つがあると思っています。いろいろ順序が逆な気がしますが、前提としてクラウド上のk8sを使ってサービスを運用している、という状況があるとします。

### マルチクラウドのモチベーション

- メインの基盤はAWSのEKSだけどBigQuery使いてぇ
- GCPとつないでもいいんだけど...
  - データ転送のレイテンシ
  - 通信費用
  - セキュリティ面
- が気になるのでBigQueryの処理とかはGKEで処理したい！（そしていい感じにEKSとGKEをつなげたい！）

### エッジコンピューティングのモチベーション

- たとえばIoTでセンサからデータ収集してごにょごにょしたい
- 収集・処理はクラウドのk8sでやってもいいんだけど...
  - データ転送のレイテンシ
  - 通信費用
  - セキュリティ面
- がやっぱり気になるのでセンサの近くで処理できるところは処理したい！

## というわけで

エッジやマルチクラウドで一貫したk8sの体験を提供すべく、各社色々サービスを出しています。

- GCP: Anthos
- AWS: EKS anywhere[new!]
- Azure: Azure Arc(よく知らない)

最近結構盛り上がってる分野な気がしていて、おうちGKE、おうちEKS、やっといて損はないかな、と。

## やってみよう！

前置きが長くなりましたが、おうちのラズパイをクラウドの一部にするにはどういう方法があるのか、調べてみました。お手軽さ順でいきます。

### 1. Kube Edge

https://kubeedge.io/en/

- 今回の調査のきっかけ
- CNCF sandbox
- Kubernetesクラスターを組んだ際に起きる、NW不安定問題や、外部デバイスとの連携をうまーくラッピングしてくれるらしい
  - オフラインモード
  - MQTT？(外部デバイスとの連携)

### 1. Kube Edgeやってみた

- GKE + AWSのEC2(ubuntu)でできた
  - ほんとはおうちラズパイと組み合わせたかったけどラズパイ不良につき...
  - 以下構築メモ

```
参考: https://qiita.com/pideoh/items/cac19a32fdc723cca68d#kubeedge%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-2

- GKE構築
  - ノードはUbuntuにする
  - ScopeでFull権限
- network
  - 上り10000, 10002ポートをあける
- Master(GKE Nodeで作業)
  - kubectl使えるようにする
    - https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja
    - gcloud init --console-only
    - gcloud container clusters get-credentials cluster-1 --zone us-central1-c --project <your-project>
  - keadmインストール
    - wget https://github.com/kubeedge/kubeedge/releases/download/v1.4.0/keadm-v1.4.0-linux-amd64.tar.gz
  - のためにはauth-providerがgcpではだめ
  - ということでgcloudなしでkubectl使えるようにする
    - インスタンスについてるsa(Compute Engine default)の権限にKubernetes Engine, Clusterの管理者権限を付けておく
    - https://github.com/gravitational/teleport/blob/master/examples/k8s-auth/get-kubeconfig.sh
    - 作ったsaにフル権限付与
      - kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=teleport:teleport-sa
    - kubeconfigができるので.kube/configと入れ替える
  - これでようやくkeadmできた
    - ./keadm init --advertise-address="xxx.xxx.xxx.xxx(NodeのPublic IP)"
- Edge
  - Ubuntu on AWS
    - 準備
      - apt-get update
      - apt-get upgrade
      - apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
      - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
      - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
      - apt-get update
      - apt-get install docker-ce docker-ce-cli containerd.io
      - wget https://github.com/kubeedge/kubeedge/releases/download/v1.4.0/keadm-v1.4.0-linux-amd64.tar.gz
      - tar -xvf keadm-v1.4.0-linux-amd64.tar.gz
  - Kube Edge Master側で
    - keadm gettoken
  - クラスタにjoin
    - keadm join --cloudcore-ipport=xxx.xxx.xxx.xxx(GKE NodeのPublic IP):10000 --token=xxxxxx...
```

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89002/76bfc07e-e49d-078c-7970-46d070aba7c5.png)

### 1. 感想

- やり方(というか使い方)あってるかな...
- クラウド側のk8sクラスタの中にKube EdgeのマスターがCRDで作られて、ノードをぶら下げるという理解

### 2. Istioを使ったマルチクラスタ構成

- Istioでクラスタとクラスタをつなげる
  - https://istio.io/latest/docs/ops/deployment/deployment-models/

### 2. やってみた

- GKEクラスタとEKSクラスタをIstioで接続
  - https://istio.io/latest/docs/setup/install/multicluster/primary-remote_multi-network/
  - ここは基本的にマニュアル通り。GKE 1.17とEKS1.17(EC2)でできたー
  - すなわちGKE with おうちのk8sクラスタ、みたいなことが可能

### 2. 感想

- できるけどおうちk8sクラスタはそれ自体がちょっとハードル高い...
  - IstioベースのマルチクラスタがGCPのAnthosの考え方ですね

### 3. Anthos Bare-Metal

https://cloud.google.com/blog/ja/topics/hybrid-cloud/anthos-on-bare-metal-is-now-ga

- Anthosってもともとオンプレの資産を使う場合、オンプレ上のVMに立てたGKEクラスタ(GKE on Prem)とクラウドのGKEを一貫して管理しますよという話だったのでハードルがちょっと高かった
- のですが、VMがいらなくなって少し敷居が下がっています
- けどスペックはそこそこ求められるので検証できていません...
  - 2 つのノード（4 コア以上）、32 GB の RAM、128 GB のディスク
  - おうちAnthosはちょっとパワーが要る...

## 番外編A. EKS Anywhere

GKEメインで見てきましたが、AWSのEKSもオンプレに伸ばすサービスがつい先日発表されました。
https://aws.amazon.com/jp/eks/eks-anywhere/
おうちEKSもできるかも（でもこっちもスペックまぁまぁ要りそうですねきっと。

## 番外編B: クラウドの自前k8sクラスタとおうちをつなぐ

GKEとかEKSとか、可能な限りマネージドなものを使いたいですし、各社サービスはそれがウリではあるものの、それ以外でおうちのラズパイをクラウドの一部にする方法もあると思ったので、そちらも調べてみました。

### 番外編B-1. てゆーかそもそもk8sのノードはマスターと同じLANになくてもよいのでは？

- kubeadmでクラスタつくるとき、最終的にnodeからjoin！ってやってるよね
- マスターへの通信はインターネット経由でもいけるんちゃうん？
  - あくまで通信できればよくて認証とかは上のレイヤでやってるし
  - やりたいか、実用的かどうかはともかく

### 番外編B-1. やってみた

- GCEでコントロール、AWSでノード
- kubeadmで構築
  - https://docs.projectcalico.org/getting-started/kubernetes/self-managed-public-cloud/gce
- ハマった...
  - kubeadm init で --apiserver-advertise-addressでpublic IP設定してもダメ問題
    - public IPてNetwork Interfaceに紐付いてないのね...
    - NATからフォワードしてるとかなんかトリッキーな仕組み
    - すげー議論されてる
      - https://github.com/kubernetes/kubeadm/issues/1390
    - 結果、public IPが紐付いたNIを自前で作ればできた
    - すなわちGCP上の自前k8s with おうちのラズパイ、みたいなことが可能

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89002/96bf072f-320a-6c93-b903-16722ade7b6e.png)

### 番外編B-1. 感想

- やっぱりできる、、、けどもちろんこれだけだと実用に耐えない。。。

### 番外編B-2. k3s

https://k3s.io/

- k8s から 5つ機能を抜いてk3s
- Armでも動くIoT向け？なcertified k8s
- Rancherが開発→CNCF sandbox入り

### 番外編B-2. やって、、、ない

- たぶんやることは番外編1.と同じで、本質的にはk8sのディストリビューションの違いという差しかなさそうなので。。。

## まとめ

- クラウドのk8sクラスターをオンプレや他クラウドへ延伸するのが今アツい！（たぶん）
- おうちのラズパイをGKEやEKSの一部として活用できる！（理論的には）
- 各社力を入れていそうなので、今後に期待！
  - AWS使いとしてはECS Anywhereも気になる