修复Kubernetes v1.14中的microk8s仪表板和microk8s-hostpath(持久卷)

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

Kubernetesをサーバー1台で動かすには便利なMicroK8sですが、Kubernetes 1.14.6を動かしたときにいろいろエラーではまったので困る人が減るようにここに書いておきます。

0. Kubeflow 0.5.1不兼容Kubernetes v1.15的问题。

Kubeflow v0.5.1をインストールしようとしたのですが、Kubernetes v1.15 には対応していません。理由は、Ksonnetがv1.15には対応していないからです。Ksonnetはもうメンテナンスされず、Kubernets v1.15に対応する予定もありません。
※注:Kubeflow 0.6では、Ksonnetの代わりにKustomizeを使います。Kubeflow 0.6は、Kubernetes v1.15にも対応しています。

请查看以下内容,此事项与本篇文章无关。
在Qiita上使用MicroK8S(Kubernetes v1.14.6)运行Kubeflow 0.5.1 –
https://qiita.com/ynott/items/b250373e39938b1d4e7a

降级Kubernetes版本

暫時先將Kubernetes降級至v1.14.6版本試試看,這樣應該可以吧。

$ microk8s.reset
$ sudo snap refresh microk8s --channel=1.14/stable --classic

启用RBAC、DNS和仪表盘。

$ microk8s.enable rbac
$ microk8s.enable dns
$ microk8s.enable dashboard

大致上确认所有的Pod是否已经启动。

$ kubectl get pods -A
NAMESPACE     NAME                                              READY   STATUS             RESTARTS   AGE
kube-system   heapster-v1.5.2-5c5498f57c-slz9b                  4/4     Running            0          73s
kube-system   kube-dns-6bfbdd666c-lnztc                         3/3     Running            0          96s
kube-system   kubernetes-dashboard-6fd7f9c494-lr9vl             0/1     CrashLoopBackOff   3          73s
kube-system   monitoring-influxdb-grafana-v4-78777c64c8-skltl   2/2     Running            0          73s

仪表板出现CrashLoopBackOff错误…(泪流满面)。

2. 仪表盘没有响应问题

查看仪表板中Pod的日志,发现出现了以下错误。

$ kubectl log -n kube-system kubernetes-dashboard-6fd7f9c494-lr9vl
2019/09/11 04:37:02 Storing encryption key in a secret
panic: secrets is forbidden: User "system:serviceaccount:kube-system:kubernetes-dashboard" cannot create resource "secrets" in API group "" in the namespace "kube-system"

只需一个选择,以下是对上述内容的本地化汉语释义:

2-1. 设置Dashboard的角色和角色绑定。

当我在kubectl get clusterrole -n kube-system中查看时,发现没有dashboard的角色。当然,也没有clusterrolebinding。
但存在kubernetes-dashboard的serviceaccount。我通过搜索找到了角色。

可以从这个链接中提取出所需的部分。

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: kubernetes-dashboard-minimal-role
  namespace: kube-system
rules:
  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create"]
  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["create"]
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
  verbs: ["get", "update", "delete"]
  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["kubernetes-dashboard-settings"]
  verbs: ["get", "update"]
  # Allow Dashboard to get metrics from heapster.
- apiGroups: [""]
  resources: ["services"]
  resourceNames: ["heapster"]
  verbs: ["proxy"]
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal-rolebinding
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal-role
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

适用

kubectl apply -f dashboard-role.yaml

等了一会儿,它就开始运行了。

启用存储

$ microk8s.enable storage
Enabling default storage class
deployment.extensions/hostpath-provisioner created
storageclass.storage.k8s.io/microk8s-hostpath unchanged
Storage will be available soon

一看起來似乎是平常地在移動。

