Skip to content

算能2042上部署k8s

Kubernetes(简称 K8s,因为 K 和 s 之间有 8 个字母)是一个开源的容器编排平台,由 Google 设计并捐赠给云原生计算基金会(CNCF)管理。

k8s是一个“容器管家”。当需要同时运行几十、几百甚至上千个 Docker 容器时,手动管理它们几乎不可能。K8s 的核心价值在于它能自动帮用户部署、伸缩、管理这些容器应用,并提供服务发现与负载均衡、滚动更新与回滚等其他功能。如今,K8s 已成为云原生时代的基础设施标准,被全球数千家企业用于生产环境。

图片描述

1 riscv版本官方支持情况

目前官方未提供riscv版本的工具以及镜像下载。但kubernets源码已经合入riscv实现。https://www.downloadkubernetes.com/

图片描述

虽然目前官方没有支持riscv的镜像,我们还可以通过本地编译来部署k8s。

2 k8s环境搭建

硬件环境:算能SG2044 RISC-V服务器

OS版本:openEuler 24.03 (LTS)

2.1 containerd和runc安装

containerd:2.2.0

runc:v1.4.0

注意,由于这里验证的k8s版本为1.34最新版,所以containerd也要较新的才可以。

containerd编译安装到/usr/local/bin目录下:https://github.com/containerd/containerd.git

runc有预编译版本,解压后放到/usr/local/sbin目录下即可:https://github.com/opencontainers/runc/releases

2.2 k8s二进制工具编译安装

官方未提供riscv工具,需自己编译,本地编译二进制文件方法:

git clone https://github.com/kubernetes/kubernetes.git
cd kubernetes/
git checkout release-1.34

KUBE_BUILD_PLATFORMS=linux/riscv64 make GOFLAGS=-v

(myenv) [hyj@openeuler-riscv64 kubernetes]$ ls -l _output/local/go/bin/
total 875600
-rwxr-xr-x 1 hyj hyj  57147576 Nov  6 14:48 apiextensions-apiserver
-rwxr-xr-x 1 hyj hyj 122657536 Nov  6 14:51 e2e.test
-rwxr-xr-x 1 hyj hyj 114124816 Nov  6 14:54 e2e_node.test
-rwxr-xr-x 1 hyj hyj  10027300 Nov  6 14:49 ginkgo
-rwxr-xr-x 1 hyj hyj   2031908 Nov  6 14:48 go-runner
-rwxr-xr-x 1 hyj hyj  54919352 Nov  6 14:48 kube-aggregator
-rwxr-xr-x 1 hyj hyj  79626424 Nov  6 14:48 kube-apiserver
-rwxr-xr-x 1 hyj hyj  67240120 Nov  6 14:48 kube-controller-manager
-rwxr-xr-x 1 hyj hyj   2949304 Nov  6 14:46 kube-log-runner
-rwxr-xr-x 1 hyj hyj  42401976 Nov  6 14:48 kube-proxy
-rwxr-xr-x 1 hyj hyj  46399672 Nov  6 14:48 kube-scheduler
-rwxr-xr-x 1 hyj hyj  71303352 Nov  6 14:47 kubeadm
-rwxr-xr-x 1 hyj hyj  57999544 Nov  6 14:46 kubectl
-rwxr-xr-x 1 hyj hyj  57213112 Nov  6 14:47 kubectl-convert
-rwxr-xr-x 1 hyj hyj  56230180 Nov  6 14:49 kubelet
-rwxr-xr-x 1 hyj hyj  52494520 Nov  6 14:48 kubemark
-rwxr-xr-x 1 hyj hyj   1769656 Nov  6 14:46 mounter
将kubectl kubeadm,kubelet三个工具拷贝到/usr/local/bin即可全局使用:
(myenv) [hyj@openeuler-riscv64 kubernetes]$ kubelet --version
Kubernetes v1.34.1-62+79a8f71ff82983
(myenv) [hyj@openeuler-riscv64 kubernetes]$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"34+", EmulationMajor:"", EmulationMinor:"", MinCompatibilityMajor:"", MinCompatibilityMinor:"", GitVersion:"v1.34.1-62+79a8f71ff82983", GitCommit:"79a8f71ff8298346758d0b920f0981da3c0e9481", GitTreeState:"clean", BuildDate:"2025-11-06T03:42:24Z", GoVersion:"go1.24.9", Compiler:"gc", Platform:"linux/riscv64"}
(myenv) [hyj@openeuler-riscv64 kubernetes]$ kubectl version --client
Client Version: v1.34.1-62+79a8f71ff82983
Kustomize Version: v5.7.1
基本的需要都有了,还有ectd,coredns没有。

