在kubernetes的ingress中配置let's encrypt自动https

平时在普通的机器上,用cert-manager配置let’s encrypt自动开启https非常方便。而在kubernetes中,如果使用ingress做反向代理路由,那么也可以安装对应版本的cert-manager自动开启https, 自动续证书。

1. 安装helm和tiller

helm的安装这里不详细讲,现在一般云服务商(比如阿里云)的kubernetes中都会安装好helm和tiller,只需要在客户端安装helm即可,mac下可以直接用homebrew

1
brew install kubernetes-helm

2. 安装cert-manager

直接贴上来自官方的安装命令即可。大致为新建一个cert-manager的namespace,然后用helm安装相应版本的cert-manager。为了获取更新的版本,执行前可以参考一下官方:https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Install the CustomResourceDefinition resources separately
kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.11/deploy/manifests/00-crds.yaml

# Create the namespace for cert-manager
kubectl create namespace cert-manager

# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update your local Helm chart repository cache
helm repo update

# Install the cert-manager Helm chart
helm install \
--name cert-manager \
--namespace cert-manager \
--version v0.11.0 \
jetstack/cert-manager

检查是否安装成功

1
kubectl get pods --namespace cert-manager

成功的话类似:

1
2
3
4
NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr77l 1/1 Running 0 2m
cert-manager-webhook-787858fcdb-nlzsq 1/1 Running 0 2m

3. 配置issuer

注意下面的邮箱需要改成你自己的

创建一个production-issuer.yaml文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: user@example.com
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
solvers:
- http01:
ingress:
class: nginx
1
2
$ kubectl create --edit -f production-issuer.yaml
issuer.cert-manager.io "letsencrypt-prod" created

配置完再查看一眼

1
kubectl describe issuer letsencrypt-prod

4. 开始添加域名使用

首先用常规的方法配置ingress,并等待其分配好IP等信息。然后编辑yaml, 添加issuer,在annotations中加入两行:

1
2
3
4
5
6
7
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kuard
annotations:
kubernetes.io/ingress.class: "nginx" # letsencrypt
cert-manager.io/issuer: "letsencrypt-prod" # letsencrypt

有些云服务商需要手动添加tls证书

1
2
3
4
5
6
spec:
...
tls:
- hosts:
- www.example.com
secretName: example-com-tls

加完之后,耐心等待,cert-manager会自动申请证书,期间可以看到有临时的ingress出现,这就是在验证域名。等待最多10分钟即可配置完成。

如果需要强制https跳转,则再添加一个annotations

1
nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'

jupyterhub设置cors允许跨域

使用jupyterhub作为后端kernal的时候,前端需要通过ws连接到jupyter notebook(由jupyter hub产生)。这时候在默认情况下会产生跨域的情况,需要进行一些配置。

阅读更多
nodejs在kubernetes中的时区设置

kubernetes的pod中默认的时区是0时区,如果要修改时区,一般是通过mount的方式,将/etc/localtime映射为/usr/share/zoneinfo/Asia/Shanghai

但是这种方式下,系统时区是改了,比如在bash中输出date已经是正确的,但是NodeJS应用中可能依然是0时区。这时候需要再加一个环境变量TZ即可。

1
2
3
4
containers:
- env:
- name: TZ
value: Asia/Shanghai

彻底删除macOS中的VSCode

需求源于交还公司电脑,除了在Applications(应用程序)中把VSCode拖到废纸篓,还需要手动删除个人信息。

总共有两个地方

1
2
rm -rf $HOME/Library/Application\ Support/Code
rm -rf $HOME/.vscode

根据背景色判断前景黑白颜色

类似于iPhone的最上方信息栏(电量时间等),根据背景颜色的深浅程度,判断文字应该显示为白色还是黑色。

实现思路是,先抛弃颜色,转灰度,然后即可简单的设置一个阈值(实测186是一个不错的值)来判断。

转灰度的公式是Gray = R*0.299 + G*0.587 + B*0.114