$ kubectl get pods -A
NAMESPACE     NAME                                              READY   STATUS    RESTARTS   AGE
kube-system   heapster-v1.5.2-5c5498f57c-slz9b                  4/4     Running   0          30m
kube-system   hostpath-provisioner-6d744c4f7c-8hn9k             1/1     Running   0          2m47s
kube-system   kube-dns-6bfbdd666c-lnztc                         3/3     Running   0          31m
kube-system   kubernetes-dashboard-6fd7f9c494-lr9vl             1/1     Running   9          30m
kube-system   monitoring-influxdb-grafana-v4-78777c64c8-skltl   2/2     Running   0          30m

主机路径提供程序未运行的问题

查看 hostpath-provisioner-6d744c4f7c-8hn9k。

kubectl logs -f pod/hostpath-provisioner-6d744c4f7c-8hn9k -n kube-system
E0911 05:07:23.834527       1 reflector.go:201] github.com/juju-solutions/hostpath-provisioner/vendor/github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:295: Failed to list *v1.PersistentVolume: persistentvolumes is forbidden: User "system:serviceaccount:kube-system:default" cannot list resource "persistentvolumes" in API group "" at the cluster scope
E0911 05:07:23.834720       1 reflector.go:201] github.com/juju-solutions/hostpath-provisioner/vendor/github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:294: Failed to list *v1.PersistentVolumeClaim: persistentvolumeclaims is forbidden: User "system:serviceaccount:kube-system:default" cannot list resource "persistentvolumeclaims" in API group "" at the cluster scope
E0911 05:07:23.835713       1 reflector.go:201] github.com/juju-solutions/hostpath-provisioner/vendor/github.com/kubernetes-incubator/external-storage/lib/controller/controller.go:265: Failed to list *v1.StorageClass: storageclasses.storage.k8s.io is forbidden: User "system:serviceaccount:kube-system:default" cannot list resource "storageclasses" in API group "storage.k8s.io" at the cluster scope

不行了。。

应用ServiceAccount、ClusterRole、ClusterRoleBinding。

最新的 storage.yaml 已经修复好了,所以请获取以下链接中的文件:
https://raw.githubusercontent.com/ubuntu/microk8s/master/microk8s-resources/actions/storage.yaml
然后再次运行 kubectl apply -f storage.yaml。
不过,由于 $ARCH 和 $SNAP_COMMON 可能为空,所以需要进行替换。

$ wget https://raw.githubusercontent.com/ubuntu/microk8s/master/microk8s-resources/actions/storage.yaml
$ sed -i -e 's|\$ARCH|amd64|g' storage.yaml
$ sed -i -e 's|\$SNAP_COMMON|/var/snap/microk8s/common|g' storage.yaml

使用kubectl apply进行应用

$ kubectl apply -f storage.yaml
deployment.extensions/hostpath-provisioner configured
storageclass.storage.k8s.io/microk8s-hostpath unchanged
serviceaccount/microk8s-hostpath created
clusterrole.rbac.authorization.k8s.io/microk8s-hostpath unchanged
clusterrolebinding.rbac.authorization.k8s.io/microk8s-hostpath unchanged
$ kubectl logs -n kube-system hostpath-provisioner-58c4d46947-2f6lh
I0911 05:47:41.651964       1 controller.go:293] Starting provisioner controller ab8727d6-d457-11e9-9d85-ee707c114ee2!

我移动了。看起来不错。

确认PVC是否移动

准备以下类型的PVC材料

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name:  demo-volume-claim
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: microk8s-hostpath
  resources:
    requests:
      storage: 500M
---

使用kubectl apply进行应用

$ kubectl apply -f demo-persistent-volume-claim.yml
persistentvolumeclaim/demo-volume-claim created
$ kubectl get pvc -A
NAMESPACE   NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
default     demo-volume-claim   Bound    pvc-f501dd62-d459-11e9-b7a7-000c29ab8f9c   500M       RWO            microk8s-hostpath   6s

因为看起来不错,所以删除

$ kubectl delete -f demo-persistent-volume-claim.yml
persistentvolumeclaim "demo-volume-claim" deleted
$ kubectl get pvc -A
No resources found.
bannerAds