git rebase 是什么?

以前经常用git-flow或者cherry-pick, 会产生很多分支merge的历史,如果要避免这些,可以考虑采用git rebase.

假设你现在基于远程分支origin,创建一个叫mywork的分支。

1
$ git checkout -b mywork origin

deepin + virtual box 安装增强扩展失败的问题修复

问题

在ubuntu desktop里面用virutalbox来安装deepin,然后如果希望宿主机和虚拟机之间可以进行内容的copy/paste,需要安装扩展。

一般来说,如果在windows下,直接在virtualbox里面执行安装功能,virtualbox会直接下载然后完成安装,但是ubuntu下安装deepin如果直接执行操作,virtualbox也会去下载扩展的安装包,但是下载完后,安装的时候,会报找不到扩展的安装包。而且之后重启你会发现不能正常进入deepin系统。

如何管理linux设备上的bridge(网桥)和docker bridge

什么是bridge(网桥)?

bridge是一种技术,可以把一个linux设备上的两块网卡桥接在一起,如何对外表现为一个大的网卡接口,这样做有很多用途

比如你有两台设备,但是又没有路由器,那么把他们桥接在一起,可以共享其中一台的网络,这样两台都可以上网,这两台设备也可以是vm,不一定是物理设备

还有一种用途,就是监控两个设备的网络流量,比如用wireshark来监控他们间的流量

总的来讲,桥接就是将一台计算机插入到已经与较大网络(例如Internet)建立连接的另一台计算机上,然后让这台桥接上去的计算机可以使用联网计算机的连接。

哪些软件使用了桥接技术

bridge在vm(virtual machine)的领域非常有用,比如docker, k8s, multipass等。

docker可以帮忙创建很多独立的虚拟容器,那这些容器怎么上网,相互之间怎么通信呢,docker提供多种途径,其中一种就是bridge。

查看设备上有哪些bridge,可以用brctl命令,如果你的没有这个命令,可用apt或者yum安装** sudo apt install bridge-utils**

集线器 (hubs),交换机(switch) 和网桥(bridge)的区别

image

集线器(hub)

  • hub工作在OSI的第一层,发给 hub 的数据包会广播给所有的端口
  • hub的是直接的物理连接到每一台设备的网卡,所有有较低的连接丢失风险,因为hub是所有设备共享带宽的一个设备,所以它是半-双工的,所以他会存在冲突,同时发给hub的入站和出站包会存在冲突,需要算法解决冲突,因此hub的性能相对会差一些
  • hub本质上是一个多端口中继器,它不管包的内容,只是简单的把某个端口收到的包,再广播给其他所有的端口,所以,一台主机发给另外一台主机的内容会被其他无关的主机监听到。有安全问题

网桥(bridge)

image

Dqlite,基于sqlite 高可用(HA)数据库

k3s之前的multi-master的支持 Mysql, PostgreSql, etcd 这3个方案,现在正在实验一个内嵌的multi-master方案,使用一个sqlite的HA版本-dqlitedqlite-顾名思义,distibution sqlite,以后稳定的话,可能会成为官方推荐的HA方案。

Dqlite用主要做了几个事情:

  1. 提供一个基于raft的解决方案,基于一个叫 c-raft 的 raft轻量级实现,

  2. 把sqlite封装起来,给它存储层注册一个定制driver来操作数据

  3. CAP理论里,和绝大多分布式数据库一样,dqlite选择了(CP without A), 就是选择了Consistency(一致性)、Partition tolerance(分区容错性),而不保证 Availability(可用性),也即是:

  4. 保证了数据一致性

  5. 保持强一致性,用户请求需要在服务器中所有的分区里面完成了一致性才返回

  6. 但是,不保证每个请求都能得到没有报错的响应

瑞士军刀NC

nc是网络调试的一款强大的工具,是用于处理TCP或UDP数据的通用实用程序,是黑客界的瑞士军刀

看看的常规用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
> tldr nc
Netcat is a versatile utility for working with TCP or UDP data.
More information:
https://nmap.org/ncat

