目录
1. yaml 文件 ---Error: found character that cannot start any token
3. 注册OpenShift里的Service到Eureka Dashboard里
4. 当关闭pod时,Eureka client 不会出发Deregister请求,
5. Current working dir默认的变成了根目录
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
参考资料