CA证书与ETCD集群

目录

一、CA证书

二、制作K8S集群证书流程

1.制作官方颁发的证书

2.制作master端的证书

3.制作worker node端证书

(1)服务器单向认证

(3)双向 TLS 认证

三、K8S 二进制集群

1.分类

2.节点分配

四、ETCD集群

1.环境

2. K8S

3.docker

4.ETCD集群

master节点操作

(1)定义两个脚本

(2)查看etcd 启动脚本 

(3)创建ca证书

(4)创建cfssl类型工具下载脚本

node节点制作


一、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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/Drw_Dcm/article/details/127623413