☁️ 从 SDK 集成到 CSP 云平台部署

项目背景: 因作为电子云的云管家需要熟悉开发流程,现模拟开发人员,使用平台私有 CSP SDK 开发 Spring Cloud 应用,打包 Docker 镜像,并部署到中国电子云 (CSP) 容器平台,打通 Nacos 注册与外部访问。

一、 环境准备

在开始写代码前,必须统一本地的编译环境,否则会遇到依赖下载慢或版本不兼容问题。

安装 JDK 1.8 & Maven 3.8

  • 安装路径: /usr/local/java 和 /usr/local/maven
  • 环境变量配置: 修改 /etc/profile
# 配置的 /etc/profile 文件内容
root@harbor250:~/my-csp-app# cat /etc/profile
。。。
# ================== JAVA & MAVEN CONFIG ==================
# 设置 JDK 1.8 为主 JAVA_HOME
export JAVA_HOME=/usr/local/java/jdk8
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

# 设置 Maven
export MAVEN_HOME=/usr/local/maven/apache-maven-3.8.8

# 将它们加入系统 PATH (注意 JAVA_HOME 要放在最前面,以覆盖系统自带的 Java 11)
export PATH=${JAVA_HOME}/bin:${MAVEN_HOME}/bin:$PATH
# =========================================================

image-Tdpk.png

2. 配置 Maven 阿里云镜像加速

默认 Maven 中央仓库在国外,下载极慢。必须修改 settings.xml 配置国内镜像。

  • 配置文件路径: /usr/local/maven/.../conf/settings.xml
  • 修改位置: 在 <mirrors> 标签内部添加。
<!-- 阿里云公共仓库加速配置 -->
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

第二部分:私有 SDK 的安装与管理

CSP SDK是私有提供的Jar包集合,无法直接从公共仓库下载,必须手动安装到本地Maven仓库 。

image-TBKF.png

1. SDK 目录结构分析

解压 csp-sdk-v5.zip后,发现它是Maven仓库缓存结构(无源码,无根 pom.xml),因此无法直接mvn install。

image-qisz.png

2. 编写自动化安装脚本

为了批量安装几十个 Jar 包,编写了 auto_install.sh 脚本,自动扫描 .pom 文件并安装。

#!/bin/bash

# 查找当前目录下所有的 .pom 文件
find . -name "*.pom" | while read pomfile; do
    # 推测对应的 jar 文件名 (把 .pom 替换为 .jar)
    jarfile="${pomfile%.pom}.jar"
  
    echo "正在处理: $pomfile"

    if [ -f "$jarfile" ]; then
        # 如果有 jar 包,就安装 jar 和 pom
        mvn install:install-file -Dfile="$jarfile" -DpomFile="$pomfile" -Dmaven.test.skip=true
    else
        # 如果只有 pom (通常是父工程),就只安装 pom
        mvn install:install-file -Dfile="$pomfile" -DpomFile="$pomfile" -Dpackaging=pom -Dmaven.test.skip=true
    fi
done

echo "========================================"
echo "  所有 SDK 组件已安装完成!"
echo "========================================"

3. 执行安装

执行脚本后,观察到 Maven 批量安装日志。

image-xFoC.png

第三部分:Java 应用开发 (Spring Boot + CSP SDK)

1. 创建 Maven 工程

  • 项目名: my-csp-app (或 xiuxiantest)
  • POM 依赖配置: 核心是引入 spring-cloud-starter-cecloud-csp-gov。
root@harbor250:~/my-csp-app# cat pom.xml 
。。。
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
      
        <!-- 引入 CSP 核心依赖 -->
        <!-- 注意:这个 groupId 我是根据目录反推的,通常是 com.cecloud.csp -->
        <dependency>
            <groupId>com.cecloud.csp</groupId>
            <artifactId>spring-cloud-starter-cecloud-csp-gov</artifactId>
            <!-- 这里的版本号必须和 auto_install.sh 里安装进去的版本一致 -->
            <!-- 刚才 ls 看到了 2021.0.1.0.v5.0 -->
            <version>2021.0.1.0.v5.0</version>
        </dependency>
    </dependencies>

。。。

2. 编写业务代码

创建一个简单的 Controller 用于验证服务存活及网络连通性。

root@harbor250:~/my-csp-app/src/main/java/com/example# cat App.java 
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello CSP! Deployment Successful!";
    }
}

3. 应用配置 (bootstrap.yaml)

