树莓派的资源有限,不适合安装标准版的kubernetes,推荐在受限资源环境下使用的k3s,k3s是经过官方认证,完全兼容标准。

安装k3s

只有一个设备,只需安装简单配置的单机版即可,不需要安装更复杂配置的高可用版。详细完整的文档参考官方安装文档

  • 前置依赖

    使用Raspberry Pi OS时,有几个前置依赖需要先设置:

    • 从nftables切换到iptables

      执行命令

        sudo iptables -F
        sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
        sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
      
    • 启用cgroups

      修改/boot/cmdline.txt,在现有内容的最后增加:

      cgroup_memory=1 cgroup_enable=memory

  • 安装

    k3s默认会安装为系统服务,重启也确保服务自动启动

    • 最简方法

      执行curl -sfL https://get.k3s.io | sh -

    • 在线(国内加速)安装

      由于k3s安装时是从github下载文件,没有安装翻墙代理时无法正常下载安装,参考官方(中文)文档,提供了国内加速安装的方法,很好的解决访问github需要翻墙问题。

      curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

    • 离线安装

      在一些特殊情况完全无法访问外部网络时,可以使用k3s提供的离线安装方式。

      • 下载k3s二进制

        官方下载地址,树莓派是下载k3s-armhf文件,选择最新稳定版本

      • 下载k3s安装脚本

        curl -sfL https://get.k3s.io -o install.sh

      • 复制到树莓派

        在PC电脑上执行

        scp k3s-armhf pi@xxx.xxx.xxx.xxx:/home/pi/

        scp install.sh pi@xxx.xxx.xxx.xxx:/home/pi/

        在树莓派上执行

        chmod +x k3s-armhf && sudo cp /home/pi/k3s-armhf /usr/local/bin/k3s

      • 安装

        INSTALL_K3S_SKIP_DOWNLOAD=true /home/pi/install.sh

配置k3s

  • 配置外部kubectl/helm访问集群

    详细参考官方文档

    • 获取kubeconfig

      树莓派默认用户pi没有权限访问系统目录,root用户默认是无法直接ssh登录,所以直接使用scp无法复制到本地,分两步:

      ssh pi@xxx.xxx.xxx.xxx 'sudo cp /etc/rancher/k3s/k3s.yaml /home/pi/ && sudo chown pi.pi /home/pi/k3s.yaml'

      scp pi@xxx.xxx.xxx.xxx:/home/pi/k3s.yaml ~/.kube/config

    • 修改集群IP地址/机器名/域名

      编辑本地~/.kube/config文件,找到内容server: https://127.0.0.1:6443,根据实际情况修改127.0.0.1为真实的IP地址(或者能使用机器名/域名访问树莓派时,也可以替换为机器名/域名)

    • 验证

      PC电脑上执行(需要先确保PC上已安装kubectl命令)kubectl get node,有类似输出:

        NAME          STATUS   ROLES                  AGE     VERSION
        raspberrypi   Ready    control-plane,master   9m46s   v1.22.5+k3s1
      
  • 更换容器镜像源-新

    以 root 身份创建/etc/rancher/k3s/registries.yaml文件

    使用USTC的例子:

      mirrors:
          docker.io:
              endpoint:
                  - https://docker.mirrors.ustc.edu.cn/
                  - https://registry-1.docker.io
              rewrite: {}
      configs: {}
      auths: {}
    

    参考文档:

  • 更换容器镜像源-旧(可忽略)

    参考k3s官方的配置containerd文档

    • 复制配置文件

      sudo cp /var/lib/rancher/k3s/agent/etc/containerd/config.toml /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl

    • 修改config.toml.tmpl,添加如下内容,把默认的docker.io地址设置为镜像加速地址(这里选择了网易提供的镜像加速)

        [plugins.cri.registry.mirrors]
          [plugins.cri.registry.mirrors."docker.io"]
            endpoint = ["https://hub-mirror.c.163.com","https://mirror.baidubce.com"]
      
    • 验证

      • 重启k3s服务

        sudo systemctl restart k3s

      • 检查当前配置

        crictl info|grep -A 7 registry,有类似输出:

          "registry": {
            "mirrors": {
              "docker.io": {
                "endpoint": [
                  "https://hub-mirror.c.163.com",
                  "https://mirror.baidubce.com"
                ],
        

安装Kubernetes Dashboard

详细参考k3s官方的Kubernetes Dashboard文档

前面已经配置好了外部kubectl/helm访问集群,就可以通过PC电脑方便的操作Kubernetes了,下面的操作在PC电脑上执行即可(需要先确保PC上已安装kubectl命令)

  • 安装

      GITHUB_URL=https://github.com/kubernetes/dashboard/releases
      VERSION_KUBE_DASHBOARD=$(curl -w '%{url_effective}' -I -L -s -S ${GITHUB_URL}/latest -o /dev/null | sed -e 's|.*/||')
      kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/${VERSION_KUBE_DASHBOARD}/aio/deploy/recommended.yaml
    
  • 添加管理用户

    需要创建几个配置文件

    • dashboard.admin-user.yml

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: admin-user
          namespace: kubernetes-dashboard
      
    • dashboard.admin-user-role.yml

        apiVersion: rbac.authorization.k8s.io/v1
        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
      
    • 添加

      kubectl create -f dashboard.admin-user.yml -f dashboard.admin-user-role.yml

    - 获取登录Token

      `kubectl -n kubernetes-dashboard describe secret admin-user-token | grep '^token'`
    
  • 本地访问Dashboard

    利用kubectl命令本身提供的代理功能,简单方便。

    • 启动代理

      kubectl proxy

      默认使用8001端口,如果被其他服务占用,可以指定其他端口,例如:

      kubectl proxy --port=8010

    • 浏览器访问

      http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

      注意端口8001要保持和启动代理的端口一致

    • 登录

      输入前面已经获取的Token即可

  • 卸载

     kubectl delete ns kubernetes-dashboard
     kubectl delete clusterrolebinding kubernetes-dashboard
     kubectl delete clusterrole kubernetes-dashboard