這個帖子記錄全部的應用遷移中遇到的問題。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 這個基本問題折騰了半天。