k8s 生成证书

生成证书

在 master 节点 10.8.8.8 这台主机上执行,证书只需要创建一次即可,以后在向集群中添加新节点时只要将 /etc/kubernetes/ 目录下的证书拷贝到新节点上即可。

go

1
yum -y install golang
1
2
3
vim ~/.bashrc
export GOPATH=$(go env GOPATH)
export PATH=$PATH:$(go env GOPATH)/bin

下载 CFSSL

go get -u github.com/cloudflare/cfssl/cmd/...

配置文件

1
2
3
4
5
mkdir /root/ssl
cd /root/ssl

cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json

创建 CA (Certificate Authority)

  • 1.创建 CA 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
EOF
  • 2.创建 CA 证书签名请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat >ca-csr.json<<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
  • 3.生成 CA 证书和私钥
1
2
3
4
5
6
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

#生成如下文件
ls ca*

ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem

创建 kubernetes 证书

  • 1.创建 kubernetes 证书签名请求文件 kubernetes-csr.json
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
cat >kubernetes-csr.json<<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"10.8.8.8",
"10.8.8.10",
"10.8.8.11",
"10.254.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
  • 2.生成 kubernetes 证书和私钥
1
2
3
4
5
6
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes

#生成如下文件
ls kubernetes*

kubernetes.csr kubernetes-csr.json kubernetes-key.pem kubernetes.pem

创建 admin 证书

  • 1.创建 admin 证书签名请求文件 admin-csr.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat >admin-csr.json<<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
  • 2.生成 admin 证书和私钥
1
2
3
4
5
6
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin

#生成如下文件
ls admin*

admin.csr admin-csr.json admin-key.pem admin.pem

创建 kube-proxy 证书

  • 1.创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cat >kube-proxy-csr.json<<EOF
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
  • 2.生成 kube-proxy 客户端证书和私钥
1
2
3
4
5
6
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes  kube-proxy-csr.json | cfssljson -bare kube-proxy

#生成如下文件
ls kube-proxy*

kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem

校验证书

使用 cfssl-certinfo 命令

1
cfssl-certinfo -cert kubernetes.pem

分发证书

将生成的证书和秘钥文件(后缀名为.pem)拷贝到所有机器的 /etc/kubernetes/ssl 目录下备用;

生成的所有pem文件

1
admin-key.pem  admin.pem  ca-key.pem  ca.pem  kube-proxy-key.pem  kube-proxy.pem  kubernetes-key.pem  kubernetes.pem
1
2
mkdir -p /etc/kubernetes/ssl
cp *.pem /etc/kubernetes/ssl

Mosh 使用教程

Mosh(mobile shell)

什么是Mosh

Mosh表示移动Shell(Mobile Shell),是一个用于从客户端跨互联网连接远程服务器的命令行工具。它能用于SSH连接,但是比Secure Shell功能更多。它是一个类似于SSH而带有更多功能的应用。程序最初由Keith Winstein 编写,用于类Unix的操作系统中,发布于GNU GPL V3协议下。

Mosh最大的特点是基于UDP方式传输,支持在服务端创建一个临时的Key供客户端一次性连接,退出后失效;也支持通过SSH的配置进行认证,但数据传输本身还是自身的UDP方式。

另外,Mosh还有两个我觉得非常有用的功能

  • 会话的中断不会导致当前正在前端执行的命令中断,相当于你所有的操作都是在screen命令中一样在后台执行。
  • 会话在中断过后,不会立刻退出,而是启用一个计时器,当网络恢复后会自动重新连接,同时会延续之前的会话,不会重新开启一个。

Mosh的功能

  • 它是一个支持漫游的远程终端程序
  • 在所有主流的类 Unix 版本中可用,如 Linux、FreeBSD、Solaris、Mac OS X和Android
  • 支持不稳定连接
  • 支持智能的本地回显
  • 支持用户输入的行编辑
  • 响应式设计及在 wifi、3G、长距离连接下的鲁棒性
  • 在IP改变后保持连接。它使用UDP代替TCP(在SSH中使用),当连接被重置或者获得新的IP后TCP会超时,但是UDP仍然保持连接
  • 在很长的时候之后恢复会话时仍然保持连接
  • 没有网络延迟。立即显示用户输入和删除而没有延迟
  • 像SSH那样支持一些旧的方式登录
  • 包丢失处理机制

Mosh安装配置

CentOS中安装Mosh

1
2
3
yum install -y epel-release
yum update
yum install mosh

检查Mosh的版本

1
2
$ mosh --version
mosh 1.3.0 [build mosh 1.3.0]

开启防火墙端口

1
2
3
firewall-cmd --permanent --zone=public --query-port=60000-60010/udp
firewall-cmd --permanent --zone=public --add-port=60000-60010/udp
firewall-cmd --permanent --zone=public --remove-port=60000-60010/udp
1
2
3
mosh-server new -i 你的IP -p 60000:60010 

mosh-server new -c 256 -s -l LANG=zh_CN.UTF-8 -l LC_CTYPE=zh_CN.UTF-8

macOS中安装

1
brew install mosh

总结

Mosh是一款在大多数linux发行版的仓库中可以下载的一款小工具。虽然它有一些差异尤其是安全问题和额外的需求,它的功能,比如漫游后保持连接是一个加分点。我的建议是任何一个使用SSH的Linux用户都应该试试这个程序,Mosh值得一试。

Mosh的优缺点

  • Mosh有额外的需求,比如需要允许UDP 直接连接,这在SSH不需要。
  • 动态分配的端口范围是60000-61000。第一个打开的端口是分配好的。每个连接都需要一个端口。
  • 默认的端口分配是一个严重的安全问题,尤其是在生产环境中。
  • 支持IPv6连接,但是不支持IPv6漫游。
  • 不支持回滚。
  • 不支持X11转发。
  • 不支持ssh-agent转发。
1
2
3
4
5
6
7
mosh --ssh="ssh -i ~/keys/linode_vps_web01_ed" IP

MOSH_KEY=L08BKzyxNvJDm0P4X8nUWQ mosh-client IP 60001

mosh -ssh='ssh -vvv -i ~/keys/linode_vps_web01_ed' user@IP

ssh -i ~/keys/linode_vps_web01_ed user@IP -p 2345

参考

https://mosh.mit.edu/
http://heylinux.com/archives/2955.html
http://blog.szrf215.com/p/4b16d7c218db

使用Mosh来优化SSH连接

理解php-fpm的两种执行方式

理解php-fpm的两种执行方式

前段时间配置php-fpm的时候,无意间发现原来他还有两种执行方式。与Apache一样,他的进程数也是可以根据设置分为动态和静态的。关于Apache的工作方式及对应的设置方法,我已经在《Ubuntu下配置Apache的Worker模式》一文中写出,这里不再多说。

而php-fpm也是同样存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少;另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限。

这两种不同的执行方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数吧,他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。

pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件给出的说明了。

下面4个参数的意思分别为:

pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。
如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程。

如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,我们运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。所以,动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。

然后对于比较大内存的服务器来说,设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到。比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。

本博客建立在512M的VPS上,因此我设置的参数如下:

pm=dynamic
pm.max_children=20
pm.start_servers=5
pm.min_spare_servers=5
pm.max_spare_servers=20
这样就可以最大的节省内存并提高执行效率。

,