# 監視できない | host | user | pass | updated_at | | -- | -- | -- | -- | | `133.242.236.104` | `ubuntu` | `IXEQOI0FbjuyHU` | `2019-08-29T22:36:06+09:00` | ## 問題文 あなたは新しくkubernetesのクラスタを構築しました。そして、クラスタの情報を取得するためにnotifierというアプリケーションを作りました。このアプリケーションは自身がデプロイされたクラスタのPodに関するイベントを外部のサーバにwebhookする機能を持っています。 さて、そのアプリケーションをデプロイしてRunningと表示されるのですが、なぜかイベントを見ることが出来ません。なんとかしてイベントを見れるようにしてください。 ![](https://i.imgur.com/oAxZV0C.png) ### 条件 notifierのイメージを変更してはいけない notifierはkubernetesの内部に設置すること default namespaceに別のPodをデプロイする際に、デフォルトで権限を与えすぎないようにすること ### ゴール miscサーバ上でlocalhostにcurlすると、最新のイベントが確認できる。 ### 情報 - k8s kubernetesが動作しているマシン。kubernetesの上ではnotifierが動作している。また、/manifestsにはnotifierをデプロイする際に使用したマニフェストが保存されている。 - IPアドレス: `192.168.0.1` - ユーザー名: `admin` - パスワード: `kkkkkkkks` - misc Docker Registryやwebappなどが動作しているマシン。 - IPアドレス: `192.168.0.201` - ユーザー名: `admin` - パスワード: `kkkkkkkks` ### 各アプリケーションの説明 - notifier kubernetes上で動作しているアプリケーション。kubernetesのPodリソースを監視し、作成, 変更, 削除があった場合には http://misc/webhook にイベント情報を飛ばす。 - webapp misc上で動作しているWebhookを受け取るアプリケーション。notifierから受け取った最新10件のイベント情報を http://misc で公開している。 ## 考察 これ [ServiceAccount を作成して Pod から kubectl を使って Pod の情報を取得する - Qiita](https://qiita.com/toshihirock/items/9f039d20beed9752440f) ## 回答 お疲れさまです。大橋です。 問題「監視できない!」の回答をお送りいたします。 ### 動作の確認 まず、初めにどの箇所でのエラーが発生しているかを特定するために、miscの動作とPodのログを確認しました。 #### miscの動作の確認 ``` admin@misc:~$ curl -X POST http://misc/webhook admin@misc:~$ curl http://misc <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Events</title> </head> <body> <h2>Latest 10 Events:</h2> <p> - - </p> </body> </html> ``` #### Podのログの確認 ``` admin@k8s:/manifests$ kubectl logs -f --since 1m notifier-59d7dd585f-g6mcl -f E0831 04:48:44.121781 6 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190620085101-78d2af792bab/tools/cache/reflector.go:98: Failed to list *v1.Pod: pods is forbidden: User "system:serviceaccount:default:default" cannot list resource "pods" in API group "" at the cluster scope ``` 以上より、miscは適切に動作しており、kubernetesの権限設定が正しく行われていないことがわかりました。 ### 設定 以下のページを参考に、設定を行いました。 [Configure Service Accounts for Pods - Kubernetes](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/) ### notifier-serviceaccount.yaml ```yaml= apiVersion: v1 kind: ServiceAccount metadata: name: notifier-serviceaccount namespace: default ``` ### notifire-clusterrolebinding.yaml ```yaml= apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: sample-clusterrolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: view subjects: - kind: ServiceAccount name: notifier-serviceaccount namespace: default ``` ### notifier.yaml ```yaml= apiVersion: apps/v1 kind: Deployment metadata: name: notifier labels: app: notifier spec: replicas: 1 selector: matchLabels: app: notifier template: metadata: labels: app: notifier spec: serviceAccountName: notifier-serviceaccount hostAliases: - ip: "192.168.0.201" hostnames: - "misc" containers: - name: notifier image: misc:5000/notifier ``` 上のようにファイルを設定した後、以下のコマンドを実行しました。 ``` $ kubectl apply -f notifier-serviceaccount.yml $ kubectl apply -f notifier-clusterrolebinding.yml $ kubectl apply -f notifier.yml ``` ### 結果の確認 miscサーバー上で`http://localhost`にリクエストを飛ばしゴールを達成したことを確認しました。 ``` $ curl http://localhost <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Events</title> </head> <body> <h2>Latest 10 Events:</h2> <p>add - kube-system - coredns-5c98db65d4-t9f45</p> <p>add - kube-system - etcd-k8s</p> <p>add - kube-system - kube-proxy-n8nt4</p> <p>add - default - notifier-84cb97f45f-nnc9m</p> <p>add - kube-system - coredns-5c98db65d4-9vz6s</p> <p>add - kube-system - kube-apiserver-k8s</p> <p>add - kube-system - kube-controller-manager-k8s</p> <p>update - default - notifier-59d7dd585f-g6mcl</p> <p>update - default - notifier-59d7dd585f-g6mcl</p> <p>delete - default - notifier-59d7dd585f-g6mcl</p> </body> </html> ```