2.3 etcd编译安装

编译etcd,编译完成拷贝到/usr/local/bin使用

git clone https://github.com/etcd-io/etcd.git
git checkout release-3.6
GOOS=linux GOARCH=riscv64 ARCH=riscv64 GO_BUILD_FLAGS='-v -mod=readonly' ./scripts/build.sh

(myenv) [hyj@openeuler-riscv64 etcd]$ ls bin
etcd  etcdctl  etcdutl

2.4 编译安装coredns

用于给k8s提供地址解析服务。coredns官方已经有预编译版本,下载后解压即可

wget https://github.com/coredns/coredns/releases/download/v1.13.1/coredns_1.13.1_linux_riscv64.tgz

2.5 安装cni插件

git clone https://github.com/containernetworking/plugins.git
cd plugin
./build_linux.sh
在bin目录下生成的二进制文件拷贝到 /opt/cni/bin目录中即可。

3 启动服务

3.1 启动containerd服务

3.1.1 containerd服务配置

vim /usr/lib/systemd/system/containerd.service
指定启动containerd的binary位置,

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limits causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target

3.1.2 containerd配置文件

生成配置文件:

containerd config default | tee /etc/containerd/config.toml
vim /etc/containerd/config.toml,打开配置文件,修改pause镜像的位置,k8s官方pause镜像不支持riscv64,需要改为一个社区版本的
    [plugins.'io.containerd.cri.v1.images'.pinned_images]
      sandbox = 'portainer/pause-linux-riscv64:latest'
以及修改 runc的二进制文件的位置:
     [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
            BinaryName = '/usr/local/sbin/runc'

3.1.3 启动containerd

systemctl daemon-reload
systemctl start containerd

3.2 后台启动etcd

export ETCD_UNSUPPORTED_ARCH=riscv64
nohup etcd --listen-client-urls=http://127.0.0.1:2379 --advertise-client-urls=http://127.0.0.1:2379 > etcd.log 2>&1 &

[root@openeuler-riscv64 kubernetes]# netstat -ltnp | grep 2379
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      328510/etcd

3.3 启动coredns

coredns -dns.port=53

3.4 启动apiserver

3.4.1 key和证书

准备key和证书,注意cnf文件中要增加本机地址,不然服务起不起来。

mkdir -p /etc/kubernetes/pki 
cd /etc/kubernetes/pki 
cat > /etc/kubernetes/apiserver.cnf <<EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name

[req_distinguished_name]

[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
IP.1 = 127.0.0.1
IP.2 = 10.0.0.1
IP.3 = 10.230.214.24
IP.4 = 10.96.0.1
EOF

# 生成 API Server 证书
openssl genrsa -out /etc/kubernetes/pki/apiserver.key 2048
openssl req -new -key apiserver.key -out apiserver.csr -subj "/CN=kube-apiserver" -config apiserver.cnf
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out apiserver.crt -days 365 -extensions v3_req -extfile apiserver.cnf

# 生成服务账户密钥
openssl genrsa -out /etc/kubernetes/pki/sa.key 2048
openssl rsa -in /etc/kubernetes/pki/sa.key -pubout -out /etc/kubernetes/pki/sa.pub

3.4.3 启动apiserver

nohup kube-apiserver --etcd-servers=http://127.0.0.1:2379 --bind-address=0.0.0.0 --secure-port=6443 --advertise-address=0.0.0.0 --authorization-mode=AlwaysAllow --anonymous-auth=false --service-account-issuer=api --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --client-ca-file=/etc/kubernetes/pki/ca.crt --tls-cert-file=/etc/kubernetes/pki/apiserver.crt --tls-private-key-file=/etc/kubernetes/pki/apiserver.key  > kube-apiserver.log 2>&1 &
看日志显示successfully即可。
I1107 14:02:08.528381  432132 event.go:389] "Event occurred" object="kubernetes" fieldPath="" kind="ServiceCIDR" apiVersion="networking.k8s.io/v1" type="Warning" reason="KubernetesDefaultServiceCIDRInconsistent" message="The default ServiceCIDR [10.0.0.0/24] does not match the controller flag configurations [10.96.0.0/12]"
I1107 14:02:08.546086  432132 controller.go:667] quota admission added evaluator for: leases.coordination.k8s.io
I1107 14:02:08.548981  432132 cache.go:39] Caches are synced for autoregister controller
I1107 14:02:08.592676  432132 cache.go:39] Caches are synced for RemoteAvailability controller
I1107 14:02:08.595521  432132 cache.go:39] Caches are synced for APIServiceRegistrationController controller
I1107 14:02:08.595760  432132 shared_informer.go:356] "Caches are synced" controller="cluster_authentication_trust_controller"
I1107 14:02:08.648080  432132 handler_discovery.go:451] Starting ResourceDiscoveryManager
I1107 14:02:09.003985  432132 storage_scheduling.go:111] all system priority classes are created successfully or already exist.

