|
| 1 | +--- |
| 2 | +kind: |
| 3 | + - Solution |
| 4 | +products: |
| 5 | + - Alauda Application Services |
| 6 | +ProductsVersion: |
| 7 | + - 4.x |
| 8 | +id: KB260100023 |
| 9 | +sourceSHA: 986b9b0d5648d8648b27487418da8454b121df6b232f4ad72ca51ad0e34d344b |
| 10 | +--- |
| 11 | + |
| 12 | +# 如何部署和使用 Konveyor |
| 13 | + |
| 14 | +## 概述 |
| 15 | + |
| 16 | +Konveyor 是一个 CNCF(云原生计算基金会)项目,提供了一个模块化的平台用于应用现代化。它支持现代化的整个生命周期:发现、评估、分析和执行。本指南涵盖了部署 Konveyor Hub(Tackle)平台及其核心组件。 |
| 17 | + |
| 18 | +## 先决条件 |
| 19 | + |
| 20 | +- 具有 kubectl 访问权限的 Kubernetes 集群 |
| 21 | +- 支持 ReadWriteMany (RWX) 访问模式的 StorageClass |
| 22 | +- 用于 RWO 卷(数据库)的 StorageClass |
| 23 | +- (可选)用于外部访问的 LoadBalancer 或 Ingress Controller |
| 24 | + |
| 25 | +## 安装 Konveyor Operator |
| 26 | + |
| 27 | +从 [Alauda Cloud Console](https://cloud.alauda.io/) Marketplace 下载 Konveyor Operator 插件,并按照 [上架软件包](https://docs.alauda.io/container_platform/4.2/extend/upload_package.html) 指南将插件上传到集群。 |
| 28 | + |
| 29 | +## 部署 Konveyor Hub (Tackle) |
| 30 | + |
| 31 | +### 创建 Tackle 实例 |
| 32 | + |
| 33 | +通过创建 Tackle CR 部署 Tackle 平台。Tackle 实例必须在与 konveyor-operator 相同的命名空间中部署。 |
| 34 | + |
| 35 | +```yaml |
| 36 | +cat << EOF | kubectl create -f - |
| 37 | +apiVersion: tackle.konveyor.io/v1alpha1 |
| 38 | +kind: Tackle |
| 39 | +metadata: |
| 40 | + name: tackle |
| 41 | + namespace: konveyor-tackle |
| 42 | +spec: |
| 43 | + feature_auth_required: true |
| 44 | + feature_isolate_namespace: true |
| 45 | + feature_analysis_archiver: true |
| 46 | + hub_database_volume_size: 5Gi |
| 47 | + hub_bucket_volume_size: 100Gi |
| 48 | + rwx_supported: true |
| 49 | + hub_bucket_storage_class: nfs # 替换为您的 RWX StorageClass |
| 50 | + rwo_storage_class: sc-topolvm # 替换为您的 RWO StorageClass |
| 51 | + cache_storage_class: nfs |
| 52 | + cache_data_volume_size: 100Gi |
| 53 | +EOF |
| 54 | +``` |
| 55 | + |
| 56 | +### 验证部署 |
| 57 | + |
| 58 | +检查 `konveyor-tackle` 命名空间中的 pod 状态: |
| 59 | + |
| 60 | +```bash |
| 61 | +kubectl get pods -n konveyor-tackle |
| 62 | +``` |
| 63 | + |
| 64 | +确保所有 pod 都处于 `Running` 或 `Completed` 状态,然后再继续。 |
| 65 | + |
| 66 | +> \[!WARNING] |
| 67 | +> Tackle 实例必须在与 `konveyor-operator` 相同的命名空间中部署。如果您在不同的命名空间中部署,操作员创建的一些资源(如 PersistentVolumeClaims、ConfigMaps、Secrets 和 ServiceAccounts)在删除 Tackle 自定义资源时可能不会自动删除。在这种情况下,您必须手动清理受影响命名空间中的这些资源,例如: |
| 68 | +> |
| 69 | +> ```bash |
| 70 | +> # 删除标记为 Tackle 实例的公共资源 |
| 71 | +> kubectl delete pvc,configmap,secret,sa -l app.kubernetes.io/instance=tackle -n konveyor-tackle |
| 72 | +> ``` |
| 73 | +
|
| 74 | +### 配置选项 |
| 75 | +
|
| 76 | +| 名称 | 默认值 | 描述 | |
| 77 | +| ----------------------------------------- | ------- | ------------------------------------------------------------- | |
| 78 | +| `spec.feature_auth_required` | `true` | 启用 Keycloak 身份验证(设置为 `false` 以实现单用户/无身份验证) | |
| 79 | +| `spec.feature_isolate_namespace` | `true` | 通过网络策略启用命名空间隔离 | |
| 80 | +| `spec.feature_analysis_archiver` | `true` | 在创建新分析报告时自动归档旧的分析报告 | |
| 81 | +| `spec.rwx_supported` | `true` | 集群是否支持 RWX 卷 | |
| 82 | +| `spec.hub_database_volume_size` | `5Gi` | 请求的 Hub 数据库卷大小 | |
| 83 | +| `spec.hub_bucket_volume_size` | `100Gi` | 请求的 Hub 存储桶卷大小 | |
| 84 | +| `spec.keycloak_database_data_volume_size` | `1Gi` | 请求的 Keycloak 数据库卷大小 | |
| 85 | +| `spec.cache_data_volume_size` | `100Gi` | 请求的 Tackle 缓存卷大小 | |
| 86 | +| `spec.cache_storage_class` | N/A | 请求的 Tackle 缓存卷的 StorageClass | |
| 87 | +| `spec.hub_bucket_storage_class` | N/A | 请求的 Tackle Hub 存储桶卷的 StorageClass(RWX) | |
| 88 | +| `spec.rwo_storage_class` | N/A | 请求的 RWO 数据库卷的 StorageClass | |
| 89 | +
|
| 90 | +## 访问 Tackle UI |
| 91 | +
|
| 92 | +### 通过端口转发快速访问 |
| 93 | +
|
| 94 | +1. 设置端口转发: |
| 95 | +
|
| 96 | + ```bash |
| 97 | + kubectl -n konveyor-tackle port-forward service/tackle-ui 8080:8080 |
| 98 | + ``` |
| 99 | +
|
| 100 | +2. 在浏览器中打开 <http://127.0.0.1:8080>。 |
| 101 | + |
| 102 | +### 初始化管理员账户 |
| 103 | + |
| 104 | +内置的 Keycloak 在启动时生成一个随机密码。这是 Keycloak 的根密码,存储在 `tackle-keycloak-sso` secret 中。 |
| 105 | + |
| 106 | +1. 检索 Keycloak 管理员凭据: |
| 107 | + |
| 108 | + ```bash |
| 109 | + # 获取用户名(默认:admin) |
| 110 | + kubectl -n konveyor-tackle get secret tackle-keycloak-sso -o jsonpath='{.data.username}' | base64 -d |
| 111 | + |
| 112 | + # 获取密码 |
| 113 | + kubectl -n konveyor-tackle get secret tackle-keycloak-sso -o jsonpath='{.data.password}' | base64 -d |
| 114 | + ``` |
| 115 | + |
| 116 | +2. 登录到 Keycloak 管理控制台 <http://127.0.0.1:8080/auth/admin/> |
| 117 | + |
| 118 | +3. 重置 Tackle 管理员密码: |
| 119 | + - 从下拉菜单中选择 **tackle** Realm(而不是 Master Realm) |
| 120 | + - 在左侧菜单中点击 **Users** |
| 121 | + - 找到并选择 **admin** 用户 |
| 122 | + - 点击 **Credentials** 标签 |
| 123 | + - 输入新密码(例如,`admin@123`) |
| 124 | + - 禁用 **Temporary** 切换 |
| 125 | + - 点击 **Reset Password** |
| 126 | + |
| 127 | +4. 使用管理员用户和新密码登录 Tackle,地址为 <http://127.0.0.1:8080>。 |
| 128 | + |
| 129 | +### 通过 Ingress 安全访问(生产环境) |
| 130 | + |
| 131 | +端口转发仅用于临时访问。对于生产环境,请配置带有 TLS 的 Ingress。 |
| 132 | + |
| 133 | +#### Ingress 先决条件 |
| 134 | + |
| 135 | +- 一个域名(例如,`tackle.example.com`) |
| 136 | +- 部署的 LoadBalancer 服务(请参见 [ALB 部署指南](https://docs.alauda.io/container_platform/4.1/configure/networking/how_to/alb/deploy_alb.html)) |
| 137 | +- 安装 cert-manager |
| 138 | + |
| 139 | +#### 创建 TLS 证书 |
| 140 | + |
| 141 | +```yaml |
| 142 | +apiVersion: cert-manager.io/v1 |
| 143 | +kind: Certificate |
| 144 | +metadata: |
| 145 | + name: tackle-ssl-cert |
| 146 | + namespace: konveyor-tackle |
| 147 | +spec: |
| 148 | + commonName: tackle.example.com |
| 149 | + dnsNames: |
| 150 | + - tackle.example.com |
| 151 | + issuerRef: |
| 152 | + kind: ClusterIssuer |
| 153 | + name: cpaas-ca # 替换为您的 Issuer |
| 154 | + secretName: tackle-tls-secret |
| 155 | + usages: |
| 156 | + - server auth |
| 157 | + - client auth |
| 158 | +``` |
| 159 | +
|
| 160 | +#### 创建 Ingress |
| 161 | +
|
| 162 | +```yaml |
| 163 | +apiVersion: networking.k8s.io/v1 |
| 164 | +kind: Ingress |
| 165 | +metadata: |
| 166 | + annotations: |
| 167 | + nginx.ingress.kubernetes.io/backend-protocol: HTTP |
| 168 | + nginx.ingress.kubernetes.io/ssl-redirect: "true" |
| 169 | + name: tackle-ui-tls-ingress |
| 170 | + namespace: konveyor-tackle |
| 171 | +spec: |
| 172 | + ingressClassName: nginx # 替换为您的 Ingress Class |
| 173 | + rules: |
| 174 | + - host: tackle.example.com |
| 175 | + http: |
| 176 | + paths: |
| 177 | + - backend: |
| 178 | + service: |
| 179 | + name: tackle-ui |
| 180 | + port: |
| 181 | + number: 8080 |
| 182 | + path: / |
| 183 | + pathType: Prefix |
| 184 | + tls: |
| 185 | + - hosts: |
| 186 | + - tackle.example.com |
| 187 | + secretName: tackle-tls-secret |
| 188 | +``` |
| 189 | +
|
| 190 | +> \[!NOTE] |
| 191 | +> 将 `tackle.example.com` 替换为您的实际域名。 |
| 192 | + |
| 193 | +通过 `https://tackle.example.com` 访问 Tackle。 |
| 194 | + |
| 195 | +## 启用 KAI(Konveyor AI) |
| 196 | + |
| 197 | +KAI 使用 AI 服务提供 AI 驱动的代码迁移辅助。它支持多个提供商和模型。 |
| 198 | + |
| 199 | +### 支持的提供商和模型 |
| 200 | + |
| 201 | +| 提供商 (`kai_llm_provider`) | 模型 (`kai_llm_model`) | |
| 202 | +| --------------------------- | ------------------------------------------------------------------------------ | |
| 203 | +| `openai` | `gpt-4`、`gpt-4o`、`gpt-4o-mini`、`gpt-3.5-turbo` | |
| 204 | +| `azure_openai` | `gpt-4`、`gpt-35-turbo` | |
| 205 | +| `bedrock` | `anthropic.claude-3-5-sonnet-20241022-v2:0`、`meta.llama3-1-70b-instruct-v1:0` | |
| 206 | +| `google` | `gemini-2.0-flash-exp`、`gemini-1.5-pro` | |
| 207 | +| `ollama` | `llama3.1`、`codellama`、`mistral` | |
| 208 | +| `groq` | `llama-3.1-70b-versatile`、`mixtral-8x7b-32768` | |
| 209 | +| `anthropic` | `claude-3-5-sonnet-20241022`、`claude-3-haiku-20240307` | |
| 210 | + |
| 211 | +### 在 Tackle 中启用 KAI |
| 212 | + |
| 213 | +1. 更新 Tackle 配置: |
| 214 | + |
| 215 | + ```yaml |
| 216 | + apiVersion: tackle.konveyor.io/v1alpha1 |
| 217 | + kind: Tackle |
| 218 | + metadata: |
| 219 | + name: tackle |
| 220 | + namespace: konveyor-tackle |
| 221 | + spec: |
| 222 | + kai_solution_server_enabled: true |
| 223 | + kai_llm_provider: openai # 选择您的提供商 |
| 224 | + kai_llm_model: gpt-4o-mini # 选择您的模型 |
| 225 | + ``` |
| 226 | + |
| 227 | +2. 创建 API 凭据 secret: |
| 228 | + |
| 229 | + **对于 OpenAI:** |
| 230 | + |
| 231 | + ```bash |
| 232 | + kubectl create secret generic kai-api-keys -n konveyor-tackle \ |
| 233 | + --from-literal=OPENAI_API_BASE='https://api.openai.com/v1' \ |
| 234 | + --from-literal=OPENAI_API_KEY='<YOUR_OPENAI_KEY>' |
| 235 | + ``` |
| 236 | + |
| 237 | + **对于 Google:** |
| 238 | + |
| 239 | + ```bash |
| 240 | + kubectl create secret generic kai-api-keys -n konveyor-tackle \ |
| 241 | + --from-literal=GOOGLE_API_KEY='<YOUR_GOOGLE_API_KEY>' |
| 242 | + ``` |
| 243 | + |
| 244 | +3. 强制操作员进行调和并获取新凭据: |
| 245 | + |
| 246 | + ```bash |
| 247 | + kubectl patch tackle tackle -n konveyor-tackle --type=merge -p \ |
| 248 | + '{"metadata":{"annotations":{"konveyor.io/force-reconcile":"'"$(date +%s)"'"}}}' |
| 249 | + ``` |
| 250 | + |
| 251 | +## Konveyor 组件概述 |
| 252 | + |
| 253 | +Konveyor 提供了一个模块化架构用于应用现代化: |
| 254 | + |
| 255 | +| 组件 | 描述 | |
| 256 | +| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | |
| 257 | +| **Konveyor Hub** | 提供统一应用清单、评估模块(风险评估)和分析模块(静态代码分析)的中央控制平面。实现了带有管理员、架构师和迁移者角色的 RBAC。 | |
| 258 | +| **Kantra & Analyzer-LSP** | CLI 工具用于离线静态分析。Analyzer-LSP 通过语言服务器协议集成到 IDE(VSCode)中,以实时检测迁移问题。 | |
| 259 | +| **Konveyor AI (KAI)** | 基于 RAG 的 AI 助手,用于自动化代码修复。使用已解决事件存储进行上下文感知的代码补丁生成。 | |
| 260 | +| **Move2Kube** | 自动化从 Cloud Foundry/OpenShift 转换到 Kubernetes。三个阶段:收集、计划、转换。生成 Dockerfile、K8s 清单、Helm Charts 和 Tekton Pipelines。 | |
| 261 | +| **Forklift** | 用于将虚拟机从 VMware vSphere、oVirt 或 OpenStack 迁移到 KubeVirt 的虚拟机迁移工具。 | |
| 262 | +| **Crane** | 用于集群升级或跨分发迁移的 Kubernetes 到 Kubernetes 迁移工具。使用 Restic 或 VolSync 处理 PV 数据同步。 | |
| 263 | + |
| 264 | +## 参考 |
| 265 | + |
| 266 | +- [Konveyor 官方文档](https://konveyor.io/docs/konveyor/) |
| 267 | +- [Konveyor 管理任务](https://konveyor.io/docs/konveyor/admintasks/) |
| 268 | +- [Konveyor Operator 仓库](https://github.com/konveyor/operator) |
0 commit comments