一次kubesphere ingress故障的解决

本文记录了在Kubesphere 3.2.1环境下,遇到ingress控制器由于镜像版本不兼容及权限问题导致无法正常工作的问题。解决方案包括升级ingresscontroller镜像至v1.1.0以解决版本兼容性,以及创建并绑定ClusterRole来赋予ingress控制器更新configmap的权限,从而修复ingress不能获取address的错误。

一次kubesphere ingress故障的解决

前言

采用单 master 方式安装 Kubesphere 3.2.1 以后, 启动了集群 gateway, 但是 ingress 总是不能正常工作,排查了很久,终于解决问题

问题1: ingress controller 镜像版本过低,启动失败。

  • kubesphere 3.2.1 默认的 ingress controllerkubesphere/nginx-ingress-controller:v0.48.1。我在安装 kubesphere 时,选择安装的 kubernetes 1.23.0, 因此存在兼容性问题。需要修改默认的 nginx ingress controller 版本,查看 docekrhubkubesphere 的最新 nginx ingress controller 版本是 v1.1.0

  • 通过 修改 configmap ks-router-config 中的 nginx ingress controllerimage 版本号为 v1.1.0,再重启 kubersphere controller,可以解决该问题。

  • 这个地方我走了很多弯路,发现 ks-config 的配置需要在重启 kubesphere controller 才会生效。

  • kubesphere 采用 helm 方式安装额 nginx ingress controller, 但是该 helm 是包含在 kubesphere controller 镜像中,我尝试修改 helm 包的 values.yaml,替换新的镜像文件,实际上也不能生效,

