k3s+MetalLBの環境を構築してKubernetes-Dashboardをデプロイする 

# はじめに
お手軽＆軽量なk8s環境としてお馴染みな[k3s](https://k3s.io/)を、[MetalLB](https://metallb.universe.tf/)と組み合わせた時にハマったのでメモ。
サンプルとして[Kubernetes-Dashboard](https://github.com/kubernetes/dashboard)をloadBalancerIPを利用するようにデプロイするところまで書きます。

# k3sインストール
k3sには標準でソフトウェアLoadBalancerが実装されており、標準インストールをした状態でMetalLBを追加すると挙動が不安定になります。
そのため、インストール時にk3sのLoadBalancerを無効化しておきます。

```
$ curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-deploy servicelb" sh -
```
[公式ドキュメントにも記載があります。](https://rancher.com/docs/k3s/latest/en/configuration/#service-load-balancer)

#####(Option)手元のMacからkubectlを使う
k3sをインストールしたサーバで以下を実行

```
$ sudo cp /etc/rancher/k3s/k3s.yaml /tmp/
$ sudo chmod +r /tmp/k3s.yaml 
```

Mac上で以下を実行(Homebrew導入済みの前提)

```
$ brew install kubectl
$ mkdir ~/.kube
$ scp <k3sサーバのIP>:/tmp/k3s.yaml ~/.kube/config 
$ sed -i -e 's/127.0.0.1/<k3sサーバのIP>/g' ~/.kube/config 
```

k3sサーバ上の/tmp/k3s.yamlは適宜削除しておくこと。

# MetalLBインストール & 設定

公式サイトの[Installation](https://metallb.universe.tf/installation/)に沿って実施。
2019/10/04時点ではv0.8.1なので以下の通り。

```
$ kubectl apply -f https://raw.githubusercontent.com/google/metallb/v0.8.1/manifests/metallb.yaml
```

インストール後、[Configuration](https://metallb.universe.tf/configuration/)の内容を見ながらconfig用yamlファイルを作る。
今回は単純にk3sのNodeと同じNWのIPレンジを使いたいだけなので以下のように作成。

```metallb-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.24.100-192.168.24.199
```
```
$ kubectl apply -f metallb-config.yaml
```

# Kubernetes-Dashboardインストール
今回は以下の条件でデプロイします。
 - 個別のIPを割り当て（192.168.24.101を使用します）
 - httpでアクセス
 - アクセス時の認証なし
 セキュリティとか考えなしのガバガバ構成なので、気にする必要がある場合は適宜修正すること。

Githubの[Releases](https://github.com/kubernetes/dashboard/releases)を見て適当なバージョンのyamlを探してダウンロード。
今回はv2.0.0-beta4を利用します。

```
$ wget -O kubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
```

以下のように修正。

```diff
--- kubernetes-dashboard.yaml.orig	2019-10-04 00:37:28.000000000 +0900
+++ kubernetes-dashboard.yaml		2019-10-04 00:48:09.000000000 +0900
@@ -38,8 +38,10 @@
   namespace: kubernetes-dashboard
 spec:
   ports:
-    - port: 443
-      targetPort: 8443
+    - port: 80
+      targetPort: 9090
+  type: LoadBalancer
+  loadBalancerIP: 192.168.24.101
   selector:
     k8s-app: kubernetes-dashboard
 
@@ -160,7 +162,7 @@
 roleRef:
   apiGroup: rbac.authorization.k8s.io
   kind: ClusterRole
-  name: kubernetes-dashboard
+  name: cluster-admin
 subjects:
   - kind: ServiceAccount
     name: kubernetes-dashboard
@@ -191,10 +193,10 @@
           image: kubernetesui/dashboard:v2.0.0-beta4
           imagePullPolicy: Always
           ports:
-            - containerPort: 8443
+            - containerPort: 9090
               protocol: TCP
           args:
-            - --auto-generate-certificates
+            # - --auto-generate-certificates
             - --namespace=kubernetes-dashboard
             # Uncomment the following line to manually specify Kubernetes API server Host
             # If not specified, Dashboard will attempt to auto discover the API server and connect
@@ -210,7 +212,7 @@
             httpGet:
-               scheme: HTTPS
+               scheme: HTTP
               path: /
-              port: 8443
+              port: 9090
             initialDelaySeconds: 30
             timeoutSeconds: 30
       volumes:
```

編集したyamlを利用してデプロイ。

```
$ kubectl apply -f kubernetes-dashboard.yaml 
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
```
ブラウザでhttp\://192.168.24.101へアクセスするとDashboardが表示されます。
![スクリーンショット 2019-10-04 0.56.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274613/eb10601c-3c80-760a-4e31-dc818018468d.png)