2、环境准备:Kubernetes 集群要求、Kubeflow 1.7 版本安装(kfctl 方式)、Dashboard 访问与 HTTPS 配置

说实话,很多同学学 Kubeflow 卡住,不是卡在概念上,而是卡在环境搭建上。我见过太多人花了两三天装环境,最后连 Dashboard 都打不开。所以这一章,咱们把准备工作做扎实。

我个人习惯是,先把集群要求搞清楚,再动手装。别一上来就敲命令,那样容易翻车。

2.1 Kubernetes 集群要求

Kubeflow 1.7 对集群是有硬性要求的。说白了,你的集群得够「壮实」。

资源项 最低要求 推荐配置
节点数 1 个 master + 2 个 worker 1 个 master + 3 个 worker
CPU 总核数 8 核 16 核以上
内存总量 16 GB 32 GB 以上
磁盘空间 100 GB(SSD 优先) 200 GB 以上
Kubernetes 版本 1.21 - 1.24 1.23 或 1.24
⚠️ 注意:Kubeflow 1.7 不支持 Kubernetes 1.25 及以上版本。我去年有个项目,团队图省事用了 1.26 的集群,结果装完 Istio 直接报错,折腾了两天才发现是版本不兼容。所以,老老实实用 1.23 或 1.24 吧。

另外,集群必须启用 RBACNodePortLoadBalancer 类型的 Service。嗯,这里要注意,如果你的集群跑在云上,建议用 LoadBalancer,省心很多。

2.2 Kubeflow 1.7 安装(kfctl 方式)

kfctl 是官方推荐的安装工具。虽然现在有更新的方式,但 1.7 版本用 kfctl 最稳。我建议你直接下载二进制文件,别用源码编译,太慢了。

2.2.1 下载 kfctl

# 下载 kfctl v1.7.0
wget https://github.com/kubeflow/kfctl/releases/download/v1.7.0/kfctl_v1.7.0_linux.tar.gz

# 解压
tar -xvf kfctl_v1.7.0_linux.tar.gz

# 移动到 PATH
sudo mv kfctl /usr/local/bin/

下载完成后,验证一下版本:

kfctl version

如果输出 v1.7.0,说明下载成功。我曾经遇到过下载后版本不对的情况,后来发现是网络缓存的问题。建议你每次下载前清一下缓存,或者换个源。

2.2.2 配置安装参数

kfctl 需要一个配置文件。官方提供了默认配置,但咱们得改几个关键参数。

# 创建安装目录
mkdir ~/kubeflow-install
cd ~/kubeflow-install

# 下载默认配置
wget https://raw.githubusercontent.com/kubeflow/manifests/v1.7-branch/kfdef/kfctl_k8s_istio.v1.7.0.yaml

# 重命名为 kfctl.yaml
mv kfctl_k8s_istio.v1.7.0.yaml kfctl.yaml

打开 kfctl.yaml,找到 spec 部分,修改以下内容:

spec:
  repos:
    - name: manifests
      uri: https://github.com/kubeflow/manifests/archive/v1.7-branch.tar.gz
  appDir: /home/your-username/kubeflow-install
💡 小技巧:appDir 改成你自己的绝对路径。我习惯用 /opt/kubeflow,这样方便管理。另外,如果你在境内网络,建议把 uri 换成 gitee 镜像,不然下载 manifests 会慢到怀疑人生。

2.2.3 执行安装

# 设置环境变量
export KF_NAME=kubeflow
export BASE_DIR=/opt/kubeflow
export KF_DIR=${BASE_DIR}/${KF_NAME}

# 开始安装
kfctl apply -V -f kfctl.yaml

这个过程大概需要 10-20 分钟,取决于你的网络和机器性能。你想想看,它要拉取 Istio、Knative、KFServing 等十几个组件,所以耐心等。

安装完成后,检查 Pod 状态:

kubectl get pods -n kubeflow

如果所有 Pod 都是 RunningCompleted,说明安装成功。我遇到过 Istio 的 Pod 一直 CrashLoopBackOff,后来发现是集群资源不够。所以,安装前一定确认资源达标。

2.3 Dashboard 访问与 HTTPS 配置

装好了,怎么访问?默认情况下,Kubeflow Dashboard 通过 Istio Ingress Gateway 暴露。咱们先找到它的地址。

2.3.1 获取访问地址

# 查看 Istio Ingress Gateway 的 Service
kubectl get svc -n istio-system istio-ingressgateway

输出类似这样:

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)
istio-ingressgateway   LoadBalancer   10.96.123.45    192.168.1.100  80:31380/TCP,443:31390/TCP

如果 EXTERNAL-IP 有值,直接用浏览器访问 http://192.168.1.100 就行。如果是 NodePort 类型,就用 http://节点IP:31380

🔑 默认账号密码:
  • 用户名:admin@kubeflow.org
  • 密码:12341234
第一次登录会提示修改密码。我建议你改成强密码,毕竟 Dashboard 暴露在网络上。

2.3.2 配置 HTTPS

说实话,HTTP 访问在开发环境没问题,但生产环境必须上 HTTPS。我曾经有个客户,直接用 HTTP 暴露 Dashboard,结果被安全扫描工具扫出来,差点没通过合规审查。

配置 HTTPS 有两种方式:

  1. 使用自签名证书(适合测试环境)
  2. 使用 Let's Encrypt(适合生产环境)

这里我演示自签名证书的方式,因为最快:

# 生成自签名证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /tmp/tls.key \
    -out /tmp/tls.crt \
    -subj "/CN=kubeflow.example.com"

# 创建 Secret
kubectl create secret tls kubeflow-tls \
    --key /tmp/tls.key \
    --cert /tmp/tls.crt \
    -n istio-system

# 配置 Gateway 使用 HTTPS
kubectl patch gateway kubeflow-gateway -n kubeflow -p '{
  "spec": {
    "servers": [
      {
        "port": {
          "number": 443,
          "name": "https",
          "protocol": "HTTPS"
        },
        "tls": {
          "mode": "SIMPLE",
          "credentialName": "kubeflow-tls"
        },
        "hosts": ["*"]
      }
    ]
  }
}'

配置完成后,用 https://你的IP 访问。浏览器会提示不安全,因为自签名证书不被信任。点「继续访问」就行。

⚠️ 注意:如果你用 Let's Encrypt,需要确保你的域名能解析到 Ingress Gateway 的 IP。而且 Let's Encrypt 证书有效期只有 90 天,记得配置自动续期。我一般用 cert-manager 来自动管理,省心。

2.4 本章知识体系

为了让你更直观地理解本章内容,我画了一张流程图:

环境准备核心流程 1. 集群要求检查 K8s 1.21-1.24, 资源达标 2. 下载 kfctl v1.7.0 二进制文件 3. 配置安装参数 修改 kfctl.yaml 4. 执行安装 kfctl apply -V 5. 验证安装 检查 Pod 状态 6. 配置 HTTPS 自签名或 Let's Encrypt 安装完成后,通过 HTTPS 访问 Dashboard,开始你的 ML 工作流

这张图把整个流程串起来了。你按照这个顺序走,基本不会出大问题。嗯,最后再啰嗦一句:安装过程中如果遇到问题,先看 Pod 日志,别急着重装。我遇到过好多次,其实就是某个镜像拉不下来,换个源就好了。

专注资料整理