一、集群部署-自签TLS证书
如果不需要加密或者可以官方授权跳过

1.1、下载安装证书工具
[root@10.21.214.221 k8s]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 [root@10.21.214.221 k8s]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 [root@10.21.214.221 k8s]# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 [root@10.21.214.221 ssl]# chmod +x cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64 [root@10.21.214.221 ssl]# mv cfssl_linux-amd64 /usr/local/bin/cfssl [root@10.21.214.221 ssl]# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson [root@10.21.214.221 ssl]# mv cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
1.2、配置证书
生成模板
[root@10.21.214.221 ssl]# cfssl print-defaults config > config.json
[root@10.21.214.221 ssl]# cat config.json
{
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
还有其他:
cfssl print-defaults csr > csr.json
----最后的配置文件----
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
[root@10.21.214.221 ssl]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
2021/03/16 11:36:32 [INFO] generating a new CA key and certificate from CSR
2021/03/16 11:36:32 [INFO] generate received request
2021/03/16 11:36:32 [INFO] received CSR
2021/03/16 11:36:32 [INFO] generating key: rsa-2048
2021/03/16 11:36:33 [INFO] encoded CSR
2021/03/16 11:36:33 [INFO] signed certificate with serial number 301433857907773217345135087080053284990504896374
[root@10.21.214.221 ssl]# ls *.pem
ca-key.pem ca.pem
[root@10.21.214.221 ssl]# cat > server-csr.json << EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"10.21.214.221",
"10.21.214.222",
"10.21.214.223",
"kubernetes,default",
"kubernetes,default.svc",
"kubernetes,default.svc.cluster",
"kubernetes,default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
[root@10.21.214.221 ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
2021/03/16 11:53:06 [INFO] generate received request
2021/03/16 11:53:06 [INFO] received CSR
2021/03/16 11:53:06 [INFO] generating key: rsa-2048
2021/03/16 11:53:07 [INFO] encoded CSR
2021/03/16 11:53:07 [INFO] signed certificate with serial number 599275410242837538787517552477543824480371693634
2021/03/16 11:53:07 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
[root@10.21.214.221 ssl]# ls server*
server.csr server-csr.json server-key.pem server.pem
[root@10.21.214.221 ssl]# cat > admin-csr.json << EOF
> {
> "CN": "admin",
> "hosts": [],
> "key": {
> "algo": "rsa",
> "size": 2048
> },
> "names": [
> {
> "C": "CN",
> "L": "Beijing",
> "ST": "Beijing",
> "O": "k8s",
> "OU": "System"
> }
> ]
> }
> EOF
[root@10.21.214.221 ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
2021/03/16 12:06:52 [INFO] generate received request
2021/03/16 12:06:52 [INFO] received CSR
2021/03/16 12:06:52 [INFO] generating key: rsa-2048
2021/03/16 12:06:52 [INFO] encoded CSR
2021/03/16 12:06:52 [INFO] signed certificate with serial number 461167282503270603738318847609163072447275940030
2021/03/16 12:06:52 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
[root@10.21.214.221 ssl]# cat > kube-proxy-csr.json << EOF
> {
> "CN": "system:kube-proxy",
> "hosts": [],
> "key": {
> "algo": "rsa",
> "size": 2048
> },
> "names": [
> {
> "C": "CN",
> "L": "Beijing",
> "ST": "Beijing",
> "O": "k8s",
> "OU": "System"
> }
> ]
> }
> EOF
[root@10.21.214.221 ssl]#
[root@10.21.214.221 ssl]#
[root@10.21.214.221 ssl]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
2021/03/16 12:09:31 [INFO] generate received request
2021/03/16 12:09:31 [INFO] received CSR
2021/03/16 12:09:31 [INFO] generating key: rsa-2048
2021/03/16 12:09:31 [INFO] encoded CSR
2021/03/16 12:09:31 [INFO] signed certificate with serial number 115085029732711433734601571021110964190336344379
2021/03/16 12:09:31 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
websites. For more information see the Baseline Requirements for the Issuance and Management
of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
specifically, section 10.2.3 ("Information Requirements").
[root@10.21.214.221 ssl]# ls kube-proxy*
kube-proxy.csr kube-proxy-csr.json kube-proxy-key.pem kube-proxy.pem
所有的证书:
[root@10.21.214.221 ssl]# ls *pem
admin-key.pem admin.pem ca-key.pem ca.pem kube-proxy-key.pem kube-proxy.pem server-key.pem server.pem
##删除除了证书之外的文件
[root@10.21.214.221 ssl]#ls | grep -v pem | xargs -i rm {}
1.3、下载etcd,并添加systemctl启动
curl -L https://github.com/etcd-io/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz
tar -xf etcd-v3.2.12-linux-amd64.tar.gz
[root@10.21.214.221 k8s]# mkdir {bin,cfg}
[root@10.21.214.221 k8s]# ls
bin cfg etcd-v3.2.12-linux-amd64 etcd-v3.2.12-linux-amd64.tar.gz ssl
[root@10.21.214.221 k8s]# mv etcd-v3.2.12-linux-amd64/etcd bin/
[root@10.21.214.221 k8s]# mv etcd-v3.2.12-linux-amd64/etcdctl bin/
[root@10.21.214.221 k8s]# ./bin/etcd --version
etcd Version: 3.2.12
Git SHA: b19dae0
Go Version: go1.8.5
Go OS/Arch: linux/amd64
##添加systemctl启动,如果需要,则不需要做下面的步奏
[root@10.21.214.221 k8s]# vim cfg/etcd
#[Member]
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://10.21.214.221:2380"
ETCD_LISTEN_CLIENT_URLS="https://10.21.214.221:2379"
#[clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.21.214.221:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.21.214.221:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://10.21.214.221:2380,etcd02=https://10.21.214.222:2380,etcd03=https://10.21.214.223:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
[root@10.21.214.221 k8s]# vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=-/data/kubernetes/cfg/etcd
ExecStart=/data/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
--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=${ETCD_INITIAL_CLUSTER_STATE} \
--cert-file=/data/kubernetes/ssl/server.pem \
--key-file=/data/kubernetes/ssl/server-key.pem \
--peer-cert-file=/data/kubernetes/ssl/server.pem \
--peer-key-file=/data/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/data/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/data/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536
[root@10.21.214.221 kubernetes]# systemctl start etcd
1.4、复制etcd配置到两台node节点
master
[root@10.21.214.221 kubernetes]# ssh-keygen [root@10.21.214.221 kubernetes]# ssh-copy-id root@10.21.213.222 -p1022 [root@10.21.214.221 kubernetes]# ssh-copy-id root@10.21.213.223 -p1022
node01,node02执行
[root@10.21.214.222 ~]# mkdir -p /data/kubernetes/{bin,cfg,ssl}
master执行
[root@10.21.214.221 kubernetes]# scp -r -P1022 bin/ root@10.21.214.222:/data/kubernetes/ etcd 100% 17MB 62.9MB/s 00:00 etcdctl 100% 15MB 116.9MB/s 00:00 [root@10.21.214.221 kubernetes]# scp -r -P1022 . root@10.21.214.223:/data/kubernetes/ [root@10.21.214.221 kubernetes]# scp -r -P1022 /usr/lib/systemd/system/etcd.service root@10.21.214.222:/usr/lib/systemd/system/ etcd.service 100% 976 1.2MB/s 00:00 [root@10.21.214.221 kubernetes]# scp -r -P1022 /usr/lib/systemd/system/etcd.service root@10.21.214.223:/usr/lib/systemd/system/
node01,node02修改配置文件,然后启动
node01 [root@10.21.214.222 kubernetes]# vim cfg/etcd #[Member] ETCD_NAME="etcd02" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://10.21.214.222:2380" ETCD_LISTEN_CLIENT_URLS="https://10.21.214.222:2379" #[clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.21.214.222:2380" ETCD_ADVERTISE_CLIENT_URLS="https://10.21.214.222:2379" ETCD_INITIAL_CLUSTER="etcd01=https://10.21.214.221:2380,etcd02=https://10.21.214.222:2380,etcd03=https://10.21.214.223:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" [root@10.21.214.222 kubernetes]# systemctl start etcd ----- node02 [root@10.21.214.223 kubernetes]# vim cfg/etcd #[Member] ETCD_NAME="etcd03" ETCD_DATA_DIR="/var/lib/etcd/default.etcd" ETCD_LISTEN_PEER_URLS="https://10.21.214.223:2380" ETCD_LISTEN_CLIENT_URLS="https://10.21.214.223:2379" #[clustering] ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.21.214.223:2380" ETCD_ADVERTISE_CLIENT_URLS="https://10.21.214.223:2379" ETCD_INITIAL_CLUSTER="etcd01=https://10.21.214.221:2380,etcd02=https://10.21.214.222:2380,etcd03=https://10.21.214.223:2380" ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" ETCD_INITIAL_CLUSTER_STATE="new" [root@10.21.214.223 kubernetes]# systemctl start etcd
1.5、检查集群有没有问题
如果想添加etcd的快捷方式,执行下面命令
[root@10.21.214.221 kubernetes]# echo 'PATH=$PATH:/data/kubernetes/bin' >> /etc/profile [root@10.21.214.221 kubernetes]# source /etc/profile
执行命令检查健康
[root@10.21.214.221 kubernetes]# cd ssl/ [root@10.21.214.221 ssl]# et etcd etcdctl ether-wake ethtool [root@10.21.214.221 ssl]# etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem \ --endpoints="https://10.21.214.221:2379,https://10.21.214.222:2379,https://10.21.214.223:2379" \ cluster-health member 44bde3d6451bac47 is healthy: got healthy result from https://10.21.214.221:2379 member 6ae548213a7994ac is healthy: got healthy result from https://10.21.214.223:2379 member f4c8b14eec6eba9b is healthy: got healthy result from https://10.21.214.222:2379


[root@10.21.214.221 kubernetes]# cd ssl/
[root@10.21.214.221 ssl]# et
etcd etcdctl ether-wake ethtool
[root@10.21.214.221 ssl]# etcdctl --ca-file=ca.pem --cert-file=server.pem --key-file=server-key.pem \
--endpoints="https://10.21.214.221:2379,https://10.21.214.222:2379,https://10.21.214.223:2379" \
cluster-health
member 44bde3d6451bac47 is healthy: got healthy result from https://10.21.214.221:2379
member 6ae548213a7994ac is healthy: got healthy result from https://10.21.214.223:2379
member f4c8b14eec6eba9b is healthy: got healthy result from https://10.21.214.222:2379