Kubernetes应用迁移问题定位

这个帖子记录全部的应用迁移中遇到的问题。nginx

 

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

在原有的Dockerfile中修改,加入docker

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

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

而后经过kubectl exec -it ... bash进去手工运行进行定位tomcat

 

  • Zookeeper基本操做命令

查找生产者消费者信息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

 

  • 删除一直在Terminating状态的Pod

使用命令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出现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   这个基本问题折腾了半天。

相关文章
相关标签/搜索