Kubernetes应用迁移问题定位

这个帖子记录所有的应用迁移中遇到的问题。

 

  • 关于镜像无法启动后无法定位问题

在原有的Dockerfile中修改,加入

RUN echo "aaa" > /etc/a.log

CMD ["tail",“-f","/etc/a.log"]

然后通过kubectl exec -it ... bash进去手工运行进行定位

 

  • Zookeeper基本操作命令

查找生产者消费者信息

./zkCli.sh -server 192.168.5.130:2888
ls /

ls /dubbo

 

查看消费者

ls /dubbo/com.ivan.service.provider.UserService/consumers

查看生产者

ls /dubbo/com.ivan.service.provider.UserService/providers

 

  • 删除一直在Terminating状态的Pod

使用命令

kubectl delete pod NAME --grace-period=0 --force

之前采用的命令是

systemctl restart flanneld docker kubelet kube-proxy

但问题是会把这台主机所有的容器重新启动一次。

仔细观察了一下有几台经常处于这种状态的主机,发现机器配置是2C,4G的内存,tomcat配置的是Xmx1G,但因为程序的原因,每次启动以后,如果3个实例分在三台不同的机器上,最后宿主机的free memory在500-700m,程序吃掉大量内存,这时候如果一旦重新部署,经常发生两个实例同在一台机器上的情况时,就会出现无法释放资源,一直在terminating的状态,重新启动也花费很长的时间。

但如果三个实例均分三台机器,系统还算能保持正常,因此修改部署文件为

在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出现host not found in upstream

原理是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   这个基本问题折腾了半天。

 

posted @ 2018-04-18 10:53  ericnie  阅读(790)  评论(0编辑  收藏  举报