babel-node use import with babel7.5

babel 7.5.5 环境中支持 import 与 export

node 与 babel 默认不支持 import export 语法,需要转义,在测试、开发环境中可以使用临时的命令行方式。

安装 babel

1
npm i -D @babel/core @babel/node @babel/preset-env

package.json 中添加 babel 配置

1
2
3
4
5
6
7
"babel": {
"presets": [
[
"@babel/preset-env"
]
]
}

如果添加 .babelrc 文件,则不会读取。

安装完成后,使用 babel-node 命令执行:

1
npx babel-node test.js

例子:

test.js

1
2
3
4
5
import { a, modify } from './a.js';

console.log('a: ', a);
modify();
console.log('a: ', a);

a.js

1
2
3
4
5
export let a = 1;

export const modify = () => {
a = 2;
};

运行结果:

1
2
3
git:(master) ✗ npx babel-node test.js
a: 1
a: 2

引入的模块会作为本地变量,如果有修改,则会影响本地的值.

CSS hover 时显示其它元素

React中经常会用到一个功能,就是鼠标悬停在某一元素上时显示另外一个元素,或子元素、或兄弟元素。

React可以使用state的值控制是否显示,另外还可以使用CSS选择器实现。

有如下两个div:

1
2
<div class="cls1">div1</div>
<div class="cls2">div2</div>

对应的CSS为:

1
2
3
4
5
6
7
.cls2 {
display: none; // div2 默认不显示
}

.cls1:hover+.cls2 {
display: inline-block;
}

亲自试一试: https://codepen.io/Witee/pen/JzOpmj

关键就是第二行的选择器配置,鼠标放在div1上时,就是显示兄弟元素中classcls2的元素。
另外兄弟选择器(+)还可以换成子元素选择器(>),这样就可以显示div1下的元素了。

centos7使用privoxy配合shadowsocks翻墙

首先,你需要一个shadowsocks帐号,用于翻墙。

然后我们在centos上安装shadowsocks软件。推荐通过pip安装。

很简单

1
2
yum install python-pip
pip install shadowsocks

随后,我们配置好帐号密码,新建/etc/shadowsocks.json文件:

1
2
3
4
5
6
7
8
9
{
"server":"your_server_ip", #ss服务器IP
"server_port":your_server_port, #端口
"local_address": "127.0.0.1", #本地ip
"local_port":1080, #本地端口
"password":"your_server_passwd",#连接ss密码
"timeout":300, #等待超时
"method":"rc4-md5", #加密方式
}

启动:sslocal -c /etc/shadowsocks.json

安装Privoxy
直接使用yum安装即可 yum install privoxy

安装好后,修改一下配置vim /etc/privoxy/config

搜索forward-socks5t,将 forward-socks5t / 127.0.0.1:9050 . 取消注释并修改为

1
forward-socks5t / 127.0.0.1:1080 .  # 注意最后有个点

然后取消以下几行代码注释,本地网络不翻墙

1
2
3
4
5
forward         192.168.*.*/     .
forward 10.*.*.*/ .
forward 127.*.*.*/ .

forward localhost/ .

启动privoxy privoxy /etc/privoxy/config

配置/etc/profile
执行vim /etc/profile,添加如下二句:

1
2
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118

修改后使配置生效 source /etc/profile

执行wget www.google.com判断是否成功

如果不能访问,请重启机器,依次打开shadowsocksprivoxy再测试

备注:如果不需要用代理了,记得把bash里的配置注释上,免得把流量跑完了

使用 kubeadm 安装 kubernetes(k8s)

