【番外編】DigitalOceanのManaged Kubernetes101

あれからマニフェストファイルのリソース設定をいじってみたり、`minikube start`コマンドのオプションを色々試してみたのですがうまくいかなかったので、番外編としてDigitalOceanのManaged Kubernetesのセットアップをしてみたいと思います。
僕も使ったことがないのでドキドキです。

始めていきましょう。

(注：無料枠ではないので実行すると課金が発生します。)

## Get Started

トップページ(https://www.digitalocean.com/products/kubernetes/)からGet Startedしていきます。

## Create Cluster

Create Clusterページでロケーションやノードの設定などを行います。

<img width="1680" alt="Screenshot 2019-12-04 at 18.08.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/5d977b35-9735-ae74-22a6-93665179ca63.png">

最後に画面最下のCreate Clusterの緑のボタンを押すとクラスタの作成が開始されます。

## Configure Cluster

始めにマネジメントツールのインストールのステップがあります。`kubectl`の他にDigitalOceanのツールである`doctl`も使えるようですが今回は`kubectl`でいきます。

次にコンフィグファイルのダウンロードがあります。
おすすめされているのは`doctl`コマンドを使った自動更新ですが、今回はお試しなのでただダウンロードしてくるだけ（証明書は手動更新）のほうを選びます。

<img width="1680" alt="Screenshot 2019-12-04 at 18.18.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84014/f454b1e9-e94a-48aa-c59a-b80df0514fab.png">


ダウンロードが完了したら以下のコマンドでクラスタにアクセスできるかどうか確認してみます。

```sh
$ kubectl --kubeconfig="<file name>" get nodes
NAME                  STATUS   ROLES    AGE     VERSION
pool-y2hks24e6-l3t2   Ready    <none>   2m58s   v1.16.2
pool-y2hks24e6-l3tl   Ready    <none>   2m39s   v1.16.2
pool-y2hks24e6-l3tt   Ready    <none>   2m59s   v1.16.2
```

## デプロイ

ではデプロイしてみましょう。

```sh
$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" apply -f kubernetes/namespace.yaml
namespace/qiita created

$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" get namespaces
NAME              STATUS   AGE
default           Active   28m
kube-node-lease   Active   28m
kube-public       Active   28m
kube-system       Active   28m
qiita             Active   15s
```

いい感じです。他のリソースもこの調子で`kubectl apply`していきます。
すべてのリソースをアプライした後がこんな感じ。

```sh
$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" -n qiita get pods
NAME                                          READY   STATUS      RESTARTS   AGE
cockroach-init-fwjld                          0/1     Completed   0          14h
cockroachdb-0                                 1/1     Running     1          14h
cockroachdb-1                                 1/1     Running     80         14h
cockroachdb-2                                 1/1     Running     0          14h
kafka-0                                       2/2     Running     0          14h
kafka-1                                       2/2     Running     0          14h
kafka-2                                       1/2     Running     0          112s
kafka-etcd-0                                  1/1     Running     29         14h
kafka-etcd-1                                  1/1     Running     0          14h
kafka-etcd-2                                  1/1     Running     1          14h
qiita-advent-calendar-2019-7d7d7b44b6-rgf9g   1/1     Running     0          14h
qiita-advent-calendar-2019-r6pkv              0/1     Completed   0          14h
zetcd-cc957f748-7nlxg                         1/1     Running     0          14h
zetcd-cc957f748-lksmf                         1/1     Running     0          14h
```

うーん......？`Ready`にならないですね。。

```sh
$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" -n qiita logs kafka-0 broker
...
[2019-12-05 09:16:00,372] WARN [RequestSendThread controllerId=0] Controller 0's connection to broker kafka-1.broker.qiita.svc.cluster.local:9092 (id: 1 rack: null) was unsuccessful (kafka.controller.RequestSendThread)
java.io.IOException: Connection to kafka-1.broker.qiita.svc.cluster.local:9092 (id: 1 rack: null) failed.
	at org.apache.kafka.clients.NetworkClientUtils.awaitReady(NetworkClientUtils.java:70)
	at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:279)
	at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:233)
	at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:82)
[2019-12-05 09:16:00,433] WARN [Controller id=0, targetBrokerId=2] Error connecting to node kafka-2.broker.qiita.svc.cluster.local:9092 (id: 2 rack: null) (org.apache.kafka.clients.NetworkClient)
java.io.IOException: Can't resolve address: kafka-2.broker.qiita.svc.cluster.local:9092
	at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235)
	at org.apache.kafka.common.network.Selector.connect(Selector.java:214)
	at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864)
	at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265)
	at org.apache.kafka.clients.NetworkClientUtils.awaitReady(NetworkClientUtils.java:64)
	at kafka.controller.RequestSendThread.brokerReady(ControllerChannelManager.scala:279)
	at kafka.controller.RequestSendThread.doWork(ControllerChannelManager.scala:233)
	at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:82)
Caused by: java.nio.channels.UnresolvedAddressException
	at java.base/sun.nio.ch.Net.checkAddress(Net.java:112)
	at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622)
	at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233)
	... 7 more
...
```

これは......？

```yaml:kubernetes/kafka.yaml
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/path: /metrics
    prometheus.io/port: "5555"
    prometheus.io/scrape: "true"
  name: broker
  namespace: qiita
spec:
  clusterIP: None
  publishNotReadyAddresses: true
  ports:
    - port: 9092
      protocol: TCP
      targetPort: 9092
  selector:
    app: kafka
```

```sh
$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" -n qiita apply -f kubernetes/kafka.yaml
service/broker created
service/kafka unchanged
poddisruptionbudget.policy/kafka unchanged
statefulset.apps/kafka configured
configmap/kafka-configmap unchanged
configmap/jmx-exporter-configmap unchanged
```

```sh
$ kubectl --kubeconfig="$HOME/.kube/k8s-1-16-2-do-0-lon1-1575482940993-kubeconfig.yaml" -n qiita get pods
NAME                                          READY   STATUS      RESTARTS   AGE
cockroach-init-fwjld                          0/1     Completed   0          14h
cockroachdb-0                                 1/1     Running     1          14h
cockroachdb-1                                 1/1     Running     80         14h
cockroachdb-2                                 1/1     Running     0          14h
kafka-0                                       2/2     Running     0          6m7s
kafka-1                                       2/2     Running     0          5m30s
kafka-2                                       2/2     Running     0          5m16s
kafka-etcd-0                                  1/1     Running     29         14h
kafka-etcd-1                                  1/1     Running     0          14h
kafka-etcd-2                                  1/1     Running     1          14h
qiita-advent-calendar-2019-7d7d7b44b6-rgf9g   1/1     Running     0          14h
qiita-advent-calendar-2019-r6pkv              0/1     Completed   0          14h
zetcd-cc957f748-7nlxg                         1/1     Running     0          14h
zetcd-cc957f748-lksmf                         1/1     Running     0          14h
```

おお......。
というわけで`Service`リソースの設定ミスでした。失礼しました。

---

というわけで最近バズワードのKaaS(Kubernetes as a Service)の一つDigitalOceanが提供するサービスを使ってみました。
「触ってみた」程度ですがセットアップは非常に簡単で、ちょっとした環境が欲しいなってときには非常に便利だなと思いました。

いい息抜きになったので明日はアプリからKafkaを使っていきたいと思います。では。