目录
一、CA证书
CA证书中包含密钥对 (rsa 非对称密钥)
CA证书可以对通信加密,同时标识身份的唯一性
.pem :证书
二、制作K8S集群证书流程
1.制作官方颁发的证书
① 创建ca密钥(文件定义) ca-key.pem
② 创建ca证书(文件定义) ca.pem
2.制作master端的证书
用于内部加密通讯,同时为了给与Client端颁发master签名的证书
①创建过程:需要以下几步
1)设置私钥 确保安全加密 .pem
2)私钥签名 确保身份真实 .csr
3)制作证书(需要CA官方颁发) cert.pem
② 创建私钥
③ 私钥签名
④ 使用ca证书与密钥证书签名
3.制作worker node端证书
① 由master端制作node端密钥
② 对node端的证书进行签名
③ 创建一个配置文件(区别于服务端,进行客户端验证)
④ 生成证书
CA 证书机构 (签发电子证书)
在 Kubernetes 的组件之间进行通信时,数字证书的验证是在协议层面通过 TLS 完成的,除了需要在建立通信时提供相关的证书和密钥外,在应用层面并不需要进行特殊处理。
采用 TLS 进行验证有两种方式:
(1)服务器单向认证
只需要服务器端提供证书,客户端通过服务器端证书验证服务的身份,但服务器并不验证客户端的身份。这种情况一般适用于对Internet开放的服务,例如搜索引擎网站,任何客户端都可以连接到服务器上进行访问,但客户端需要验证服务器的身份,以避免连接到伪造的恶意服务器。
(3)双向 TLS 认证
除了客户端需要验证服务器的证书,服务器也要通过客户端证书验证客户端的身份。这种情况下服务器提供的是敏感信息,只允许特定身份的客户端访问。在Kubernetes中,各个组件提供的接口中包含了集群的内部信息。如果这些接口被非法访问,将影响集群的安全,因此组件之间的通信需要采用双向TLS认证。即客户端和服务器端都需要验证对方的身份信息。在两个组件进行双向认证时,会涉及到下面这些证书相关的文件:
① 服务器端证书:服务器用于证明自身身份的数字证书,里面主要包含了服务器端的公钥以及服务器的身份信息。
② 服务器端私钥:服务器端证书中包含的公钥所对应的私钥。公钥和私钥是成对使用的,在进行TLS验证时,服务器使用该私钥来向客户端
证明自己是服务器端证书的拥有者
③ 客户端证书:客户端用于证明自身身份的数字证书,里面主要包含了客户端的公钥以及客户端的身份信息。
④ 客户端私钥:客户端证书中包含的公钥所对应的私钥,同理,客户端使用该私钥来向服务器端证明自己是客户端证书的拥有者。
⑤ 服务器端 CA 根证书:签发服务器端证书的 CA 根证书,客户端使用该 CA 根证书来验证服务器端证书的合法性。
⑥ 客户端端 CA 根证书:签发客户端证书的 CA 根证书,服务器端使用该 CA 根证书来验证客户端证书的合法性。
三、K8S 二进制集群
k8s 默认有三种部署方式:Minikube 、kubeadm、 二进制 →工具部署/云平台部署
1.分类
1)ETCD集群
2)FLANNEL网络
3)单master部署
4)node部署
5)多master署(LB部署haproxy + keepalived 或者nginx + keepalived )
2.节点分配
负载均衡(lb)
nginx01 主机ip/24
nginx02 主机ip/24
master节点
master01 主机ip/24
master02 主机ip/24
Node节点
node01 主机ip/24
node02 主机ip/24
四、ETCD集群
1.环境
官网源码包下载:https://github.com/kubernetes/kubernetes/releases?after=v1.13.1
ETCD 二进制包地址:https://github.com/etcd-io/etcd/releases
2. K8S
Master:192.168.22.228/24 kube-apiserver kube-controller-manager kube-scheduler etcd
Node01:192.168.22.168/24 kubelet kube-proxy docker flannel etcd
Node02:192.168.22.206/24 kubelet kube-proxy docker flannel etcd
3.docker
yum install -y yum-utils device-mapper-persistent-data lvm2
cd /etc/yum.repos.d/
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
systemctl start docker
systemctl enable docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://jqqwsp8f.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p
systemctl restart network
systemctl restart docker
swapoff -a
4.ETCD集群
master节点操作
(1)定义两个脚本
mkdir k8s
cd k8s
etcd-cert.sh 是证书制作的脚本
etcd.sh etcd启动脚本
cat etcd-cert.sh
cat > ca-config.json <<EOF CA证书配置文件
{
"signing": { 键名称
"default": {
"expiry": "87600h" 证书有效期(10年)→证书默认时间是一年,1年K8S做了更新,把证书续一年
},
"profiles": { 简介
"www": { 名称
"expiry": "87600h",
"usages": [ 使用方法
"signing", 键
"key encipherment", 密钥验证(密钥验证要设置在CA证书中)
"server auth", 服务器端验证
"client auth" 客户端验证
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF CA签名文件
{
"CN": "etcd CA", CA签名为etcd指定(三个节点均需要)
"key": {
"algo": "rsa", 使用rsa非对称密钥的形式
"size": 2048 密钥长度为2048
},
"names": [ 在证书中定义信息(标准格式)
{
"C": "CN", 名称
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cat > server-csr.json <<EOF 服务器端的签名
{
"CN": "etcd",
"hosts": [ 定义三个节点的IP地址
"192.168.22.228",
"192.168.22.168",
"192.168.22.206"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
cfssl 为证书制作工具
(2)查看etcd 启动脚本
cat etcd.sh
#!/bin/bash
以下为使用格式:etcd名称 当前etcd的IP地址+完整的集群名称和地址
# example: ./etcd.sh etcd01 192.168.1.10 etcd02=https://192.168.1.11:2380,etcd03=https://192.168.1.12:2380
ETCD_NAME=$1 位置变量1:etcd节点名称
ETCD_IP=$2 位置变量2:节点地址
ETCD_CLUSTER=$3 位置变量3:集群
WORK_DIR=/opt/etcd 指定工作目录(一定要写绝对路径)
cat <<EOF >$WORK_DIR/cfg/etcd 在指定工作目录创建ETCD的配置文件
#[Member]
ETCD_NAME="${ETCD_NAME}" etcd名称
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380" etcd IP地址:2380端口。用于集群之间通讯
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379" etcd IP地址:2379端口,用于开放给外部客户端通讯
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379" 对外提供的url使用https的协议进行访问
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}" 多路访问
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" tokens 令牌环名称:etcd-cluster
ETCD_INITIAL_CLUSTER_STATE="new" 状态,重新创建
EOF
cat <<EOF >/usr/lib/systemd/system/etcd.service 定义ectd的启动脚本
[Unit] 基本项
Description=Etcd Server 类似为 etcd 服务
After=network.target
After=network-online.target
Wants=network-online.target
[Service] 服务项
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd etcd文件位置
ExecStart=${WORK_DIR}/bin/etcd \ 准启动状态及以下的参数
--name=\${ETCD_NAME} \
--data-dir=\${ETCD_DATA_DIR} \
--listen-peer-urls=\${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=\${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=\${ETCD_ADVERTISE_CLIENT_URLS} \ #以下为群集内部的设定
--initial-advertise-peer-urls=\${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=\${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=\${ETCD_INITIAL_CLUSTER_TOKEN} \ 群集内部通信,也是使用的令牌,为了保证安全(防范中间人窃取)
--initial-cluster-state=new \
--cert-file=${WORK_DIR}/ssl/server.pem \ 证书相关参数
--key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536 开放最多的端口号
[Install]
WantedBy=multi-user.target 进行启动
EOF
systemctl daemon-reload 参数重载
systemctl enable etcd
systemctl restart etcd
(3)创建ca证书
首先,创建证书目录,复制k8s目录下的证书创建脚本
mkdir etcd-cert
mv etcd-cert.sh etcd-cert
ls etcd-cert
(4)创建cfssl类型工具下载脚本
先从官网源中制作证书的工具下载下来
cat cfssl.sh
先从官网源中制作证书的工具下载下来,(-o:导出)放在/usr/local/bin中便于系统识别
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
从另一个站点源中下载cfssljson工具,用于识别json配置文件格式
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
下载cfssl-certinfo工具
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
给与权限
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
bash cfssl.sh
cd /usr/local/bin
chmod +x *
返回etcd-cert目录
pwd
定义ca证书
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
定义证书签名文件
cat > ca-csr.json <<EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
生成证书,生成ca-key.pem 和ca.pem
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
指定etcd三个节点之间的通信验证使用的证书
etcd节点服务端的签名文件
cat > server-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"192.168.22.228",
"192.168.22.168",
"192.168.22.206"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
根据服务端签名文件生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
以上签名文件制作完毕
node节点制作
将etcd、flannel、k8s集群配置文件上传
创建配置文件,命令文件,证书
mkdir /opt/etcd/{cfg,bin,ssl} -p
拷贝命令文件至相应目录
mv etcd-v3.3.10-linux-amd64/etcd etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/
拷贝证书文件至相应目录
cp etcd-cert/*.pem /opt/etcd/ssl/
进入卡住状态等待其他节点加入
bash etcd.sh etcd01 192.168.22.228 etcd02=https://192.168.22.168:2380,etcd03=https://192.168.22.206:2380
使用另外一个会话打开,会发现etcd进程已经开启
ps -ef | grep etcd
拷贝证书去其他节点
scp -r /opt/etcd/ [email protected]:/opt/
scp -r /opt/etcd/ [email protected]:/opt
启动脚本拷贝其他节点
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service [email protected]:/usr/lib/systemd/system/
修改node节点
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.22.168:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.22.168:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.22.168:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.22.168:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.22.228:2380,etcd02=https://192.168.22.168:2380,etcd03=https://192.168.22.206:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
启动
systemctl start etcd
systemctl status etcd
检查群集状态
cd /root/k8s/etcd-cert
/opt/etcd/bin/etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem --endpoints="https://192.168.22.:2379,https://192.168.22.:2379,https://192.168.22.:2379" cluster-health