项目迁移到OpenShift过程中遇到的问题总结

文章列举了在OpenShift环境中遇到的多个技术问题,包括yaml文件解析错误、未识别的类型问题、OpenShift服务注册到Eureka、Pod关闭时的Deregister请求、当前工作目录默认为根目录、同一war包启动多服务的迁移以及如何下载NAS日志文件。每个问题都提供了详细的解决方案,如使用空格替代tab来修复yaml错误,修改Eureka客户端代码以适应OpenShift的域名和端口,利用Pod的生命周期事件实现Eureka的Deregister操作等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. yaml 文件 ---Error: found character that cannot start any token

2. unrecongnized type:int32

3. 注册OpenShift里的Service到Eureka Dashboard里

4. 当关闭pod时,Eureka client 不会出发Deregister请求,

5. Current working dir默认的变成了根目录

6. 怎么迁移同一个war包启动的多服务。

7. NAS的log文件, 怎么样下载log文件?

其它


1. yaml 文件 ---Error: found character that cannot start any token

问题

在 openshift 中部署我的应用程序期间,我曾经遇到错误“found character that cannot start any token”

我只是添加了一个额外的环境变量,就像之前设置的其他环境变量一样。

查看openshift.yaml文件,看起来好多了,没发现什么问题。但我不断收到上述错误。最终找到了根本原因。

解决方法

删除 openshift.yaml 文件中的所有tab。使用空格进行格式化

2. unrecongnized type:int32

问题

编辑template.yml文件时。参数是数字类型的时候,如果你用${parameter}占位符有报这个错

解决方法

${{parameter}} 双框号

3. 注册OpenShift里的Service到Eureka Dashboard里

背景:在转到OpenShift上之前,我们用的Eureka的注册与发现,所有Micro services都注册到Eureka Server上。由于Micro services很多,不能把所有它们一起都迁移到OpenShift上,带来的问题就是迁移到OpenShift里的Service也需要访问OpenShift之外的Micro services。最后决定把迁移到OpenShift里service也注册到Eureka里,这样所有的Micro services 都可以通过Eureka来发现其它服务。

问题:OpenShift里的service注册到Eureka里时,其它服务拿到的host是域名,port是容器的端口,造成方法不了。

原因: OpenShift会给每个service分配一个独立的域名,通过这个域名就可以方便的访问,不需要容器的端口号。

解决方法:修改Eureka client 里面的代码,让其注册的时候用443.因为443是https的默认端口,如果你用域名访问时,默认是443端口。

4. 当关闭pod时,Eureka client 不会出发Deregister请求,

背景:在linux环境中,Stop service用Kill porcessName命令,这个时候我们运行的服务就会执行ShutDownHook里面的东西。如果你用Eureka的话,Eureka客户端会在这个hook里发一个deregister的请求到Eureka Server,

问题:shut down pod 的时候, pod里面的java 进程不会执行ShutDownHook方法,进而不会发出deregister请求到Eureka Server

解决方法

在容器的生命周期里,加一个preStop事件,OpenShift在容器结束前立即发送 preStop 事件,除非 Pod 宽限期限超时,OpenShift 的容器管理逻辑 会一直阻塞等待 preStop 处理函数执行完毕。你可以在这个里让你的应用发deregister请求给Eureka server,不过你的暴露这个rest api,在这个rest api方法里手动完成deregsiter调用。

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]


Pod的终止过程:

删除Pod => Pod被标记为Terminating状态 => Service移除该Pod的endpoint => kubelet筛别Terminating状态的pod,执行pod的preStop钩子 => 如果执行preStop超时(grace period) ,kubelet发送SIGTERM并等待2秒 => ..

5. Current working dir默认的变成了根目录

问题:在POD里下面的代码返回的目录是根目录"/"。

Path.get("").toAbsolutePath().toString()

解决方法

在template.yml里加workingDir参数。

spec:
  containers:
    - name: Users
      image: Userxxxx
      workingDir: /root/

6. 怎么迁移同一个war包启动的多服务。

问题: 原来我们通过对同一个war加不同的参数启动不一样的服务。比如: web服务,jms服务,等等。如果迁移到openshift上的话。一个war默认的只能是一个服务。

解决方法:不同的服务编写不一样shell script。然后在template.yaml文件里加多个deploymentconfig。一个启动脚本对应一个deploymentconfig。把你的启动脚本通过command 标签加入到相应的deploymentconfig就可以了。

总结:其实每个deploymentconfig代表一种类型的pod. 通过加多个deploymentconfig就可以提供多类型的pod.而且他们还可以scale down/up. 

7. NAS的log文件, 怎么样下载log文件?

问题:我们用NAS来共享文件,例如cert, log , config等等。如果可以NAS挂在到VM或linux server上那是很好的解决方案。如果不能,还有其它的方法可以下载和查看NAS的文件。

解决方法:在一个新的pod里的启动脚步里,加下面的命令python用于把你的文件目录变成一个简单的http web server. 这要你就可用通过浏览器访问目录里面的内容了。

python 2版本

python -m SimpleHTTPServer 9000

python 3版本

python3 -m http.server 9000

如果你在本地运行上面命令,结果如下:

Python SimpleHTTPServer 只支持两种 HTTP 方法——GET 和 HEAD。所以它是通过网络共享文件的好工具。 

其它问题持续更新中。。。

其它

Openshift 与k8s的异同

OpenShift可以看成是K8S的发行版,它在K8S的基础上,增加了很多红帽修改后的补丁,在稳定性与安全性方面有了很大的提升。

特定于DeploymentConfigs的功能

自动回滚

当前,Deployments不支持在发生故障时自动回滚到最后成功部署的ReplicaSet。

Triggers
Deployments具有隐式的ConfigChange触发器,因为部署的Pod模板中的每个更改都会自动触发新的部署。如果您不想更改Pod模板的新推出,请暂停部署:

oc rollout pause deployments/<name>

Lifecycle hooks
Deployments尚不支持任何lifecycle hooks. 

定制策略

Deployments尚不支持任何 user-specified Custom deployment strategies 

特定于Deployments的功能

Rollover
Deployments的部署过程由controller loop驱动,与DeploymentConfigs相比,DeploymentConfigs对每个新的部署都使用部署程序容器。这意味着部署可以具有尽可能多ReplicaSets,而一个dc在同一时刻最多最多有两个rc(一个负责部署,一个负责扩容)。

比例缩放

由于Deployment控制器是Deployment拥有的新的和旧的ReplicaSet大小的唯一事实来源,因此它能够扩展正在进行的部署。 其他副本根据每个ReplicaSet的大小按比例分配。

正在进行部署时,无法缩放DeploymentConfig,因为DeploymentConfig控制器最终将在部署程序进程中遇到有关新ReplicationController大小的问题。

暂停发布中

可以在任何时间点暂停Deployments ,这意味着您也可以暂停正在进行的rollouts。另一方面,您当前无法暂停部署程序容器,因此,如果您尝试在首次部署过程中暂停DeploymentConfig,则部署程序进程将不会受到影响,并且会一直持续到完成为止。

OpenShift中的Deployment和DeploymentConfig_51CTO博客_openshift deployment

参考资料

https://ssathishan.medium.com/openshift-yaml-error-found-character-that-cannot-start-any-token-c715c4be670c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茫茫人海一粒沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值