GKE上にデプロイしたkube-legoの"attempt to grant extra privileges"エラーに対処する

# kube-legoとは

KubernetesのIngressを利用して、Let's Encryptの証明書の自動適用を行うことができます。
これを用いることで、サービス側のファイルや設定にほぼ手を加えずにHTTPS化を行うことができます。

https://github.com/jetstack/kube-lego

# Unknown userエラー

クラスターのバージョンを上げた影響で発生するようになりました。
私は`1.9.4-gke.1`を使用しましたが、おそらく1.8系くらいから発生するようになっていると思います。

デプロイの詳細は省きます(公式リポジトリを参照)が、クラスタを立ち上げた直後にデプロイを行おうとすると以下のエラーが表示され、`ClusterRole`リソースがデプロイできませんでした。

```
$ kubectl apply -f stage.yaml
... created
... created
ingress "kube-lego-ingress" created
clusterrolebinding "kube-lego" created
configmap "kube-lego" created
deployment "kube-lego" created
serviceaccount "kube-lego" created
Error from server (Forbidden): error when creating "stage.yaml": clusterroles.rbac.authorization.k8s.io "kube-lego" is forbidden: attempt to grant extra privileges: [PolicyRule{Resources:["pods"], APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["pods"], APIGroups:[""], Verbs:["list"]} PolicyRule{Resources:["services"], APIGroups:[""], Verbs:["create"]} PolicyRule{Resources:["services"], APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["services"], APIGroups:[""], Verbs:["delete"]} PolicyRule{Resources:["services"], APIGroups:[""], Verbs:["update"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["create"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["delete"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["update"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["get"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["update"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["create"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["list"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["patch"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["delete"]} PolicyRule{Resources:["ingresses"], APIGroups:["extensions"], Verbs:["watch"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["create"]} PolicyRule{Resources:["endpoints"], APIGroups:[""], Verbs:["update"]} PolicyRule{Resources:["secrets"], APIGroups:[""], Verbs:["get"]} PolicyRule{Resources:["secrets"], APIGroups:[""], Verbs:["create"]} PolicyRule{Resources:["secrets"], APIGroups:[""], Verbs:["update"]}] user=&{h.sakano@world-bit.co.jp  [system:authenticated] map[authenticator:[GKE]]} ownerrules=[PolicyRule{Resources:["selfsubjectaccessreviews" "selfsubjectrulesreviews"], APIGroups:["authorization.k8s.io"], Verbs:["create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*" "/version"], Verbs:["get"]}] ruleResolutionErrors=[]
```

# 対応方法

現在ログイン中のユーザーに適切な権限を与えることで解決します。

```.sh
# gcloud container clusters get-credentialsは実行済の前提
$ gcloud info | grep Account
Account: [user@example.com]
$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=user@example.com
```

再実行することで解決することを確認します。

```
$ kubectl apply -f stage.yaml
... created
... created
ingress "kube-lego-ingress" created
clusterrolebinding "kube-lego" created
clusterrole "kube-lego" created
configmap "kube-lego" created
deployment "kube-lego" created
serviceaccount "kube-lego" created
```