服务器需要可以科学上网

  • 安装 kubeadm

    请优先按官方安装文档安装: https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/

    • 使用阿里的YUM源

      1
      2
      3
      4
      5
      6
      7
      8
      9
      cat <<EOF > /etc/yum.repos.d/kubernetes.repo
      [kubernetes]
      name=Kubernetes
      baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
      enabled=1
      gpgcheck=0
      repo_gpgcheck=0
      gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
      EOF
    • 关闭 selinux

      1
      2
      3
      4
      5
      6
      7
      # Set SELinux in permissive mode (effectively disabling it)
      setenforce 0
      sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

      yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

      systemctl enable --now kubelet
      • 加载模块 br_netfilter

        1
        lsmod | grep br_netfilter # centos 7 查询不到结果,看别人文档说已经编译进了某个地方,所以这一步可跳过
  • 安装 k8s

    • 提前加载镜像

      1
      kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
    • 安装 k8s

      –pod-network-cidr=10.244.0.0/16 是因为后面要使用 Flannel 网络

      1
      kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

      init 如果顺利完成,会提示执行几行命令

      1
      2
      3
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
    • 安装Flannel网络

      1
      kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

      通过 kubectl get pods --all-namespaces 检查是否已经全部为 Running 状态

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      [root@localhost k8s]# kubectl get pods --all-namespaces
      NAMESPACE NAME READY STATUS RESTARTS AGE
      kube-system coredns-78d4cf999f-677l2 1/1 Running 0 5m7s
      kube-system coredns-78d4cf999f-c6wng 1/1 Running 0 5m7s
      kube-system etcd-localhost 1/1 Running 0 4m40s
      kube-system kube-apiserver-localhost 1/1 Running 0 4m26s
      kube-system kube-controller-manager-localhost 1/1 Running 0 4m40s
      kube-system kube-flannel-ds-amd64-rl8mq 1/1 Running 0 26s
      kube-system kube-proxy-lzb5p 1/1 Running 0 5m7s
      kube-system kube-scheduler-localhost 1/1 Running 0 4m39s
    • 配置master结点也可以分配 pods

      1
      kubectl taint nodes --all node-role.kubernetes.io/master-
  • 添加 node 节点
    请参考官网

本文介绍在 CentOS6.x 上安装 docker

官方文档
https://docs.docker.com/engine/installation/linux/centos/

  • docker 需要64位系统且内核在3.10以上版本

  • 安装前内核版本

    1
    2
    [root@serv ~]# uname -r
    2.6.32-220.el6.x86_64
  • 使用 yum 快速升级内核

    • 导入 Public Key

      1
      rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
    • 安装 ELRepo

      1
      rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
    • 升级 Kernel

      1
      yum --enablerepo=elrepo-kernel install kernel-lt -y
    • 更改 Grub

      1
      vi /etc/grub.conf

    根据安装好以后的内核位置,修改 default 的值,一般是修改为0,因为 default 从 0 开始,一般新安装的内核在第一个位置,所以设置default=0

    • 查看 Kernel
      所有操作都执行完毕以后,重启主机,重启后执行 uname -r,查看内核版本号,判断是否升级成功
  • 禁用selinux

    1
    2
    3
    4
    5
    6
    # getenforce
    enforcing
    # setenforce 0
    permissive
    # vi /etc/selinux/config
    SELINUX=disabled
  • 安装 Fedora EPEL

    1
    yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  • 安装依赖及 docker-io

    1
    2
    yum install device-mapper-event-libs
    yum install docker-io
  • 启动

    1
    service docker start
  • 日志

    1
    tailf /var/log/docker

调整 net.ipv4.tcp_tw_recycle 造成的故障

  • 背景

在 nat 的网络环境访问服务器时会有不定时连接超时的问题

  • 原因

出现此问题,可能是系统参数设置问题,即以下两个参数都设置为 1

1
2
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_tw_recycle = 1

RFC1323中有如下一段描述:

An additional mechanism could be added to the TCP, a per-host cache of the last timestamp received from any connection. This value could then be used in the PAWS mechanism to reject old duplicate segments from earlier incarnations of the connection, if the timestamp clock can be guaranteed to have ticked at least once since the old connection was open. This would require that the TIME-WAIT delay plus the RTT together must be at least one tick of the sender’s timestamp clock. Such an extension is not part of the proposal of this RFC.