问题2:ingress 不能正确获取到 address

  • 查看 nginx ingress controllerpod 日志,发现是无法完成 ingress controller 选举,提示没有权限更新 ingress-controller-leader-kubesphere-router-kubesphere-system
  • 通过增加 可以 updateconfigmapclusterrole, 绑定到 sa kubesphere-router-kubesphere-system, 问题解决。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: ingress-controller-configmap-update
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["ingress-controller-leader-kubesphere-router-kubesphere-system"]
  verbs: ["update"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubesphere-router-ku
<think>我们正在讨论的是KubeSphere中部署应用或服务的指南。根据用户提供的引用,KubeSphere是一个基于Kubernetes的容器平台,它提供了丰富的应用管理功能。用户要求了解部署应用或服务的流程和操作步骤。 结合引用内容,我们可以总结出在KubeSphere中部署应用的一般步骤: 1. 环境准备:确保已部署好Kubernetes集群和KubeSphere平台(如引用[1][2][3]所述)。 2. 登录KubeSphere控制台。 3. 创建项目(命名空间)或选择已有项目。 4. 部署应用:可以通过多种方式,例如: - 从应用商店部署(如果有预置的应用模板) - 通过工作负载(例如部署Deployment、StatefulSet等) - 通过应用模板(如Helm Chart) - 通过DevOps流水线(如引用[4]中提到的GitLab集成) 由于用户没有提供具体的应用类型,我们将给出一个通用的部署流程,以部署一个Nginx服务为例。 操作步骤: 1. 登录KubeSphere控制台。 2. 选择或创建一个项目(例如,创建一个名为“demo”的项目)。 3. 进入该项目,在左侧菜单选择“应用负载”->“工作负载”。 4. 在“部署”选项卡中,点击“创建”按钮。 5. 选择“创建自制应用”(即通过表单方式创建),也可以选择“从模板创建”(使用YAML文件或Helm Chart)。 6. 填写应用的基本信息: 名称:nginx-deployment 别名:可自定义 描述:可自定义 7. 点击“下一步”,进入“容器组设置”: 点击“添加容器”,输入容器名称(如nginx),容器镜像(nginx:latest),然后设置资源限制(如CPU和内存)。 端口设置:添加容器端口80(HTTP)。 8. 点击“下一步”,进入“存储卷设置”,如果不需要可以跳过。 9. 点击“下一步”,进入“高级设置”,可以配置节点调度策略、健康检查等,如果没有特殊需求,可以保持默认。 10. 点击“创建”,完成部署。 创建服务(Service)以暴露应用: 1. 在同一个项目下,选择“应用负载”->“服务”。 2. 点击“创建”。 3. 选择“通过工作负载指定”(推荐),然后选择我们刚刚创建的部署(nginx-deployment)。 4. 设置服务名称(如nginx-service),端口设置:将容器端口80映射到服务端口80(协议TCP)。 5. 访问类型可以选择: - 集群内访问(ClusterIP):仅集群内部访问。 - 节点访问(NodePort):通过节点IP和端口访问。 - 负载均衡(LoadBalancer):如果集群支持,可以创建外部负载均衡器。 6. 点击“确定”创建服务。 这样,我们就可以通过服务访问到Nginx应用了。 另外,如果用户希望使用应用商店中的应用,可以: 1. 在项目中选择“应用”->“应用商店”。 2. 搜索或选择要部署的应用(如MySQL、Redis等)。 3. 点击“部署”,根据向导填写配置参数,然后部署。 如果用户有现成的YAML文件,也可以通过“创建工作负载”时选择“编辑YAML”来直接部署。 注意:在部署过程中,可能需要根据应用需求配置存储卷、配置字典、环境变量等。 根据引用[4],KubeSphere还支持DevOps项目,可以通过集成GitLab和Jenkins来实现CI/CD流水线部署应用。但那是更高级的部署方式,需要先配置好DevOps环境。 因此,我们给出一个通用的部署流程指南,具体如下: ### KubeSphere 部署应用指南 #### 一、部署流程概览 ```mermaid graph LR A[准备KubeSphere环境] --> B[登录控制台] B --> C[选择/创建项目] C --> D[部署应用] D --> E[创建服务] E --> F[访问应用] ``` #### 二、详细操作步骤 1. **环境准备** - 确保已安装Kubernetes集群和KubeSphere平台(参考引用[1][2][3]的部署指南)[^1][^2][^3] - 确保当前用户具有项目操作权限 2. **登录控制台** - 通过浏览器访问KubeSphere控制台URL - 使用管理员或项目成员账号登录 3. **创建项目(命名空间)** ```bash # 可选:通过kubectl创建项目(也可在控制台创建) kubectl create namespace demo ``` - 控制台操作:平台管理 -> 工作空间 -> 选择工作空间 -> 项目 -> 创建 - 输入项目名称(如`demo`),设置别名和描述 4. **部署应用(以Nginx为例)** - 进入目标项目(如`demo`) - 导航路径:**应用负载** → **工作负载** → **部署** → **创建** - 表单配置示例: | 配置项 | 值 | |--------------|------------------| | 应用名称 | nginx-deployment | | 容器镜像 | nginx:latest | | 容器端口 | 80(TCP) | | 资源限制 | 1核CPU, 1Gi内存 | - 点击**下一步**完成其他配置(健康检查、环境变量等) - 点击**创建**完成部署 5. **创建服务(Service)** - 导航路径:**应用负载** → **服务** → **创建** - 选择**通过工作负载指定**,关联`nginx-deployment` - 配置服务端口: | 类型 | 端口协议 | 容器端口 | 服务端口 | |------------|----------|----------|----------| | NodePort | TCP | 80 | 80 | - 点击**创建**,系统自动生成节点端口(如`30080`) 6. **访问应用** - 通过`<节点IP>:30080`访问Nginx欢迎页 - 或配置Ingress规则实现域名访问(需安装Ingress Controller) #### 三、高级部署方式 | **部署方式** | **操作路径** | **适用场景** | |---------------------|----------------------------------|--------------------------| | 应用商店模板 | 应用商店 → 选择应用 → 部署 | 快速部署中间件(如MySQL) | | YAML文件导入 | 创建工作负载 → 编辑YAML | 复杂应用声明式部署 | | Helm Chart部署 | 应用模板 → 创建 → 上传Chart | 支持Helm包的应用 | | DevOps流水线 | DevOps项目 → 创建流水线 | CI/CD自动化部署[^4] | > **注意**: > - 有状态应用需使用**StatefulSet**并配置持久化存储[^2] > - 微服务架构建议使用**服务网格(Service Mesh)**功能 #### 四、验证部署 ```bash # 在集群节点执行 curl http://<节点IP>:30080 # 预期输出:Nginx欢迎页HTML ``` #### 五、运维管理 - **监控**:通过“监控告警”查看应用资源使用率 - **日志**:在“日志查询”中实时查看容器日志 - **伸缩**:在部署详情页点击“伸缩”调整副本数 --- ### 常见问题解决 1. **Pod启动失败** - 检查容器镜像地址是否正确 - 查看事件日志:`kubectl describe pod <pod-name> -n <namespace>` 2. **服务无法访问** - 确认NodePort是否被防火墙拦截 - 检查服务Selector是否匹配Pod标签 3. **持久化存储故障** - 确认StorageClass配置正确(参考引用[2])[^2] --- ### 总结 通过KubeSphere控制台部署应用的核心步骤:**创建项目→部署工作负载→暴露服务→访问验证**。结合应用商店、Helm和DevOps可实现更高效的持续交付。 §§相关问题§§ 1. 如何为KubeSphere中的应用配置HTTPS访问? 2. 如何在KubeSphere中实现应用的水平自动伸缩(HPA)? 3. 如何使用KubeSphere的DevOps功能部署Spring Boot应用?[^4] 4. KubeSphere中如何管理有状态应用(如MySQL集群)? 5. 如何通过KubeSphere的应用商店一键部署Redis? [^1]: GKE部署KubeSphere [^2]: KubeSphere存储配置 [^3]: openEuler部署集群 [^4]: KubeSphere DevOps集成</think>### KubeSphere 应用部署指南 以下是基于 KubeSphere 平台部署应用的核心流程和操作步骤,结合 Kubernetes 原生能力和 KubeSphere 增强功能实现高效部署: --- #### 一、部署流程概览 ```mermaid graph TD A[准备阶段] --> B[创建项目] B --> C[部署工作负载] C --> D[配置网络访问] D --> E[挂载存储卷] E --> F[监控与运维] ``` --- #### 二、详细操作步骤 1. **准备阶段** - 确保 KubeSphere 集群正常运行(参考引用[1][2][3]的部署指南)[^1][^2][^3] - 登录 KubeSphere 控制台(默认地址 `http://<节点IP>:30880`) 2. **创建项目** - 进入 **工作空间** → **创建项目**(命名空间) - 设置项目名称(如 `demo-app`)和资源配额 ```bash # 命令行创建示例(可选) kubectl create ns demo-app ``` 3. **部署工作负载**(4种方式) **方式1:通过镜像部署**(推荐) - 导航:**应用负载** → **工作负载** → **创建** - 选择 **部署(Deployment)** - 关键配置: - 容器镜像:`nginx:latest`(或自定义镜像) - 端口:容器端口 `80`(TCP) - 资源限制:CPU=0.5核,内存=512Mi **方式2:应用商店部署** - 进入 **应用商店** → 选择应用(如 MySQL)→ **部署** - 修改 Helm Chart 参数(存储卷、密码等)[^2] **方式3:YAML文件部署** - 在 **创建** 页面切换至 **编辑 YAML** 模式 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.25 ports: - containerPort: 80 ``` **方式4:DevOps流水线部署**(参考引用[4])[^4] - 配置 GitLab 仓库 → 创建 Jenkinsfile → 自动构建镜像并部署 4. **配置网络访问** - **创建服务(Service)**: - 类型选择 `NodePort` 或 `LoadBalancer` - 端口映射:容器端口 `80` → 服务端口 `80` - **配置路由(Ingress)**: - 域名:`app.example.com` - 路径:`/` 指向 `nginx` 服务 5. **挂载存储卷** - 前置条件:配置 StorageClass(参考引用[2])[^2] - 在工作负载中: - 添加持久卷声明(PVC) - 挂载路径:`/usr/share/nginx/html` ```yaml volumes: - name: data-vol persistentVolumeClaim: claimName: nginx-pvc ``` 6. **监控与运维** - 实时查看:**应用监控** → 资源使用率/日志/事件 - 弹性伸缩: - 手动:调整副本数 - 自动:配置 HPA(CPU > 70% 时扩容) - 版本更新: - 蓝绿部署:通过 **应用路由** 切换流量 - 滚动更新:修改镜像标签自动触发 --- #### 三、部署架构示例(Nginx + MySQL) ```mermaid graph LR A[用户] --> B(Ingress: app.example.com) B --> C[Service: nginx-svc] C --> D[Deployment: nginx] D --> E[PersistentVolume: html-data] B --> F[Service: mysql-svc] F --> G[StatefulSet: mysql] G --> H[PersistentVolume: mysql-data] ``` --- #### 四、故障排查指南 | **问题现象** | **检查步骤** | |----------------------|---------------------------------------| | Pod 处于 Pending 状态 | 检查资源配额/节点污点/StorageClass[^2] | | 服务无法访问 | 验证 Service 端口映射/Ingress 配置 | | 存储卷挂载失败 | 确认 PVC 状态/PV 回收策略 | | 镜像拉取失败 | 检查镜像仓库密钥/网络策略 | > **关键命令**: > ```bash > kubectl get pods -n demo-app # 查看Pod状态 > kubectl describe pod <pod-name> # 检查事件日志 > kubectl logs <pod-name> -c <container-name> # 查看容器日志 > ``` --- ### 总结 KubeSphere 通过可视化控制台简化了 Kubernetes 应用部署: 1. **核心流程**:项目创建 → 工作负载部署 → 网络配置 → 存储管理 2. **核心优势**: - 集成 DevOps 流水线(GitLab + Jenkins)[^4] - 应用商店一键部署中间件[^2] - 多维度监控告警体系 3. **适用场景**: - 微服务应用(Spring Cloud/Dubbo) - 有状态服务(MySQL/Redis集群) - CI/CD 流水线(自动构建测试)[^4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值