- Listen on a specified port and print any data received:
nc -l {{port}}

- Connect to a certain port (you can then write to this port):
nc {{ip_address}} {{port}}

- Set a timeout:
nc -w {{timeout_in_seconds}} {{ipaddress}} {{port}}

- Serve a file:
nc -l {{port}} < {{file}}

- Receive a file:
nc {{ip_address}} {{port}} > {{file}}

- Server stay up after client detach:
nc -k -l {{port}}

- Client stay up after EOF:
nc -q {{timeout}} {{ip_address}}

- Scan the open ports of a specified host:
nc -v -z {{ip_address}} {{port}}

- Act as proxy and forward data from a local TCP port to the given remote host:
nc -l {{local_port}} | nc {{hostname}} {{remote_port}}

nc对于网络的操作可以分为接受发送这两种操作

区别是参数 -l, -l 是监听端口的参数,有这个参数,说明启动的是一个服务端

其他没有-l的操作,则是向其他网络端发起网络操作,是一个客户端

理解k8s的Flannel网络

此文始发于我的简书博客: k8s的Flannel网络,特此声明

引: 之前写过一篇文章介绍如何管理linux设备上的bridge(网桥)和docker bridge, 今天我们来看看k8s的网络模型。

我们先来看图示例,下面则个是k8s的网络模型图。

k8s的网络模型

我们知道,在k8s里面最小的管理单元是pod,一个主机可以跑多个pod,一个pod里面可以跑多个容器。

如上面所示,一个pod里面所有的容器共享一个网络命名空间(network namespace),所以,pod里面的容器之间通信,可以直接通过localhost来完成,pod里面的容器之间通过localhost+端口的方式来通信(这和应用程序在宿主机的通信方式是一样的)。

什么是子网掩码?

“子网”掩码,顾名思义,它就是拿来划分子网的,更准确的说,划分子网的同时,还能通过它知道主机在子网里面的具体ip的具体地址。

用途

那么划分这个子网有什么用呢?

  1. 方便管理,不同的子网可以相互隔离
  2. 我们知道,IPv4的ip地址资源比较紧张,实际上整个互联网就是一个巨大的局域网,ip地址有限,那么通过划分子网,如何再在子网里面分配ip地址给子网的主机,这个时候同一一个ip就可以给一整个子网所共用,就解决了互联网ip不够的问题

原理

既然要划分子网,要有一个规则,告诉路由器,IP的哪一部分是表示子网,哪一部分表示我在这个子网里面具体的地址

所以,实际上IP细来讲又分为三部分:网络部分(network)子网段部分(subnetwork)和主机部分(host)

一般大家喜欢把网络部分和子网部分合并成为网络地址(网络号),把子网看做是网络的一部分,主机部分称为主机地址(主机号)

自有短地址服务yourls最简单的部署方式

介绍

有时候,我们需要对不同的流量来源做精准的统计,比如我们群发短信,希望对群发效果做a/b test,可以在短信里面的带的landing page做区分,然后需要有精准的统计工具,这个时候我们可以用短地址系统来做统计,也就是在不同的短信里面使用不同的短地址,然后对短地址系统来做数据采集和分析。

yourls是一个基于php+mysql开发开源的短地址服务系统,除了基础的跳转外,还提供丰富的统计和插件。

安装

我们知道使用php的包安装工具composer有时候是件非常痛苦的事情,还有yourls系统需要apache或者nginx配合,把服务器搞得很乱,因此,最好的办法就是把yourls封装到docker里面,打包交给docker-composeswarm 或者 k8s 来管理。

NAT探珠

概要

NAT的全称是 Network Address Translation, 其实看英文名,就知道它的大概意思:网络地址转换。

严格来说,

  • 这个Address,包括了IP地址和端口。
  • 而这个Translation,则包括来来源地址和目的地址,以及来源端口和目的端口这4者之间的转换

那么NAT规则其实定义的就是这4者的映射关系,告诉路由器应该怎么去转换(Translation)