3.5 启动 Controller Manager

3.5.1 准备证书

openssl genrsa -out /etc/kubernetes/pki/controller-manager.key 2048
openssl req -new -key /etc/kubernetes/pki/controller-manager.key -out /etc/kubernetes/pki/controller-manager.csr -subj "/CN=system:kube-controller-manager"
openssl x509 -req -in /etc/kubernetes/pki/controller-manager.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/controller-manager.crt -days 365

3.5.2 配置文件

编写controller manager配置文件:vim /etc/kubernetes/controller-manager.conf

apiVersion: v1
kind: Config
clusters:
- name: local
  cluster:
    server: https://10.230.214.24:6443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: system:kube-controller-manager
  user:
    client-certificate: /etc/kubernetes/pki/controller-manager.crt
    client-key: /etc/kubernetes/pki/controller-manager.key
contexts:
- context:
    cluster: local
    user: system:kube-controller-manager
  name: default
current-context: default

3.5.3 启动controller-manager

nohup kube-controller-manager --kubeconfig=/etc/kubernetes/controller-manager.conf  --cluster-cidr=10.244.0.0/16 --allocate-node-cidrs=true --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key > kube-controller-manager.log 2>&1 &

3.6 启动kube-scheduler

3.6.1 准备证书设置

openssl genrsa -out /etc/kubernetes/pki/scheduler.key 2048
openssl req -new -key /etc/kubernetes/pki/scheduler.key -out /etc/kubernetes/pki/scheduler.csr -subj "/CN=system:kube-scheduler"
openssl x509 -req -in /etc/kubernetes/pki/scheduler.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/scheduler.crt -days 365

3.6.2 配置文件

vim /etc/kubernetes/scheduler.conf
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: https://127.0.0.1:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: system:kube-scheduler
  name: system:kube-scheduler@kubernetes
current-context: system:kube-scheduler@kubernetes
users:
- name: system:kube-scheduler
  user:
    client-certificate: /etc/kubernetes/pki/scheduler.crt
    client-key: /etc/kubernetes/pki/scheduler.key

3.6.3 启动scheduler

nohup kube-scheduler --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=false > kube-scheduler.log 2>&1 &

3.7 启动proxy服务

3.7.1 准备证书

openssl genrsa -out /etc/kubernetes/pki/kube-proxy.key 2048
openssl req -new -key /etc/kubernetes/pki/kube-proxy.key -out /etc/kubernetes/pki/kube-proxy.csr -subj "/CN=system:kube-proxy"
openssl x509 -req -in /etc/kubernetes/pki/kube-proxy.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/kube-proxy.crt -days 365

3.7.2 配置文件

