zoukankan      html  css  js  c++  java
  • 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   这个基本问题折腾了半天。

  • 相关阅读:
    redis 集群目标、集群查看、配置方法及过程、哨兵配置启动
    redis 事务、Jedis事务处理流程
    redis订阅与发布(把redis作为消息中间件)
    redis 管道技术 pipeline 简介
    redis 适用场景、缓存选择、java实现
    redis 数据淘汰策略与配置
    redis 持久化策略、aof配置、测试、手动持久化、aof文件体积优化
    redis 命令行查看修改配置文件项、配置文件说明
    redis HyperLogLog 基数估算
    redis 命令select、dbsize、清空数据库、info、client
  • 原文地址:https://www.cnblogs.com/ericnie/p/8872748.html
Copyright © 2011-2022 走看看