大概意思是说TCP有一种行为,可以缓存每个主机最新的时间戳,后续请求中如果时间戳小于缓存的时间戳,即视为无效,相应的数据包会被丢弃。

Linux是否启用这种行为取决于tcp_timestamps和tcp_tw_recycle,因为tcp_timestamps缺省就是开启的,所以当tcp_tw_recycle被开启后,实际上这种行为就被激活了,当客户端或服务端以NAT方式构建的时候就可能出现问题,下面以客户端NAT为例来说明:

当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,也就是说对服务端而言这些客户端实际上等同于一个,可惜由于这些客户端的时间戳可能存在差异,于是乎从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。如果发生了此类问题,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,我们可以通过下面命令来确认数据包不断被丢弃的现象:

1
2
shell> netstat -s | grep timestamp
... packets rejects in established connections because of timestamp

安全起见,通常要禁止tcp_tw_recycle。说到这里,大家可能会想到另一种解决方案:把tcp_timestamps设置为0,tcp_tw_recycle设置为1,这样不就可以鱼与熊掌兼得了么?可惜一旦关闭了tcp_timestamps,那么即便打开了tcp_tw_recycle,也没有效果。

引用地址: https://huoding.com/2012/01/19/142

  • 解决办法

    解决的方法就是将这两个参数修改为:

    1
    2
    net.ipv4.tcp_timestamps = 1
    net.ipv4.tcp_tw_recycle = 0
  • 遇到的问题

    本来修改完成后再次请求就没有问题了,但如果是 docker 服务器的话,会发现容器中无法连接网络!

    因为修改 net.ipv4.tcp_tw_recycle 影响的是 nat 相关,所以如果容器是以 nat 方式上网的话,就会造成影响

  • 解决办法

    解决以上问题,需要先停掉 docker 主进程,然后修改参数,再启动

-

Docker Compose 安装

Docker Compose 用来批量管理 Docker容器
官方文档 https://docs.docker.com/compose/install/

注意,CentOS 6.x 上就算安装成功了也不能使用,因为Docker Compose需要Docker engine版本
为1.10 以上,而 CentOS6 上最多能装 1.7版本。
所以以下文档看看就算了。。。

  • Mac 与 Windows 上的 docker 已经自带了 Compose

  • CentOS 6.x 安装 Docker Compose

  • 打开 URL

    官方发布的版本中有安装方法,打开以下地址,从最新版本中复制

    https://github.com/docker/compose/releases

    1
    2
    3
    4
    5
    6
    7
    8
    9
    If you're a Mac or Windows user, the best way to install Compose and keep it up-to-date is Docker for Mac and Windows.

    Note that Compose 1.10.0-rc2 requires Docker Engine 1.10.0 or later for version 2 of the Compose File format, and Docker Engine 1.9.1 or later for version 1. Docker for Mac and Windows will automatically install the latest version of Docker Engine for you.

    Alternatively, you can use the usual commands to install or upgrade Compose:

    curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
    See the install docs for more install options and instructions.

    所以是执行

    1
    2
    curl -L https://github.com/docker/compose/releases/download/1.10.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose
  • 添加权限

    1
    chmod +x /usr/local/bin/docker-compose
  • 确认完成

    1
    docker-compose --version
  • 如果以上安装不成功,可以使用 pip 进行安装

    1
    pip install docker-compose

本文介绍在 CentOS7.x 上安装 docker

官方文档
https://docs.docker.com/engine/installation/linux/centos/

  • docker 需要64位系统且内核在3.10以上版本

CentOS7 已满足最低要求

  • 添加 yum 源

    1
    2
    3
    4
    5
    6
    7
    8
    # tee /etc/yum.repos.d/docker.repo <<-'EOF'
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/centos/7/
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg
    EOF
  • 安装

    1
    yum install docker-engine
  • 启动

    1
    systemctl start docker