tee /etc/kubernetes/kube-proxy-config.yaml > /dev/null <<EOF
apiVersion: kubeproxy.config.k8s.io/v1alpha1
bindAddress: 0.0.0.0
clientConnection:
  kubeconfig: /etc/kubernetes/kube-proxy.kubeconfig
clusterCIDR: 10.244.0.0/16
healthzBindAddress: 0.0.0.0:10256
kind: KubeProxyConfiguration
metricsBindAddress: 0.0.0.0:10249
mode: iptables
EOF
vim /etc/kubernetes/kube-proxy.kubeconfig
apiVersion: v1
kind: Config
clusters:
- name: local
  cluster:
    server: https://10.230.214.24:6443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: kube-proxy
  user:
    client-certificate: /etc/kubernetes/pki/kube-proxy.crt
    client-key: /etc/kubernetes/pki/kube-proxy.key
contexts:
- context:
    cluster: local
    user: kube-proxy
  name: kube-proxy-context
current-context: kube-proxy-context

3.7.3 启动proxy

nohup kube-proxy   --config=/etc/kubernetes/kube-proxy-config.yaml --v=2 > kube-proxy.log 2>&1 &

3.8 启动kubelet服务

3.8.1 生成证书

openssl genrsa -out /etc/kubernetes/pki/kubelet.key 2048
openssl req -new -key /etc/kubernetes/pki/kubelet.key -out /etc/kubernetes/pki/kubelet.csr -subj "/CN=system:node:$(hostname)/O=system:nodes"
openssl x509 -req -in /etc/kubernetes/pki/kubelet.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/kubelet.crt -days 365

3.8.2 配置kubelet

创建kubelet服务: vim /etc/systemd/system/kubelet.service

