这个帖子记录全部的应用迁移中遇到的问题。nginx
在原有的Dockerfile中修改,加入docker
RUN echo "aaa" > /etc/a.log CMD ["tail",“-f","/etc/a.log"]
而后经过kubectl exec -it ... bash进去手工运行进行定位tomcat
查找生产者消费者信息bash
./zkCli.sh -server 192.168.5.130:2888
ls /
ls /dubbo
查看消费者app
ls /dubbo/com.ivan.service.provider.UserService/consumers
查看生产者curl
ls /dubbo/com.ivan.service.provider.UserService/providers
使用命令ide
kubectl delete pod NAME --grace-period=0 --force
以前采用的命令是ui
systemctl restart flanneld docker kubelet kube-proxy
但问题是会把这台主机全部的容器从新启动一次。google
仔细观察了一下有几台常常处于这种状态的主机,发现机器配置是2C,4G的内存,tomcat配置的是Xmx1G,但由于程序的缘由,每次启动之后,若是3个实例分在三台不一样的机器上,最后宿主机的free memory在500-700m,程序吃掉大量内存,这时候若是一旦从新部署,常常发生两个实例同在一台机器上的状况时,就会出现没法释放资源,一直在terminating的状态,从新启动也花费很长的时间。url
但若是三个实例均分三台机器,系统还算能保持正常,所以修改部署文件为
在spec下加入podAntiAffinity选项。
template: metadata: labels: app: zk spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: "app" operator: In values: - zk topologyKey: "kubernetes.io/hostname" containers: - name: k8szk imagePullPolicy: Always image: gcr.io/google_samples/k8szk:v3 resources: requests: memory: "2Gi" cpu: "500m"
JAVA_OPTS="-Xms64m -Xmx256m -XX:MaxPermSize=128m -Dfile.encoding=GBK $JAVA_OPTS"
登陆容器内部,经过
locale -a
查看全部的字符集,而后在Dockerfile中设置
ENV LANG C.UTF-8
c.UTF-8自己是带有中文字符支持的。
若是有log4j,须要在properties文件中设置
log4j.appender.console.Encoding=UTF-8 log4j.appender.logfile.Encoding=UTF-8
kubectl cp pod_id:/pod_directory /host_directory
原理是nginx会先解析你的upstream,若是这个upstream指向一个Kubernetes服务,而这个服务没有启动的话,就没法解析,从而致使Nginx中止运行或者启动不成功。
解决办法,让nginx动态的解析upstream,而不是在启动的时候静态解析,这须要在location中间来设置,好比
upstream fp_tomcat {
server tomcattest:8080
}
location /foo { resolver 127.0.0.11 ipv6=off; # or some other DNS (you company/internal DNS server) #resolver 8.8.8.8 valid=30s; set $upstream_foo fp_tomcat; proxy_pass http://$upstream_foo; }
启动的时候,若是tomcattest服务不存在,日志中会报错,但不会影响其余的运行,当tomcattest启动之后,服务就会被成功调度
另外这个/foo路径千万当心,nginx会把foo路径带到后面的tomcat中,其实你访问
curl http://nginxsvc:nginxport/foo 就是访问tomcattest:8080/foo 这个基本问题折腾了半天。