changed 6 years ago
Published Linked with GitHub

監視できない

host user pass updated_at
133.242.236.104 ubuntu IXEQOI0FbjuyHU 2019-08-29T22:36:06+09:00

問題文

あなたは新しくkubernetesのクラスタを構築しました。そして、クラスタの情報を取得するためにnotifierというアプリケーションを作りました。このアプリケーションは自身がデプロイされたクラスタのPodに関するイベントを外部のサーバにwebhookする機能を持っています。

さて、そのアプリケーションをデプロイしてRunningと表示されるのですが、なぜかイベントを見ることが出来ません。なんとかしてイベントを見れるようにしてください。

条件

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

回答

お疲れさまです。大橋です。
問題「監視できない!」の回答をお送りいたします。

動作の確認

まず、初めにどの箇所でのエラーが発生しているかを特定するために、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

notifier-serviceaccount.yaml

apiVersion: v1 kind: ServiceAccount metadata: name: notifier-serviceaccount namespace: default

notifire-clusterrolebinding.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

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>
Select a repo