[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/
[Service]
ExecStart=/usr/local/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf
Restart=always
StartLimitInterval=0
RestartSec=10
[Install]
WantedBy=multi-user.target
编写配置文件:vim  /etc/kubernetes/kubelet.conf
apiVersion: v1
kind: Config
kubeconfig: /var/lib/kubelet/config.yaml
clusters:
- cluster:
    certificate-authority: /etc/kubernetes/pki/ca.crt
    server: https://127.0.0.1:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubelet
  name: kubelet
current-context: kubelet
users:
- name: kubelet
  user:
    client-certificate: /etc/kubernetes/pki/kubelet.crt
    client-key: /etc/kubernetes/pki/kubelet.key
编写kubeconfig:vim /var/lib/kubelet/config.yaml
address: "0.0.0.0"
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 0s
    enabled: true
  x509:
    clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
  mode: Webhook
nodeRegistration:
  criSocket: "unix:///var/run/containerd/containerd.sock"
  imagePullPolicy: IfNotPresent
  kubeletExtraArgs:
    pod-infra-container-image: "portainer/pause-linux-riscv64:latest"
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: cgroupfs
cgroupRoot: /
clusterDNS:
 - 10.230.214.24
clusterDomain: cluster.kubernetes
resolvConf: /etc/resolv.conf

3.2.2 启动kubelet

systemctl daemon-reload
systemctl start kubelet

4 启动集群

4.1 创建集群

openssl genrsa -out /etc/kubernetes/pki/admin.key 2048
openssl req -new -key /etc/kubernetes/pki/admin.key -out /etc/kubernetes/pki/admin.csr -subj "/CN=admin/O=system:masters"
openssl x509 -req -in /etc/kubernetes/pki/admin.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out /etc/kubernetes/pki/admin.crt -days 365

kubectl config set-cluster kubernetes --server=https://127.0.0.1:6443 --certificate-authority=/etc/kubernetes/pki//ca.crt
kubectl config set-credentials admin --client-certificate=/etc/kubernetes/pki/admin.crt --client-key=/etc/kubernetes/pki/admin.key
kubectl config set-context kubernetes --cluster=kubernetes --user=admin
kubectl config use-context kubernetes

[root@openeuler-riscv64 kubernetes]# kubectl get nodes
NAME                STATUS   ROLES           AGE     VERSION
openeuler-riscv64   Ready    control-plane   3d23h   v1.34.1-62+79a8f71ff82983

4.2 启动网络插件pod

[root@openeuler-riscv64 kubernetes]# kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel unchanged
clusterrolebinding.rbac.authorization.k8s.io/flannel unchanged
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

[root@openeuler-riscv64 kubernetes]# kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-zqx5v   1/1     Running   0          3h50m

4.3 创建pod

以busybox镜像来创建容器为例: 编写配置文件 vim test_riscv64.yaml

apiVersion: v1
kind: Pod
metadata:
  name: busybox-riscv64-fixed
spec:
  containers:
  - name: busybox
    image: busybox:stable
    command: ["/bin/sh"]
    args: ["-c", "sleep 3600"]
  dnsPolicy: Default
  nodeSelector:
    kubernetes.io/arch: riscv64
  restartPolicy: Never
创建:
kubectl apply -f test_riscv64.yaml
[root@openeuler-riscv64 kubernetes]# kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
busybox-riscv64-fixed   1/1     Running   0          50m

4.4 进入容器

进入容器:

kubectl exec -it busybox-riscv64-fixed -- /bin/sh

图片描述

5 kubernets-dashboard

5.1 编译安装

先安装kind:

git clone https://github.com/kubernetes-sigs/kind.git
make build
cp ./bin/kind /usr/local/bin/
获取dashboard代码,编译代码, dashbord网页主要用go和js,css编写:
git clone https://github.com/kubernetes/dashboard.git
git checkout release/v7.9.0
cd modules/web && yarn
make build
用make build可以编译出二进制文件,然后进行手动部署;

编译前端部分报错 非法指令 错误:

[dashboard-web] Building localized frontend
make[2]: *** [Makefile:112: --ng-build] Illegal instruction (core dumped)
make[1]: *** [Makefile:14: web/] Error 2
make: *** [Makefile:28: build] Error 2
意思是在编译dashboard-web这个可执行文件时, yarn --ng-build命令执行时报错,即angular cli有问题: 图片描述

解决办法: 上图显示angular 不兼容node版本,angular原本用的是16.2.1。 进入到modules/web目录下,对angular进行升级:直接修改 modules/web 下面的 package.json,将angular/core和angular/cli的版本修改为^18.0.0。即安装 v18 以上的angular。 用下面的命令升级cli,升级不能跳代,需要一级一级升级……

npx ng update @angular/cli@17 --allow-dirty
npx ng update @angular/cli@18 --allow-dirty
装好后显示正常:

图片描述

但是!还是有错:

图片描述

看来还有其他包有问题,在node_modules下面找:

find node_modules -type f -executable -name "*" | xargs file | grep -i "elf"
发现一个nice-napi中,既有x86的预编译版本,又有源码编译的riscv版本:
node_modules/nice-napi/prebuilds/linux-x64/node.napi.node:                                                                  ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped
node_modules/nice-napi/build/Release/nice_napi.node:                                                                        ELF 64-bit LSB shared object, UCB RISC-V, RVC, double-float ABI, version 1 (SYSV), dynamically linked, BuildID[sha1]=caad0df37f91c720475e62014b4119f1a5b11ab8, not stripped
删掉prebuilds下面的,还是有非法指令报错!继续查找:
find node_modules -type f -name "*.node" -exec file {} \; > /tmp/all_nodes.txt
grep -v "riscv" /tmp/all_nodes.txt | grep -v "RISC-V"
发现了一个不支持riscv的包:
node_modules/uWebSockets.js/uws_darwin_arm64_115.node: Mach-O 64-bit arm64 dynamically linked shared library, flags:<NOUNDEFS|DYLDLINK|TWOLEVEL|WEAK_DEFINES|BINDS_TO_WEAK|NO_REEXPORTED_DYLIBS|HAS_TLV_DESCRIPTORS>
在node_modules/uWebSockets.js模块下面: 没有riscv的.node文件,需要手动编译

图片描述

重新编译uWebsocket.js

npm rebuild uWebSockets.js --build-from-source
编译完后目录下没有生成任何.node文件说明编译失败,这个包只提供二进制文件,不提供源码编译 克隆源码来编译:https://github.com/uNetworking/uWebSockets.js.git
git submodule update --init --recursive
yum install nodejs-devel
mkdir -p targets/node-v20.18.2/include
ln -s /usr/include/node targets/node-v20.18.2/include
然后修改文件build.c,增加riscv相关的识别代码
 const char *ARM = "arm";
 const char *ARM64 = "arm64";
 const char *X64 = "x64";
 const char *RISCV64 = "riscv64";


#ifdef __arm__
    arch = ARM;
#endif
#ifdef __aarch64__
    arch = ARM64;
#endif
#ifdef __riscv
    arch = RISCV64;
#endif
编译uWebSocket.js:
make -j
编译完成:
[hyj@openeuler-riscv64 uWebSockets.js]$ ls dist/
uws.js  uws_linux_riscv64_115.node
 uws_linux_riscv64_115.node 拷贝  dashboard  modules/web/node_modules/uWebSockets.js 目录中去:
cp ./dist/uws_linux_riscv64_115.node ../dashboard/modules/web/node_modules/uWebSockets.js/
另外, typescript 版本太低,无法匹配高版本的 go 和 node,需要将其升级到 5.4.0

其他报错:

/home/hyj/ecosystem/dashboard/modules/web/src/index.ts: Unknown version 142 of and_chr (While processing: "base$0$0")
这是browserlist版本太低,不支持很多高版本的浏览器,更新 browserlist 数据库:
npx update-browserslist-db@latest --force
再编译 web 模块就成功了! 重新回到 dashboard 主目录继续编译:
make build
编译完成后,四个二进制文件位置:
./modules/auth/.dist/dashboard-auth
./modules/metrics-scraper/.dist/dashboard-metrics-scraper
./modules/api/.dist/dashboard-api
./modules/web/.dist/dashboard-web

5.2 启动服务

运行使用:启动web(前端)

KUBERNETES_SERVICE_HOST=10.230.214.24 KUBERNETES_SERVICE_PORT=6443 nohup ./dashboard-web --insecure-port 8001 --insecure-bind-address 0.0.0.0 --kubeconfig ~/.kube/config > web.log 2>&1 &
启动api(后端):
KUBERNETES_SERVICE_HOST=10.230.214.24 KUBERNETES_SERVICE_PORT=6443 nohup ./dashboard-api --insecure-bind-address 0.0.0.0 --insecure-port 8004 --kubeconfig ~/.kube/config > api.log 2>&1 &
启动auth服务(认证):
KUBERNETES_SERVICE_HOST=10.230.214.24 KUBERNETES_SERVICE_PORT=6443 nohup ./dashboard-auth --port 8003 --kubeconfig  /root/.kube/config -v2 > auth.log 2>&1 &
启动nginx:

在dashboard中,这几个服务被视为一个服务,是无法指定其他服务的端口的,为了让他们连互相能访问到,需要起一个nginx进行代理。

nginx.conf 配置如下,里面的 token 是为了方便临时性放在这里的,需要提前在kubernetes中生成:

worker_processes 1;
events {
        worker_connections 1024;
}
http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;

        server {
                listen 8002;
                server_name 10.230.214.24;

                proxy_set_header Host $host;
                proxy_set_header Origin        $host:$server_port;
                proxy_set_header Referer       $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Csrf-Token $http_x_csrf_token;
                proxy_set_header Authorization "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6IkZncUVmR2NTc3FPa0lkbWVac0lYU3FBbFZ1TWhGVno3U0Q5TDN0VHRzM2MifQ.eyJhdWQiOlsiYXBpIl0sImV4cCI6MTc2MzYzNzMwMCwiaWF0IjoxNzYzNjMzNzAwLCJpc3MiOiJhcGkiLCJqdGkiOiJhMDc2Njc2My1mODk0LTQ2ODUtODdkZC1kZWFlZDBiOTE2ZGEiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6Imt1YmVybmV0ZXMtZGFzaGJvYXJkIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFkbWluIiwidWlkIjoiM2UzYzJkOGEtYmJkYS00YmU2LWFjYzQtNThlMWEzMTEyYjM1In19LCJuYmYiOjE3NjM2MzM3MDAsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbiJ9.miWTZODUfsQZnA6ERLuz26-5t6UXPD4kf1YEcZHb3MPG1pVmj7f02sellDAJrHSMQ5sN9TD_hCrYP3JQI-oqpI-Z3MZ1jAcRkNLIN9X-txPweZA0yg0wKtAWPskDCkTMzr_iZNuBusjZFQKzd_BaWyxxXeH9CMuFd_Vi7q-n0L1pQNJjxPVqrsV1CEWE1el9h6rGklanUlXwsh5yXlBcWQfOVX92JEPQMo7d-o44N9PD72_QjfdCd4o7-WXpdnA31SiraywkwwcaefdvJjG_HFxetste4tLYIP1VZZNfJfCXu4MVnyCDJmHa-2ulsQv_kIDY1Bkl1DQ4CU9ZiJsV8A";

                # 代理 /api/v1/login,me,csrftoken 请求到 8003 端口(auth 服务)
                location /api/v1/me {
                        proxy_pass http://127.0.0.1:8003;
                }
                location /api/v1/csrftoken{
                        proxy_pass http://127.0.0.1:8003;
                }
                location /api/v1/login {
                        proxy_pass http://127.0.0.1:8003;
                }

                # 代理剩余 /api 请求到 8004 端口(api 服务)
                location /api/ {
                        proxy_pass http://127.0.0.1:8004;
                }

                # 代理其他请求到 8001 端口(Web 服务)
                location / {
                        proxy_pass http://127.0.0.1:8001;

                        location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
                                proxy_pass http://127.0.0.1:8001;
                                expires 1y;
                                add_header Cache-Control "public, immutable";
                        }
                }
        }
}