配置应用名称及 Nacos 注册中心地址(支持环境变量注入)。

root@harbor250:~/my-csp-app/src/main/java/com/example# cat /root//my-csp-app/src/main/resources/bootstrap.yaml
server:
  port: 8080
spring:
  application:
    name: xiuxiantest
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
      config:
        server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}

4. 本地编译

执行 mvn clean package,生成可运行的 Jar 包。

image-sYBh.png

1. 编写 Dockerfile

遇到的坑: Docker Hub 官方源 (docker.io) 在国内无法访问,导致 FROM openjdk:8-jdk-alpine 超时报错。
解决方案: 修改 Dockerfile 使用华为云/阿里云的代理镜像源。

root@harbor250:~/my-csp-app# cat Dockerfile 
# 1. 基础镜像(使用轻量级的 Alpine Linux + JDK 8)
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/openjdk:8-jdk-alpine
 

# 2. 设置维护者信息(可选)
MAINTAINER DevUser

# 3. 设置时区为上海(防止日志时间差8小时)
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone

# 4. 把刚才生成的 Jar 包拷贝进容器,重命名为 app.jar
# 注意:这里的路径 target/... 是相对于 Dockerfile 所在的目录
COPY target/my-csp-app-1.0.0.jar /app.jar

# 5. 暴露 8080 端口
EXPOSE 8080

# 6. 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]

2. 解决镜像仓库网络问题

遇到的坑: docker login 报错 Network is unreachable。
原因: /etc/hosts 配置错误,将仓库域名解析到了 IPv6 多播地址。
解决: 修正 hosts 文件,绑定正确的 IPv4 地址。

root@harbor250:~/my-csp-app# cat /etc/hosts
10.255.113.4 testoor.registry.df-region.dfcecloud.com 

3. 构建与推送

root@harbor250:~/my-csp-app# docker build -t testoor.registry.df-region.dfcecloud.com/library/my-csp-app:v1 .
root@harbor250:~/my-csp-app# docker images 
root@harbor250:~/my-csp-app# docker login --username=zhang testoor.registry.df-region.dfcecloud.com
root@harbor250:~/my-csp-app# docker tag testoor.registry.df-region.dfcecloud.com/library/my-csp-app:v1 testoor.registry.df-region.dfcecloud.com/test/myjava:v1
root@harbor250:~/my-csp-app# docker push testoor.registry.df-region.dfcecloud.com/test/myjava:v1

已经成功推送!

image-aDBj.png

第五部分:云平台应用部署

1、新建应用

CSP-应用发布-新建应用

image-vucw.png

应用创建完成后-新建部署计划

image-ziuv.png

选择名称、集群、、命名空间、镜像仓库跟版本(此处选择刚才构建的镜像)

image-ePTv.png

选择参数、副本数、资源限制

image-bnpK.png

选择访问方式、端口号

image-etaT.png

选择完选择保存并部署

image-lsRE.png

2. 部署结果

等待实例状态变为 “运行中 (Running)”

image-XILa.png

在 Pod 内部(kubectl exec 进去后),尝试使用这个命令:

image-Udke.png

输出Hello CSP! Deployment Successful!,大获全胜!

第六部分:深度故障排查 (Troubleshooting)

这是本次实战中最耗时、也是最有价值的部分。

故障 1:K8s 集群节点震荡 (NotReady)

  • 现象: 节点一会儿 Ready 一会儿 NotReady,报错 PLEG is not healthy。
  • 根本原因: 云平台镜像模板问题,预装的 Kubelet (v1.22)CRI-O (v1.25) 版本严重不兼容,跨越了 3 个次版本,导致 API 调用超时。
  • 解决思路: 必须升级 K8s 组件或重建集群以对齐版本。

故障 2:网页“查看日志”报错 Connection Refused

  • 现象: 实例已运行,但网页点击“日志”报错 dial tcp 10.0.11.6:10250: connection refused。
  • 原因: Worker 节点的 Kubelet 进程挂掉(因版本不兼容)或者 防火墙 (Firewalld) 拦截了 10250 端口。
  • 解决: SSH 登录节点,systemctl restart kubelet 并 systemctl stop firewalld。

故障 3:Pod 无法访问 (Curl Hanging)

  • 现象: 在外部机器 curl 节点的 NodePort 卡住不动。
  • 原因: 云平台 安全组 (Security Group) 默认未放行自定义的 NodePort (如 30088)。
  • 解决: 在云平台 ECS 控制台添加入方向规则,放行 TCP 端口。