Kubernetes Dashboard v2.0.0をデプロイする
November 25, 2019
いつの間にかv2.0.0がリリースされていた(まだベータだけど) https://github.com/kubernetes/dashboard/releases
デプロイした際にそのままマニフェストデプロイだとうまく行かなかったので手順メモ
環境
ソフト | バージョン |
---|---|
kubernetes | v1.14 |
OS | HypriotOS, Raspbian GNU/Linux 9 (stretch) |
kubernetes-dashboard | v2.0.0-beta3 |
マニフェストのダウンロード
リリースページ記載のリンクから一度マニフェストをローカルに落とします。 必要なnamespaceとかも作って欲しいので一度applyしておきます。
$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta3/aio/deploy/recommended.yaml
$ kubectl apply -f recommended.yaml
ServiceをNodePortに変更する
デフォルトだとClusterIPになってますが、これだとクラスタ内からしかアクセスできず不便なので、NodePortに変えておきます.
recommended.yamlを以下のように編集します
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
+ type: NodePort
ports:
- port: 443
targetPort: 8443
+ nodePort: 30843
selector:
k8s-app: kubernetes-dashboard
---
再びデプロイします。
$ kubectl apply -f recommended.yaml
確認します。 dashboardがNodePortで公開されています (ちなみにv2.0.0からnamespaceもkube-systemからkubernetes-dashboardへ変わったよう)
$ kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.97.146.221 <none> 8000/TCP 24m
kubernetes-dashboard NodePort 10.100.103.41 <none> 443:30843/TCP 24m
ダッシュボードへアクセス
NodeのIPを確認します。(以下は環境によって異なると思うので各自の環境に合わせてください)
$ kubectl get no -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready master 118d v1.14.1 192.168.13.101 <none> Raspbian GNU/Linux 9 (stretch) 4.14.98-v7+ docker://18.9.0
node-1 Ready <none> 118d v1.14.1 192.168.13.102 <none> Raspbian GNU/Linux 9 (stretch) 4.14.98-v7+ docker://18.9.0
node-2 Ready <none> 117d v1.14.1 192.168.13.103 <none> Raspbian GNU/Linux 9 (stretch) 4.14.98-v7+ docker://18.9.0
先ほどのNodePortで指定したIPと合わせて、アクセスします。
https://192.168.13.102:30843
が、しかし以下のようなエラーでアクセスできないと思います。
https://github.com/kubernetes/dashboard/issues/3804 上記issueにあるようにオレオレ証明書を生成すると解決できます。
Certs用のSecretを作成する
オレオレ証明書を作成
$ mkdir certs
$ openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=/ST=/L=/O=/OU=/CN=kubernetes-dashboard"
$ openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt
オレオレ証明書をkubernetesのsecretに登録 Secretをyamlで登録するのは暗号化とかがちょっと面倒なので、一度cliで登録した後にyaml形式を取り出します
// マニフェスト内で定義済みのものがあるので、一度削除する
$ kubectl -n kubernetes-dashboard delete secret kubernetes-dashboard-certs
$ kubectl -n kubernetes-dashboard create secret generic kubernetes-dashboard-certs --from-file=certs
secretのyaml形式を取得
$ kubectl -n kubernetes-dashboard get secret kubernetes-dashboard-certs -oyaml
ここで取得されるmetadataにはcreationTimestampなど不要なものも含まれるので、以下のようにそこは削除します。
マニフェスト内のcertsを新しい方に置き換えます。
- apiVersion: v1
- kind: Secret
- metadata:
- labels:
- k8s-app: kubernetes-dashboard
- name: kubernetes-dashboard-certs
- namespace: kubernetes-dashboard
- type: Opaque
+ apiVersion: v1
+ data:
+ dashboard.crt: LSdEQ...K
+ dashboard.csr: LS0t...0tLS0tCg==
+ dashboard.key: LS0t...BSSVZBVEUgS0VZLS0tLS0K
+ kind: Secret
+ metadata:
+ name: kubernetes-dashboard-certs
+ namespace: kubernetes-dashboard
+ labels:
+ k8s-app: kubernetes-dashboard
+ type: Opaque
これで再度applyし直します。
$ kubectl delete -f recommended.yaml
$ kubectl apply -f recommended.yaml
再びdashboardにアクセスしてみましょう
unsafeではありますが、dashboardへアクセスできるようになります。
Proceed to IP (unsafe)
リンクを押下しましょう
ログイン用のトークン
kubernetes-dashboardのログインではtokenかkubeconfigが要求されます。 ここではadmin用のtokenを使ってログインしてみましょう
下記のマニフェストをapplyします
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
applyすると、admin-userのtokenも作成されるので、それをdescibeで表示します
$ kubectl apply -f admin-user.yaml
$ kubectl get secret -n kubernetes-dashboard | grep admin
admin-user-token-g5vd9 kubernetes.io/service-account-token 3 5s
$ kubectl describe secret -n kube-system admin-user-token-g5vd9
表示されたtoken
の値をコピーして、ログインページで貼り付けます
みれました。
おまけ
podのcpu利用率やメモリ利用率をみたい
dashboardの中にmetricserverのメトリクスを回収するpodも内包されているようなので, metricserverをデプロイするだけで簡易的なcpu利用率などが見れるようになります。
$ git clone https://github.com/kubernetes-incubator/metrics-server.git
$ kubectl apply -f metrics-server/deploy/1.8+/
またマニフェストは以下のように修正しています
metrics-server/deploy/1.8+/
- image: k8s.gcr.io/metrics-server-amd64:v0.3.3
+ image: k8s.gcr.io/metrics-server-arm:v0.3.2
+ command:
+ - /metrics-server
+ - --kubelet-insecure-tls
+ - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
imageの変更は元がdebianだったらやらなくても良いです。
コマンドの修正はそのままだと、podなどのメトリクスがfetchできないというエラーが出ていたので https://qiita.com/chataro0/items/28f8744e2781f730a0e6 こちらの対応を参考にさせてもらいました。
これで少し待つと、以下のようにdashboardでpodの簡易的なメトリクスが見れるようになります。
Nodeに直接アクセスできない場合
きちんとした環境だと、踏み台経由でしかノードへアクセスできないので、NodePort使えないという場合があるかもしれません。 その場合は、ssh-proxyとかを使ってあげれば繋げれるかと思います。