那么什么时候会用到NAT技术呢,答案是,从一个网络到另外一个网络,有一些文章在写NAT的时候,常讲的是外网(互联网)到私网(私域子网)的通信的时候,其实这只是其中一种场景,实际上,只要是两个网络间需要通信,都可以用NAT来做。

下面这个图讲的就是互联网和私网这个场景的NAT

1
2
3
4
5
6
7
8
9
10
 \ | /                  .                               /
+---------------+ WAN . +-----------------+/
|Regional Router|----------------------|Stub Router w/NAT|---
+---------------+ . +-----------------+\
. | \
. | LAN
. ---------------
Stub border

Figure 1: A typical NAT operation scenario

mac os (freebsd)的路由规则学习

MacOS的路由表查询不是用我们熟知的route命令,而是使用命令 netstat -r 或者netstat -nr(不做域名解释)来查看

netstat -r
Routing tables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Internet:
Destination Gateway Flags Netif Expire
default 192.168.3.1 UGSc en0
127 localhost UCS lo0
localhost localhost UH lo0
169.254 link#4 UCS en0 !
192.168.3 link#4 UCS en0 !
192.168.3.1/32 link#4 UCS en0 !
192.168.3.1 a1:9b:00:00:ea:18 UHLWIir en0 1165
192.168.3.4 51:00:00:00:ee:18 UHLWIi en0 1153
192.168.3.5/32 link#4 UCS en0 !
192.168.3.8 a1:1f:00:00:a:88 UHLWIi en0 795
224.0.0/4 link#4 UmCS en0 !
224.0.0.251 1:0:00:0:0:fb UHmLWI en0
239.255.255.250 1:0:00:11:ff:fa UHmLWI en0
255.255.255.255/32 link#4 UCS en0 !

如果加-n不解析域名也就是,那么destination就是ip,如:

使用github action同时部署hexo到github和coding最优雅的方式(支持多github账号)

目标

我们知道使用github action 可以很简单的部署hexo的静态文件到github pages,但是如果在国内我们希望部署到github pages同时也部署到coding,然后通过dns双线路由,另外,我们可能有多个账号,比如公司的和个人的博客或者网站,也是同时部署到coding和github,那就这个github action解决不了,下面我们改造一下,使其达到这个目标:

  1. hexo的source存放在独立库
  2. 生成的静态文件存在独立的库
  3. 提交markdown文件后,自动生成静态文件
  4. 自动部署到github pages
  5. 自动部署到coding
  6. 同一份hexo source库,只需要配置一次hexo的_config.yml,就可以直接通过hexo deploy -g 或者git push来触发部署
  7. 支持多个github账号,同时也支持多个coding账号

优雅的将hexo部署到github和coding

1. 前言

上次写了篇文章 使用github action同时部署hexo到github和coding最优雅的方式(支持多github账号),从实现原理的角度做了介绍,由于实现的目标比较多,所以看起来比较复杂,这次我们不讲原理,仅仅按实现目标来介绍如何配置。

1.1 目标

先说我们要实现的目标,然后再按目标来介绍方法

  1. hexo的source存放在独立私有库jiuhao
  2. 生成的静态文件存放在github和coding独立的库
  3. 本地可以通过 hexo d -g一个命令一次性部署到github和coding
  4. 可以通过git push推送到github的surce仓库后,由action触发部署到github和coding的静态仓库
  5. 同时实现3和4,只需要配置一次_config.yml。而不需要在action里面写死目标静态仓库的地址,方便维护
  6. 支持多个github账号,同时也支持多个coding账号

说明:

  • 目标 1 把 source 放在独立的私有库是安全性考虑
  • 目标 3 和 4 是方便可以使用两种方法都能达到部署的目标, 3 是手工部署, 4 是通过git push触发,比如 github 的 action 可能某些原因失败了,暂时又没时间去维护,那么我可以直接在本地hexo d -g部署就行
  • 目标5是实现3和4的时候,两种方法的目标仓库(publish repo)地址配置只需要一处维护,不需要分散在 _config.yml 和 github action
  • 目标 6 是可选目标。 如果不需要区分工作和私人用的github 账号,可以不需要理会这个目标。