1
2
3
4
5
6
7
8
9
10
// example: background cccccc (without #)
function decideFontColor(background) {
const red = parseInt(background.substr(0, 2), 16);
const green = parseInt(background.substr(2, 2), 16);
const blue = parseInt(background.substr(4, 2), 16);
if ((red * 0.299 + green * 0.587 + blue * 0.114) > 186) {
return '#000000';
}
return '#ffffff';
};

创业与在大公司的回报概率曲线

回报概率曲线

较小和较大的收入,都是创业比较容易获取。较小的收入,可以对应国内的小规模“做生意”,有很大一部分人可以赚到比在公司更多的钱。但是通常有一个上限,比如年收入100万,在这之上则是在大公司比较容易,比如年薪百万以上的高级程序员和管理人员。而继续往上,实现“财富自由”,则还是创业比较容易。

Why You Want To Start a Startup


slate.js拼音输入法的光标错位及Safari/Edge下无法输入问题

目前,slate编辑器对中文拼音输入法的支持并不好,主要存在两个问题

  1. 比较轻的问题,在Chrome下,拼音可以输入,但是光标位置没有跟随移动
  2. 在Safari或者Edge(windows)中,甚至经常无法输入中文
阅读更多
以JS处理emoji表情为例简介UTF-8编码

Emoji 表情符号是直接保存在字符中的标签,不是一张图片,而是可以理解为和一个汉字同类的东西。因此在绝大多数可以打字的地方,就能放Emoji。但是某些地方会出现表情变成问号或者一个框框的情况,其中一个可能的原因是使用了自定义的,或者过时的UTF-8解码形式。

首先简单说明一下文字在计算机中是如何被存储的。毫无疑义的是,文字最终一定是以二进制的形式存储的。其中最简单的是著名的ASCII码,他是早期由美国指定的一个编码标准,建立了一个二进制数到字母和符号的映射关系,其中共有128个符号,包括了英文大小写字母和标点符号等。二进制范围从0000 00000111 1111,具体范围可以查看维基百科。后来互联网时代这套标准延续了下来,一直用于英语文字的存储,通常直接用8位二进制,即一个字节(Byte)存储。

可是问题来了,世界并不只有英文,欧洲有法语、德语等语言不全是有26个英文字母组成的,亚洲又有众多的象形文字,比如中文字符的数量就多了去了。所以继续拓展,一开始,欧洲国家使用一个字节中剩下的128个空间各自表示自己语言的符号,而中文则是以GB2312为主(如Windows系统),用两个字节来存储常用的6万多个汉字。由于各种编码之间并不是遵循同样的标准,所以有些时候我们会看到各种乱码,比如著名的手持两把锟斤拷,口中直呼烫烫烫

阅读更多
node-canvas的模糊实现

在较新的HTML版本中,图像的模糊可以用canvas的filter指定为blur的方式实现,但是node-canvas库目前还不支持filter。不过它开放了像素的访问和设置,所以业务需要自己实现了一个简单的图像模糊。

具体思路为,使用某种算法,对一个像素p,通过计算其周边的像素点(模糊半径)得到一个新的像素值,写入p,并且按顺序对于每一个像素操作一边。这里举例最简单的,均值模糊,即一个像素等于它周边像素的平均值。通常称为均值滤波器。常见的还有中值模糊、高斯模糊等。

阅读更多
添加位于本地目录的npm包

npm包默认从registry远程获取并放在node_modules文件夹中。有时候自己写的代码由于相对路径太长,import比较痛苦,或者是代码写的还“拿不出手”无法上传到远程,这问题可以通过将本地文件夹安装为npm包的方法解决。

假设有一个src/config文件夹,需要设置为本地的npm包,包名config,设置成功后希望达成:

1
2
const config = require('config'); // 新代码
const config = require('./src/config'); // 老代码

代码包创建配置

src/config文件夹下新建package.json文件,内容为:

1
2
3
4
5
{
"name": "config",
"main": "index.js",
"version": "0.1.0"
}

安装本地代码包

1
npm i file:./src/config

安装成功后,可以发现在项目的package.json文件夹中出现了一个相对路径的dependency

1
2
3
4
5
{
"dependencies":{
"config":"file:./src/config"
}
}