kubernetes dashboardにIngressを通してアクセスする


kubernetesのリソースをGUIで操作できるdashboardを導入する。


環境
クライアント...dashboardを利用する端末(ubuntu)
サーバ...master1台(centos8)、worker2台(centos8)
kubernetes v1.21.3


以下のyamlを利用する。そのままだと見られないリソースが多いので適宜カスタマイズ。
https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

kube proxyコマンドで外部からの通信を受け付けるようにしても、dashboardを利用できず。。

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

以下のページによるとホストからのアクセス以外はHTTPSでのアクセスが必要なので、IngressでTLS設定をしてアクセスしてみる。
https://github.com/kubernetes/dashboard/blob/master/docs/user/accessing-dashboard/README.md#login-not-available

IngressをLoadBalancerで公開したいので、OpenELBをインストールし、セットアップ詳細は省略する。
設定をしなければNodePortで実施する。
https://porterlb.io/docs/getting-started/installation/install-porter-on-kubernetes/


IngressでTLSを終端する設定
①kubectl create secret tlsを実行

kubectl create secret tls dashboard-tls --key=dashboard.key --cert=dashboard.crt -n kubernetes-dashboard

②以下のようにingressオブジェクトを作成

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-dashboard-ing
  namespace: kubernetes-dashboard
spec:
  tls:
  - hosts:
      - k8s-dashboard.local
    secretName: dashboard-tls
  rules:
  - host: k8s-dashboard.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

③serviceリソース「kubernetes-dashboard」をNodePortへ変更


...
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
...

通信の設定が終わったのでデプロイし、実際にアクセス。しかしうまく行っていない。。
https://k8s-dashboard.local

以下のページを参考にIngressを修正したらアクセスできた。
https://serverfault.com/questions/1031810/400-error-with-nginx-ingress-to-kubernetes-dashboard

annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/configuration-snippet: |-
      proxy_ssl_server_name on;
      proxy_ssl_name $host;

結果

あとは、トークンを入力してログインするだけ。


所感
セキュリティを確保するのであればローカルからkubectl proxy公開したほうがよさそう。