0%

kubernetes通过TLS安全访问

外部访问k8s里的服务,都是直接以http方式进行的,缺少TLS安全

生成并信任自签名证书

首先这里生成自签名的服务器证书,官方介绍了easyrsa, openssl 、 cfssl三个工具,这里使用cfssl

安装CFSSL

直接使用二进制源码包安装

1
2
3
4
5
6
7
8
9
10
11
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
chmod +x cfssl_linux-amd64
mv cfssl_linux-amd64 /usr/sbin/cfssl

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssljson_linux-amd64
mv cfssljson_linux-amd64 /usr/sbin/cfssljson

wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl-certinfo_linux-amd64
mv cfssl-certinfo_linux-amd64 /usr/sbin/cfssl-certinfo

生成默认配置文件

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

生成自定义的config.json文件

1
cp config.json ca-config.json

生成ca和server的证书请求json文件

1
2
cp csr.json ca-csr.json
cp csr.json server-csr.json

编辑ca-config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"k8s-local": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}

编辑ca-csr.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"CN": "k8s-local",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "GuangDong",
"L": "Shenzhen",
"O": "my self signed certificate",
"OU": "self signed"
}
]
}

编辑server-csr.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"CN": "k8s.local",
"hosts": [
"127.0.0.1",
"*.k8s.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "GuangDong",
"L": "Shenzhen",
"O": "my self signed certificate",
"OU": "self signed"
}
]
}

生成CA证书及服务器证书

1
2
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem --config=ca-config.json -profile=k8s-local server-csr.json | cfssljson -bare server

得到ca.pem,server-key.pem,server.pem三个证书文件,其中ca.pem是ca的证书,server-key.pem是服务器证书的密钥,server.pem是服务器证书。

在k8s里使用自签名证书

创建默认的tls secret

1
kubectl -n kube-system create secret tls default-tls-cert --key=server-key.pem --cert=server.pem