• Golang如何读取JSON文件

    Golang

    读取文件

    首先要能读取文件内容,读取文件内容可以使用os.Open()打开一个文件,然后再使用ioutil.ReadAll()读取文件的内容。这里要注意一下,ioutil.ReadAll()读取到的是字节,也就是[]bytes数据类型。如果你需要把字节转换成字符可以在使用string()函数转成字符。如这个例子,读取user.json文件并打印出内容

    user.json

    {
      "first_name": "Nicholas",
      "last_name": "Lee",
      "blog_url": "https://www.qttc.net",
      "blog_name": "琼台博客"
    }
    

    ...

    READ ALL

  • JavaScript中为什么async/await在forEach里不工作

    Node await async

    写JavaScript最头疼的就是回调函数,反人类的设计,虽然IO异步机制很牛逼,于是各种轮子开始造起来,目的是让你尽量以同步IO的方式编写异步IO程序,这样的代码易于维护,并且还能保持IO异步的特性。

    其中,async/await就是其中一个轮子,这货目前看起来还是比较受欢迎的,我也经常在使用。今天要正好也要用它发现不工作了,大致代码如下:

    app.js

    const numbers = [33, 41, 57];
    
    let sum = 0;
    
    const sumFunction = (a, b) => {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(a + b);
        }, 1000);
      });
    };
    
    numbers.forEach(async (number) => {
      sum = await sumFunction(sum, number);
    });
    
    console.log(sum);
    

    ...

    READ ALL

  • Kibana 请求超时错误 Request Timeout after 30000ms

    Kibana

    在Kubernetes上为了更好的管理查看日志,通常都使用ELK(Elasticsearch Logstash Kibana)或者EFK(Elasticsearch Fluentd Kibana)方案统一收集并在Kibana上查询日志。可能是在我搭建EFK的时候没有给Elasticsearch足够的资源,导致Kibana在查询Elasticsearch时没有及时得到响应,此时Kibana会自动停止该请求,并提示用户请求超时

    ...

    READ ALL

  • Kubernetes如何在Deployment中更新ConfigMap

    Clock

    前两天我写了一篇文章《Kubernetes如何修改从文件创建的ConfigMap内容》介绍了如何更新ConfigMap,今天我要说的是ConfigMap更新之后如何让已经在使用Deployment方式部署Pods里的ConfigMap生效,因为当你变更ConfigMap之后已经在运行的Pods是不会自动更新最新的ConfigMap的,需要手动处理一下。

    ...

    READ ALL

  • Kubernetes如何修改从文件创建的ConfigMap内容

    Grumpy Cat

    在Kuberenetes中ConfigMap是最常用的功能了,尤其在容器化弹性快速部署的模式下,应用的配置就可以通过ConfigMap很好的管理。ConfigMap有Key和Value配成一对,一个ConfigMap中可以有很多个Key-Value对,创建ConfigMap时,Key-Value信息可以从字面量来,也可以从文件中来

    • kubectl create cm my-config --from-literal=key1=config1 --from-literal=key2=config2 从字面量创建key=value对
    • kubectl create cm my-config --from-file=path/to/bar 从文件中创建key=value对,key则是文件名bar,value就是文件内容

    ...

    READ ALL

  • Nginx使用proxy_redirect替换proxy_pass Response 301/302的Location字段

    nginx

    Nginx通过proxy_pass反向代理请求到任意一个地址,并将Response返回给用户,多数情况下这是没什么问题的,但有一种情况下需要额外处理301/302的Location字段,假设

    • Server: 192.168.1.2: 是内网中的一台服务,在内网环境中大家都直接访问它
    • Nginx: 192.168.1.3: 是一台外网入口的Nginx服务,访问外网IP将直接访问到它,它会反向代理到192.168.1.2

    ...

    READ ALL

  • tar打包改变目录路径

    full change directory path when packing with tar

    tar是一个非常好用的Linux下打包命令,tar默认打包是全路径,也就是你在打包时指定的路径是什么样打包后是什么样,下面看看例子

    假设要打包的目录是/home/nicholas/website

    nicholas@nicholas-B85-D3V:~/website$ ll /home/nicholas/website
    total 8
    drwxrwxr-x  2 nicholas nicholas 4096 11月 25 09:07 ./
    drwxr-xr-x 76 nicholas nicholas 4096 11月 25 09:06 ../
    -rw-rw-r--  1 nicholas nicholas    0 11月 25 09:06 index.html
    -rw-rw-r--  1 nicholas nicholas    0 11月 25 09:07 logo.png
    

    ...

    READ ALL

  • 升级etcd失误导致整个Kubernetes集群瘫痪

    Bad day

    Kubernetes依赖KV数据库管理配置数据,默认推荐使用Etcd,当然你不喜欢还有很多其它的选择。由于升级Kubernetes之后没有升级Etcd版本导致集群总有一些小问题,最明显的一个问题就是CronJob遗留的Pods不会自动清理掉,之前的文章我也说过这个问题,后来我意识到这可能是升级Kubernetes之后没有升级相应的Etcd版本导致的。之前在构建集群的时候使用的是外部自建Etcd集群,直接使用Etcd Docker镜像启动的,我的Kubernetes集群一共三台Master,为了方便我直接三台Master上分别运行Etcd程序组成高可用的Etcd集群。

    ...

    READ ALL

  • Kubernetes如何升级

    kubernetes

    Kubernetes集群升级非常简单,但如果你要升级的版本是一个末位数为0的请慎重,比如你要从v1.15.5升级到v1.16.0。我之前盲目升级导致目前一直有两个坑一个没有填好

    • 升级后CronJob的Pod不会自动清理,升级之前自动保留最后三个,即使设置了successfulJobsHistoryLimit: 3也无效,发现跟我入坑的还有不少人
    • 升级后跑Gitlab-Runner时容器总是经常command terminated with exit code 137,升级之前从来没有这个问题,开issue Gitlab团队的人回复目前这个问题无解,尝试给足够多的Resources来减少这种问题的出现,但仍然还是不能完全避免

    ...

    READ ALL

  • Crontab默认编辑器修改

    在新系统中初次使用crontab时会询问默认打开编辑器选项,不小心就选了默认的nano,由于要修改的内容也简单所以就想简单使用nano完成任务就好。结果实在是不习惯,使用了多年的vi之后很难适应别的editor,没办法只好想办法把默认的editor改回vim。

    有两种方式可以改

    通过环境变量

    环境变量可以设置VISUALEDITOR,两个任何一个都可以,如我想在编辑crontab时使用vim打开可以这么做

    VISUAL=vim crontab -e  
    

    或者也可以这样

    EDITOR=vim crontab -e  
    

    ...

    READ ALL