5.3 登录使用 dashboard

生成一个 token 用于登录,注意 dashboard 默认使用 kubernetes-dashboard 这个命令空间,所以需要提前创建。

[root@openeuler-riscv64 hyj]# kubectl create serviceaccount admin -n kubernetes-dashboard
serviceaccount/hyj created
[root@openeuler-riscv64 hyj]# kubectl -n kubernetes-dashboard create token admin
eyJhbGciOiJSUzI1NiIsImtpZCI6IkZncUVmR2NTc3FPa0lkbWVac0lYU3FBbFZ1TWhGVno3U0Q5TDN0VHRzM2MifQ.eyJhdWQiOlsiYXBpIl0sImV4cCI6MTc2MzYzNzMwMCwiaWF0IjoxNzYzNjMzNzAwLCJpc3MiOiJhcGkiLCJqdGkiOiJhMDc2Njc2My1mODk0LTQ2ODUtODdkZC1kZWFlZDBiOTE2ZGEiLCJrdWJlcm5ldGVzLmlvIjp7Im5hbWVzcGFjZSI6Imt1YmVybmV0ZXMtZGFzaGJvYXJkIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6ImFkbWluIiwidWlkIjoiM2UzYzJkOGEtYmJkYS00YmU2LWFjYzQtNThlMWEzMTEyYjM1In19LCJuYmYiOjE3NjM2MzM3MDAsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbiJ9.miWTZODUfsQZnA6ERLuz26-5t6UXPD4kf1YEcZHb3MPG1pVmj7f02sellDAJrHSMQ5sN9TD_hCrYP3JQI-oqpI-Z3MZ1jAcRkNLIN9X-txPweZA0yg0wKtAWPskDCkTMzr_iZNuBusjZFQKzd_BaWyxxXeH9CMuFd_Vi7q-n0L1pQNJjxPVqrsV1CEWE1el9h6rGklanUlXwsh5yXlBcWQfOVX92JEPQMo7d-o44N9PD72_QjfdCd4o7-WXpdnA31SiraywkwwcaefdvJjG_HFxetste4tLYIP1VZZNfJfCXu4MVnyCDJmHa-2ulsQv_kIDY1Bkl1DQ4CU9ZiJsV8A
访问网页:

图片描述

把生成的token输入,登录进去,可以看到kubernetes集群中自己创建的各种namespace,node信息,cluster信息等等。 namespace:

图片描述

nodes:

图片描述

pods: 可以看到正在运行的pods:

图片描述