1. 常見(jiàn)的K8S安裝部署方式
1.1 Minikube
Minikube是一個(gè)工具,可以在本地快速運(yùn)行一個(gè)單節(jié)點(diǎn)微型K8S,僅用于學(xué)習(xí)、預(yù)覽K8S的一些特性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
1.2 Kubeadm
Kubeadm也是一個(gè)工具,提供kubeadm init和kubeadm join,用于快速部署K8S集群,相對(duì)簡(jiǎn)單。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
1.3 二進(jìn)制安裝部署
生產(chǎn)首選,從官方下載發(fā)行版的二進(jìn)制包,手動(dòng)部署每個(gè)組件和自簽TLS證書(shū),組成K8S集群,新手推薦。
https://github.com/kubernetes/kubernetes/releases
2. Kubernetes單master集群架構(gòu) ---- (二進(jìn)制安裝部署)
2.1 前置準(zhǔn)備
master01 192.168.67.102
node01 192.168.67.103
node02 192.168.67.104
2.2 操作系統(tǒng)初始化
#關(guān)閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
#關(guān)閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#關(guān)閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
#根據(jù)規(guī)劃設(shè)置主機(jī)名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#添加hosts
cat >> /etc/hosts << EOF
192.168.67.102 master01
192.168.67.103 node01
192.168.67.104 node02
EOF
#調(diào)整內(nèi)核參數(shù)
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system
#全局加載
yum install ntpdate -y
ntpdate time.windows.com
#與windows進(jìn)行時(shí)間同步
2.3 部署 docker引擎 ---- (所有 node 節(jié)點(diǎn))
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
#創(chuàng)建配置文件
mkdir /etc/docker
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://r5uulkvq.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m", "max-file": "3"
}
}
使用Systemd管理的Cgroup來(lái)進(jìn)行資源控制與管理,因?yàn)橄鄬?duì)Cgroupfs而言,Systemd限制CPU、內(nèi)存等資源更加簡(jiǎn)單和成熟穩(wěn)定。
#日志使用json-file格式類型存儲(chǔ),大小為100M,保存在/var/log/containers目錄下,方便ELK等日志系統(tǒng)收集和管理日志。
systemctl start docker.service
systemctl enable docker.service
2.4 部署 etcd 集群
- 使用cfssl工具簽發(fā)證書(shū)和私鑰
- 解壓etcd軟件包,獲取二進(jìn)制文件 etcd etcdctl
- 準(zhǔn)備etcd集群配置文件
- 啟動(dòng)etcd服務(wù)進(jìn)程,加入到etcd集群
2.4.1 etcd的特點(diǎn)
etcd 作為服務(wù)發(fā)現(xiàn)系統(tǒng),有以下的特點(diǎn):
- 簡(jiǎn)單:安裝配置簡(jiǎn)單,而且提供了
HTTP API
進(jìn)行交互,使用也很簡(jiǎn)單 - 安全:支持
SSL證書(shū)
驗(yàn)證 - 快速:?jiǎn)螌?shí)例支持每秒2k+讀操作
- 可靠:采用
raft算法
,實(shí)現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性
etcd 目前默認(rèn)使用2379端口提供HTTP API服務(wù), 2380端口和peer通信(這兩個(gè)端口已經(jīng)被IANA(互聯(lián)網(wǎng)數(shù)字分配機(jī)構(gòu))官方預(yù)留給etcd)。 即etcd默認(rèn)使用2379端口對(duì)外為客戶端提供通訊,使用端口2380來(lái)進(jìn)行服務(wù)器間內(nèi)部通訊。
etcd 在生產(chǎn)環(huán)境中一般推薦集群方式部署。由于etcd 的leader選舉機(jī)制,要求至少為3臺(tái)或以上的奇數(shù)臺(tái)。
2.4.2 準(zhǔn)備簽發(fā)證書(shū)環(huán)境
- CFSSL 是 CloudFlare 公司開(kāi)源的一款 PKI/TLS 工具。 CFSSL 包含一個(gè)命令行工具和一個(gè)用于簽名、驗(yàn)證和捆綁 TLS 證書(shū)的 HTTP API 服務(wù)。使用Go語(yǔ)言編寫(xiě)。
- CFSSL 使用配置文件生成證書(shū),因此自簽之前,需要生成它識(shí)別的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
- CFSSL 用來(lái)為 etcd 提供 TLS 證書(shū),它支持簽三種類型的證書(shū):
1、client 證書(shū),服務(wù)端連接客戶端時(shí)攜帶的證書(shū),用于客戶端驗(yàn)證服務(wù)端身份,如 kube-apiserver 訪問(wèn) etcd;
2、server 證書(shū),客戶端連接服務(wù)端時(shí)攜帶的證書(shū),用于服務(wù)端驗(yàn)證客戶端身份,如 etcd 對(duì)外提供服務(wù);
3、peer 證書(shū),相互之間連接時(shí)使用的證書(shū),如 etcd 節(jié)點(diǎn)之間進(jìn)行驗(yàn)證和通信。
這里全部都使用同一套證書(shū)認(rèn)證。
2.4.3 在 master01 節(jié)點(diǎn)上操作
### 生成Etcd證書(shū) ###
mkdir /opt/k8s
#創(chuàng)建工作目錄
cd /opt/k8s
#創(chuàng)建配置文件腳本
vim etcd.sh
#!/bin/bash
#example: ./etcd.sh etcd01 192.168.67.102 etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380
#創(chuàng)建etcd配置文件/opt/etcd/cfg/etcd
ETCD_NAME=$1
ETCD_IP=$2
ETCD_CLUSTER=$3
WORK_DIR=/opt/etcd
cat > $WORK_DIR/cfg/etcd <<EOF
#[Member]
ETCD_NAME="${ETCD_NAME}"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_LISTEN_CLIENT_URLS="https://${ETCD_IP}:2379"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://${ETCD_IP}:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://${ETCD_IP}:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://${ETCD_IP}:2380,${ETCD_CLUSTER}"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
#Member:成員配置
#ETCD_NAME:節(jié)點(diǎn)名稱,集群中唯一。成員名字,集群中必須具備唯一性,如etcd01
#ETCD_DATA_DIR:數(shù)據(jù)目錄。指定節(jié)點(diǎn)的數(shù)據(jù)存儲(chǔ)目錄,這些數(shù)據(jù)包括節(jié)點(diǎn)ID,集群ID,集群初始化配置,Snapshot文件,若未指定-wal-dir,還會(huì)存儲(chǔ)WAL文件;如果不指定會(huì)用缺省目錄
#ETCD_LISTEN_PEER_URLS:集群通信監(jiān)聽(tīng)地址。用于監(jiān)聽(tīng)其他member發(fā)送信息的地址。ip為全0代表監(jiān)聽(tīng)本機(jī)所有接口
#ETCD_LISTEN_CLIENT_URLS:客戶端訪問(wèn)監(jiān)聽(tīng)地址。用于監(jiān)聽(tīng)etcd客戶發(fā)送信息的地址。ip為全0代表監(jiān)聽(tīng)本機(jī)所有接口
#Clustering:集群配置
#ETCD_INITIAL_ADVERTISE_PEER_URLS:集群通告地址。其他member使用,其他member通過(guò)該地址與本member交互信息。一定要保證從其他member能可訪問(wèn)該地址。靜態(tài)配置方式下,該參數(shù)的value一定要同時(shí)在--initial-cluster參數(shù)中存在
#ETCD_ADVERTISE_CLIENT_URLS:客戶端通告地址。etcd客戶端使用,客戶端通過(guò)該地址與本member交互信息。一定要保證從客戶側(cè)能可訪問(wèn)該地址
#ETCD_INITIAL_CLUSTER:集群節(jié)點(diǎn)地址。本member使用。描述集群中所有節(jié)點(diǎn)的信息,本member根據(jù)此信息去聯(lián)系其他member
#ETCD_INITIAL_CLUSTER_TOKEN:集群Token。用于區(qū)分不同集群。本地如有多個(gè)集群要設(shè)為不同
#ETCD_INITIAL_CLUSTER_STATE:加入集群的當(dāng)前狀態(tài),new是新集群,existing表示加入已有集群。
#創(chuàng)建etcd.service服務(wù)管理文件
cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=${WORK_DIR}/cfg/etcd
ExecStart=${WORK_DIR}/bin/etcd \
--cert-file=${WORK_DIR}/ssl/server.pem \
--key-file=${WORK_DIR}/ssl/server-key.pem \
--trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--peer-cert-file=${WORK_DIR}/ssl/server.pem \
--peer-key-file=${WORK_DIR}/ssl/server-key.pem \
--peer-trusted-ca-file=${WORK_DIR}/ssl/ca.pem \
--logger=zap \
--enable-v2
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
#--enable-v2:開(kāi)啟 etcd v2 API 接口。當(dāng)前 flannel 版本不支持 etcd v3 通信
#--logger=zap:使用 zap 日志框架。zap.Logger 是go語(yǔ)言中相對(duì)日志庫(kù)中性能最高的
#--peer開(kāi)頭的配置項(xiàng)用于指定集群內(nèi)部TLS相關(guān)證書(shū)(peer 證書(shū)),這里全部都使用同一套證書(shū)認(rèn)證
#不帶--peer開(kāi)頭的的參數(shù)是指定 etcd 服務(wù)器TLS相關(guān)證書(shū)(server 證書(shū)),這里全部都使用同一套證書(shū)認(rèn)證
systemctl daemon-reload
systemctl enable etcd
systemctl restart etcd
#創(chuàng)建CA證書(shū)腳本
vim etcd-cert.sh
#!/bin/bash
#配置證書(shū)生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書(shū),生成用來(lái)簽發(fā)其他組件證書(shū)的根證書(shū)
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"www": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
#ca-config.json:可以定義多個(gè) profiles,分別指定不同的過(guò)期時(shí)間、使用場(chǎng)景等參數(shù);
#后續(xù)在簽名證書(shū)時(shí)會(huì)使用某個(gè) profile;此實(shí)例只有一個(gè) www 模板。
#expiry:指定了證書(shū)的有效期,87600h 為10年,如果用默認(rèn)值一年的話,證書(shū)到期后集群會(huì)立即宕掉
#signing:表示該證書(shū)可用于簽名其它證書(shū);生成的 ca.pem 證書(shū)中 CA=TRUE;
#key encipherment:表示使用非對(duì)稱密鑰加密,如 RSA 加密;
#server auth:表示client可以用該 CA 對(duì) server 提供的證書(shū)進(jìn)行驗(yàn)證;
#client auth:表示server可以用該 CA 對(duì) client 提供的證書(shū)進(jìn)行驗(yàn)證;
#注意標(biāo)點(diǎn)符號(hào),最后一個(gè)字段一般是沒(méi)有逗號(hào)的。
#-----------------------
#生成CA證書(shū)和私鑰(根證書(shū)和私鑰)
#特別說(shuō)明: cfssl和openssl有一些區(qū)別,openssl需要先生成私鑰,然后用私鑰生成請(qǐng)求文件,最后生成簽名的證書(shū)和私鑰等,但是cfssl可以直接得到請(qǐng)求文件。
cat > ca-csr.json <<EOF
{
"CN": "etcd",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
#CN:Common Name,瀏覽器使用該字段驗(yàn)證網(wǎng)站或機(jī)構(gòu)是否合法,一般寫(xiě)的是域名
#key:指定了加密算法,一般使用rsa(size:2048)
#C:Country,國(guó)家
#ST:State,州,省
#L:Locality,地區(qū),城市
#O: Organization Name,組織名稱,公司名稱
#OU: Organization Unit Name,組織單位名稱,公司部門(mén)
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
#生成的文件:
#ca-key.pem:根證書(shū)私鑰
#ca.pem:根證書(shū)
#ca.csr:根證書(shū)簽發(fā)請(qǐng)求文件
#cfssl gencert -initca <CSRJSON>:使用 CSRJSON 文件生成新的證書(shū)和私鑰。如果不添加管道符號(hào),會(huì)直接把所有證書(shū)內(nèi)容輸出到屏幕。
#注意:CSRJSON 文件用的是相對(duì)路徑,所以 cfssl 的時(shí)候需要 csr 文件的路徑下執(zhí)行,也可以指定為絕對(duì)路徑。
#cfssljson 將 cfssl 生成的證書(shū)(json格式)變?yōu)槲募休d式證書(shū),-bare 用于命名生成的證書(shū)文件。
#-----------------------
#生成 etcd 服務(wù)器證書(shū)和私鑰
cat > server-csr.json <<EOF
{
"CN": "etcd",
"hosts": [
"192.168.67.102",
"192.168.67.103",
"192.168.67.104"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
#hosts:將所有 etcd 集群節(jié)點(diǎn)添加到 host 列表,需要指定所有 etcd 集群的節(jié)點(diǎn) ip 或主機(jī)名不能使用網(wǎng)段,新增 etcd 服務(wù)器需要重新簽發(fā)證書(shū)。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server
#生成的文件:
#server.csr:服務(wù)器的證書(shū)請(qǐng)求文件
#server-key.pem:服務(wù)器的私鑰
#server.pem:服務(wù)器的數(shù)字簽名證書(shū)
#-config:引用證書(shū)生成策略文件 ca-config.json
#-profile:指定證書(shū)生成策略文件中的的使用場(chǎng)景,比如 ca-config.json 中的 www
chmod +x etcd-cert.sh etcd.sh
#添加執(zhí)行權(quán)限
cfssl:證書(shū)簽發(fā)的工具命令
cfssljson:將 cfssl 生成的證書(shū)(json格式)變?yōu)槲募休d式證書(shū)
cfssl-certinfo:驗(yàn)證證書(shū)的信息
cfssl-certinfo -cert <證書(shū)名稱> #查看證書(shū)的信息
cd /usr/local/bin
#準(zhǔn)備cfssl證書(shū)生成工具
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/local/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/local/bin/cfssljson
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl*
#添加執(zhí)行權(quán)限
#創(chuàng)建用于生成CA證書(shū)、etcd 服務(wù)器證書(shū)以及私鑰的目錄
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh #生成CA證書(shū)、etcd 服務(wù)器證書(shū)以及私鑰
ca.pem :CA證書(shū)
ca.key.pem:CA的私鑰文件
server.pem:服務(wù)端證書(shū)
server-key.pem:服務(wù)端私鑰文件
#上傳 etcd-v3.4.26-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動(dòng)etcd服務(wù)
cd /opt/k8s/
tar xf etcd-v3.4.26-linux-amd64.tar.gz
#解壓縮軟件包
#創(chuàng)建用于存放 etcd 配置文件,命令文件,證書(shū)的目錄
mkdir -p /opt/etcd/{cfg,bin,ssl}
cd /opt/k8s/etcd-v3.4.26-linux-amd64/
mv etcd etcdctl /opt/etcd/bin/
cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
cd /opt/k8s/
./etcd.sh etcd01 192.168.67.102 etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380
#進(jìn)入卡住狀態(tài)等待其他節(jié)點(diǎn)加入,這里需要三臺(tái)etcd服務(wù)同時(shí)啟動(dòng),如果只啟動(dòng)其中一臺(tái)后,服務(wù)會(huì)卡在那里,直到集群中所有etcd節(jié)點(diǎn)都已啟動(dòng),可忽略這個(gè)情況
#可另外打開(kāi)一個(gè)窗口查看etcd進(jìn)程是否正常
ps -ef | grep etcd
#把etcd相關(guān)證書(shū)文件、命令文件和服務(wù)管理文件全部拷貝到另外兩個(gè)etcd集群節(jié)點(diǎn)
scp -r /opt/etcd/ root@192.168.67.103:/opt/
scp -r /opt/etcd/ root@192.168.67.104:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.67.103:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.67.104:/usr/lib/systemd/system/
2.4.4 在 node01 節(jié)點(diǎn)上操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd02" #修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.67.103:2380" #修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.67.103:2379" #修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.67.103:2380" #修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.67.103:2379" #修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.67.102:2380,etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動(dòng)etcd服務(wù)
systemctl start etcd
systemctl enable etcd
systemctl status etcd
2.4.5 在 node02 節(jié)點(diǎn)上操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03" #修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.67.104:2380" #修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.67.104:2379" #修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.67.104:2380" #修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.67.104:2379" #修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.67.102:2380,etcd02=https://192.168.67.103:2380,etcd03=https://192.168.67.104:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動(dòng)etcd服務(wù)
systemctl start etcd
systemctl enable etcd
systemctl status etcd
#檢查etcd群集狀態(tài)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379" endpoint health --write-out=table
------------------------------------------------------------------------------------------
--cert-file:識(shí)別HTTPS端使用SSL證書(shū)文件
--key-file:使用此SSL密鑰文件標(biāo)識(shí)HTTPS客戶端
--ca-file:使用此CA證書(shū)驗(yàn)證啟用https的服務(wù)器的證書(shū)
--endpoints:集群中以逗號(hào)分隔的機(jī)器地址列表
--cluster-health:檢查etcd集群的運(yùn)行狀況
------------------------------------------------------------------------------------------
#查看etcd集群成員列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379" --write-out=table member list
#相關(guān)管理命令格式
#查看etcd集群健康狀態(tài)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 endpoint health -wtable
#查看etcd集群狀態(tài)信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379,https://etcd02IP:2379,https://etcd03IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 endpoint status -wtable
#查看etcd集群成員列表
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 member list -wtable
#備份etcd數(shù)據(jù)庫(kù)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot save 備份文件路徑
#恢復(fù)etcd數(shù)據(jù)庫(kù)
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot restore 文件路徑
#查看備份文件的狀態(tài)信息
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://etcd01IP:2379" --cacert=CA證書(shū) --cert=服務(wù)端證書(shū) --key=服務(wù)端私鑰 snapshot status 文件路徑
2.5 部署 Master 組件
- 使用cfssl工具簽發(fā)證書(shū)和私鑰
- 解壓K8S服務(wù)端軟件包,獲取二進(jìn)制文件
kube-apiserver
kube-controller-manager
kube-scheduler
kubect
- 準(zhǔn)備
kube-apiserver
啟動(dòng)時(shí)要調(diào)用的bootstrap-token
認(rèn)證文件 - 準(zhǔn)備
kube-apiserver
kube-controller-manager
kube-scheduler
的服務(wù)進(jìn)程啟動(dòng)參數(shù)配置文件 - 準(zhǔn)備
kube-controller-manager
kube-scheduler
kubectl
的kubeconfig
集群引導(dǎo)配置文件(加入K8S集群的引導(dǎo)文件) - 依次啟動(dòng)
kube-apiserver
kube-controller-manager
kube-scheduler
的服務(wù)進(jìn)程 - 執(zhí)行 kubectl get cs 命令查看master組件的健康狀態(tài)
2.5.1 在 master01 節(jié)點(diǎn)上操作
#上傳 master.zip 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
cd /opt/k8s/
unzip master.zip
chmod +x *.sh
#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
#創(chuàng)建用于生成CA證書(shū)、相關(guān)組件的證書(shū)和私鑰的目錄
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
vim k8s-cert.sh
#!/bin/bash
#配置證書(shū)生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書(shū),生成用來(lái)簽發(fā)其他組件證書(shū)的根證書(shū)
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h", #證書(shū)的有效時(shí)間
"usages": [ #使用場(chǎng)景
"signing", #簽發(fā)證書(shū)
"key encipherment", #密鑰
"server auth", #服務(wù)端事務(wù)
"client auth" #客戶端事務(wù)
]
}
}
}
}
EOF
#生成CA證書(shū)和私鑰(根證書(shū)和私鑰)
cat > ca-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
#-----------------------
#生成 apiserver 的證書(shū)和私鑰(apiserver和其它k8s組件通信使用)
#hosts中將所有可能作為 apiserver 的 ip 添加進(jìn)去,后面 keepalived 使用的 VIP 也要加入
cat > apiserver-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.67.102", #master01
"192.168.67.105", #master02
"192.168.67.200", #vip,后面 keepalived 使用
"192.168.67.100", #load balancer01(master)
"192.168.67.101", #load balancer02(backup)
"kubernetes",
"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
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver
#-----------------------
#生成 kubectl 連接集群的證書(shū)和私鑰(kubectl 和 apiserver 通信使用)
cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
#-----------------------
#生成 kube-proxy 的證書(shū)和私鑰(kube-proxy 和 apiserver 通信使用)
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
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
#記得刪注釋
chmod +x k8s-cert.sh
./k8s-cert.sh #生成CA證書(shū)、相關(guān)組件的證書(shū)和私鑰
#復(fù)制CA證書(shū)、apiserver相關(guān)證書(shū)和私鑰到 kubernetes工作目錄的 ssl 子目錄中
cp ca*pem apiserver*pem /opt/kubernetes/ssl/
#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
#復(fù)制master組件的關(guān)鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
cd /opt/k8s/kubernetes/server/bin
cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/
#制作軟連接
ln -s /opt/kubernetes/bin/* /usr/local/bin/
#創(chuàng)建 bootstrap token 認(rèn)證文件,apiserver 啟動(dòng)時(shí)會(huì)調(diào)用,然后就相當(dāng)于在集群內(nèi)創(chuàng)建了一個(gè)這個(gè)用戶,接下來(lái)就可以用 RBAC 給他授權(quán)
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機(jī)數(shù)前16個(gè)字節(jié)內(nèi)容,以十六進(jìn)制格式輸出,并刪除其中空格
BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
#生成 token.csv 文件,按照 Token序列號(hào),用戶名,UID,用戶組 的格式生成
cat > /opt/kubernetes/cfg/token.csv <<EOF
${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
EOF
chmod +x token.sh
./token.sh
cat /opt/kubernetes/cfg/token.csv
#二進(jìn)制文件、token、證書(shū)都準(zhǔn)備好后,開(kāi)啟 apiserver 服務(wù)
cd /opt/k8s/
vim apiserver.sh
#!/bin/bash
#example: apiserver.sh 192.168.67.102 https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379
#創(chuàng)建 kube-apiserver 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1
ETCD_SERVERS=$2
cat >/opt/kubernetes/cfg/kube-apiserver <<EOF
KUBE_APISERVER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--etcd-servers=${ETCD_SERVERS} \\
--bind-address=${MASTER_ADDRESS} \\
--secure-port=6443 \\
--advertise-address=${MASTER_ADDRESS} \\
--allow-privileged=true \\
--service-cluster-ip-range=10.0.0.0/24 \\
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\
--authorization-mode=RBAC,Node \\
--enable-bootstrap-token-auth=true \\
--token-auth-file=/opt/kubernetes/cfg/token.csv \\
--service-node-port-range=30000-50000 \\
--kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\
--kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\
--tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--service-account-issuer=api \\
--service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--etcd-cafile=/opt/etcd/ssl/ca.pem \\
--etcd-certfile=/opt/etcd/ssl/server.pem \\
--etcd-keyfile=/opt/etcd/ssl/server-key.pem \\
--requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\
--proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\
--proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\
--requestheader-allowed-names=kubernetes \\
--requestheader-extra-headers-prefix=X-Remote-Extra- \\
--requestheader-group-headers=X-Remote-Group \\
--requestheader-username-headers=X-Remote-User \\
--enable-aggregator-routing=true \\
--audit-log-maxage=30 \\
--audit-log-maxbackup=3 \\
--audit-log-maxsize=100 \\
--audit-log-path=/opt/kubernetes/logs/k8s-audit.log"
EOF
#--logtostderr=true:?jiǎn)⒂萌罩?。輸出日志到?biāo)準(zhǔn)錯(cuò)誤控制臺(tái),不輸出到文件
#--v=4:日志等級(jí)。指定輸出日志的級(jí)別,v=4為調(diào)試級(jí)別詳細(xì)輸出
#--etcd-servers:etcd集群地址。指定etcd服務(wù)器列表(格式://ip:port),逗號(hào)分隔
#--bind-address:監(jiān)聽(tīng)地址。指定 HTTPS 安全接口的監(jiān)聽(tīng)地址,默認(rèn)值0.0.0.0
#--secure-port:https安全端口。指定 HTTPS 安全接口的監(jiān)聽(tīng)端口,默認(rèn)值6443
#--advertise-address:集群通告地址。通過(guò)該 ip 地址向集群其他節(jié)點(diǎn)公布 api server 的信息,必須能夠被其他節(jié)點(diǎn)訪問(wèn)
#--allow-privileged=true:?jiǎn)⒂檬跈?quán)。允許擁有系統(tǒng)特權(quán)的容器運(yùn)行,默認(rèn)值false
#--service-cluster-ip-range:Service虛擬IP地址段。指定 Service Cluster IP 地址段
#--enable-admission-plugins:準(zhǔn)入控制模塊。kuberneres集群的準(zhǔn)入控制機(jī)制,各控制模塊以插件的形式依次生效,集群時(shí)必須包含ServiceAccount,運(yùn)行在認(rèn)證(Authentication)、授權(quán)(Authorization)之后,Admission Control是權(quán)限認(rèn)證鏈上的最后一環(huán), 對(duì)請(qǐng)求API資源對(duì)象進(jìn)行修改和校驗(yàn)
#--authorization-mode:認(rèn)證授權(quán),啟用RBAC授權(quán)和節(jié)點(diǎn)自管理。在安全端口使用RBAC,Node授權(quán)模式,未通過(guò)授權(quán)的請(qǐng)求拒絕,默認(rèn)值A(chǔ)lwaysAllow。RBAC是用戶通過(guò)角色與權(quán)限進(jìn)行關(guān)聯(lián)的模式;Node模式(節(jié)點(diǎn)授權(quán))是一種特殊用途的授權(quán)模式,專門(mén)授權(quán)由kubelet發(fā)出的API請(qǐng)求,在進(jìn)行認(rèn)證時(shí),先通過(guò)用戶名、用戶分組驗(yàn)證是否是集群中的Node節(jié)點(diǎn),只有是Node節(jié)點(diǎn)的請(qǐng)求才能使用Node模式授權(quán)
#--enable-bootstrap-token-auth:?jiǎn)⒂肨LS bootstrap機(jī)制。在apiserver上啟用Bootstrap Token 認(rèn)證
#--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token認(rèn)證文件路徑
#--service-node-port-range:指定 Service NodePort 的端口范圍,默認(rèn)值30000-32767
#–-kubelet-client-xxx:apiserver訪問(wèn)kubelet客戶端證書(shū)
#--tls-xxx-file:apiserver https證書(shū)
#1.20版本必須加的參數(shù):–-service-account-issuer,–-service-account-signing-key-file
#--etcd-xxxfile:連接Etcd集群證書(shū)
#–-audit-log-xxx:審計(jì)日志
#啟動(dòng)聚合層相關(guān)配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing
#創(chuàng)建 kube-apiserver.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-apiserver.service <<EOF
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
ExecStart=/opt/kubernetes/bin/kube-apiserver \$KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
./apiserver.sh 192.168.67.102 https://192.168.67.102:2379,https://192.168.67.103:2379,https://192.168.67.104:2379
#指定當(dāng)前服務(wù)器的地址和etcd集群的地址
#檢查進(jìn)程是否啟動(dòng)成功
ps aux | grep kube-apiserver
ss -natp | grep 6443
#安全端口6443用于接收HTTPS請(qǐng)求,用于基于Token文件或客戶端證書(shū)等認(rèn)證
#啟動(dòng) scheduler 服務(wù)
cd /opt/k8s/
vim scheduler.sh
#!/bin/bash
##創(chuàng)建 kube-scheduler 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1
cat >/opt/kubernetes/cfg/kube-scheduler <<EOF
KUBE_SCHEDULER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect=true \\
--kubeconfig=/opt/kubernetes/cfg/kube-scheduler.kubeconfig \\
--bind-address=127.0.0.1"
EOF
#-–kubeconfig:連接 apiserver 用的配置文件,用于識(shí)別 k8s 集群
#--leader-elect=true:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)啟動(dòng) leader 選舉
#k8s 中 Controller-Manager 和 Scheduler 的選主邏輯:k8s 中的 etcd 是整個(gè)集群所有狀態(tài)信息的存儲(chǔ),涉及數(shù)據(jù)的讀寫(xiě)和多個(gè) etcd 之間數(shù)據(jù)的同步,對(duì)數(shù)據(jù)的一致性要求嚴(yán)格,所以使用較復(fù)雜的 raft 算法來(lái)選擇用于提交數(shù)據(jù)的主節(jié)點(diǎn)。而 apiserver 作為集群入口,本身是無(wú)狀態(tài)的 web 服務(wù)器,多個(gè) apiserver 服務(wù)之間直接負(fù)載請(qǐng)求并不需要做選主。Controller-Manager 和 Scheduler 作為任務(wù)類型的組件,比如 controller-manager 內(nèi)置的 k8s 各種資源對(duì)象的控制器實(shí)時(shí)的 watch apiserver 獲取對(duì)象最新的變化事件做期望狀態(tài)和實(shí)際狀態(tài)調(diào)整,scheduler watch 未綁定節(jié)點(diǎn)的 pod 做節(jié)點(diǎn)選擇, 顯然多個(gè)這些任務(wù)同時(shí)工作是完全沒(méi)有必要的,所以 controller-manager 和 scheduler 也是需要選主的,但是選主邏輯和 etcd 不一樣的,這里只需要保證從多個(gè) controller-manager 和 scheduler 之間選出一個(gè) leader 進(jìn)入工作狀態(tài)即可,而無(wú)需考慮它們之間的數(shù)據(jù)一致和同步。
##生成kube-scheduler證書(shū)
#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/
#創(chuàng)建證書(shū)請(qǐng)求文件
cat > kube-scheduler-csr.json << EOF
{
"CN": "system:kube-scheduler",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
#生成證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler
#生成kubeconfig配置文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig"
KUBE_APISERVER="https://192.168.67.102:6443"
#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kube-scheduler \
--client-certificate=./kube-scheduler.pem \
--client-key=./kube-scheduler-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-scheduler \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
##創(chuàng)建 kube-scheduler.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-scheduler.service <<EOF
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-scheduler
ExecStart=/opt/kubernetes/bin/kube-scheduler \$KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-scheduler
systemctl restart kube-scheduler
./scheduler.sh
ps aux | grep kube-scheduler
#啟動(dòng) controller-manager 服務(wù)
vim controller-manager.sh
#!/bin/bash
##創(chuàng)建 kube-controller-manager 啟動(dòng)參數(shù)配置文件
MASTER_ADDRESS=$1
cat >/opt/kubernetes/cfg/kube-controller-manager <<EOF
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--leader-elect=true \\
--kubeconfig=/opt/kubernetes/cfg/kube-controller-manager.kubeconfig \\
--bind-address=127.0.0.1 \\
--allocate-node-cidrs=true \\
--cluster-cidr=10.244.0.0/16 \\
--service-cluster-ip-range=10.0.0.0/24 \\
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \\
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--root-ca-file=/opt/kubernetes/ssl/ca.pem \\
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \\
--cluster-signing-duration=87600h0m0s"
EOF
#––leader-elect:當(dāng)該組件啟動(dòng)多個(gè)時(shí),自動(dòng)選舉(HA)
#-–kubeconfig:連接 apiserver 用的配置文件,用于識(shí)別 k8s 集群
#--cluster-cidr=10.244.0.0/16:pod資源的網(wǎng)段,需與pod網(wǎng)絡(luò)插件的值設(shè)置一致。通常,F(xiàn)lannel網(wǎng)絡(luò)插件的默認(rèn)為10.244.0.0/16,Calico插件的默認(rèn)值為192.168.0.0/16
#--cluster-signing-cert-file/–-cluster-signing-key-file:自動(dòng)為kubelet頒發(fā)證書(shū)的CA,與apiserver保持一致。指定簽名的CA機(jī)構(gòu)根證書(shū),用來(lái)簽名為 TLS BootStrapping 創(chuàng)建的證書(shū)和私鑰
#--root-ca-file:指定根CA證書(shū)文件路徑,用來(lái)對(duì) kube-apiserver 證書(shū)進(jìn)行校驗(yàn),指定該參數(shù)后,才會(huì)在 Pod 容器的 ServiceAccount 中放置該 CA 證書(shū)文件
#--experimental-cluster-signing-duration:設(shè)置為 TLS BootStrapping 簽署的證書(shū)有效時(shí)間為10年,默認(rèn)為1年
##生成kube-controller-manager證書(shū)
#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/
#創(chuàng)建證書(shū)請(qǐng)求文件
cat > kube-controller-manager-csr.json << EOF
{
"CN": "system:kube-controller-manager",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF
#生成證書(shū)和私鑰
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
#生成kubeconfig配置文件
KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig"
KUBE_APISERVER="https://192.168.67.102:6443"
#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials kube-controller-manager \
--client-certificate=./kube-controller-manager.pem \
--client-key=./kube-controller-manager-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-controller-manager \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
##創(chuàng)建 kube-controller-manager.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-controller-manager.service <<EOF
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-controller-manager
ExecStart=/opt/kubernetes/bin/kube-controller-manager \$KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
./controller-manager.sh
ps aux | grep kube-controller-manager
#生成kubectl連接集群的kubeconfig文件
vim admin.sh
#!/bin/bash
mkdir /root/.kube
KUBE_CONFIG="/root/.kube/config"
KUBE_APISERVER="https://192.168.67.102:6443"
#切換到k8s證書(shū)目錄操作
cd /opt/k8s/k8s-cert/
#配置kubernetes集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=/opt/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=${KUBE_CONFIG}
#配置客戶端認(rèn)證參數(shù)
kubectl config set-credentials admin \
--client-certificate=./admin.pem \
--client-key=./admin-key.pem \
--embed-certs=true \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置設(shè)置一個(gè)環(huán)境項(xiàng),配置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=admin \
--kubeconfig=${KUBE_CONFIG}
#設(shè)置默認(rèn)環(huán)境上下文
kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
#生成的 kubeconfig 被保存到 /root/.kube/config 文件
#########################################################
#集群參數(shù)
#本段設(shè)置了所需要訪問(wèn)的集群的信息。使用set-cluster設(shè)置了需要訪問(wèn)的集群,如上為kubernetes,這只是個(gè)名稱,實(shí)際為--server指向的apiserver;--certificate-authority設(shè)置了該集群的公鑰;--embed-certs為true表示將--certificate-authority證書(shū)寫(xiě)入到kubeconfig中;--server則表示該集群的kube-apiserver地址
#用戶參數(shù)
#本段主要設(shè)置用戶的相關(guān)信息,主要是用戶證書(shū)。如上的用戶名為admin,證書(shū)為:/opt/kubernetes/ssl/admin.pem,私鑰為:/opt/kubernetes/ssl/admin-key.pem。注意客戶端的證書(shū)首先要經(jīng)過(guò)集群CA的簽署,否則不會(huì)被集群認(rèn)可。此處使用的是ca認(rèn)證方式,也可以使用token認(rèn)證,如kubelet的 TLS Boostrap 機(jī)制下的 bootstrapping 使用的就是token認(rèn)證方式。上述kubectl使用的是ca認(rèn)證,不需要token字段
#上下文參數(shù)
#集群參數(shù)和用戶參數(shù)可以同時(shí)設(shè)置多對(duì),在上下文參數(shù)中將集群參數(shù)和用戶參數(shù)關(guān)聯(lián)起來(lái)。上面的上下文名稱為default,集群為kubenetes,用戶為admin,表示使用admin的用戶憑證來(lái)訪問(wèn)kubenetes集群的default命名空間,也可以增加--namspace來(lái)指定訪問(wèn)的命名空間。
#最后使用 kubectl config use-context default 來(lái)使用名為 default 的環(huán)境項(xiàng)來(lái)作為配置。 如果配置了多個(gè)環(huán)境項(xiàng),可以通過(guò)切換不同的環(huán)境項(xiàng)名字來(lái)訪問(wèn)到不同的集群環(huán)境。
#########################################################
./admin.sh
#綁定默認(rèn)cluster-admin管理員集群角色,授權(quán)kubectl訪問(wèn)集群
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
#通過(guò)kubectl工具查看當(dāng)前集群組件狀態(tài)
kubectl get cs
#查看版本信息
kubectl version
2.6 部署 Worker Node 組件
- 獲取二進(jìn)制文件
kubelet
ube-proxy
- 準(zhǔn)備
kubelet
kube-proxy
的kubeconfig
集群引導(dǎo)配置文件kube-proxy.kubeconfig ``bootstrap.kubeconfig
(kubelet首次訪問(wèn)apiserver加入K8S集群使用引導(dǎo)文件) - 準(zhǔn)備
kubelet
kube-proxy
的服務(wù)進(jìn)程啟動(dòng)參數(shù)配置文件 - 啟動(dòng)
kubelet
服務(wù)進(jìn)程,向apiserver
發(fā)起 CSR 請(qǐng)求頒發(fā)證書(shū),master 通過(guò) CSR 請(qǐng)求后kubelet
方可獲取到證書(shū) - 加載 ipvs 模塊,啟動(dòng)
kube-proxy
服務(wù)進(jìn)程 - 執(zhí)行
kubectl get nodes
命令查看node的狀態(tài)
2.6.1 在所有 node 節(jié)點(diǎn)上操作
2.6.1.1 node01 節(jié)點(diǎn)部署
#創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
mkdir /opt/k8s
#上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
cd /opt/k8s
unzip node.zip
chmod +x kubelet.sh proxy.sh
mkdir k8s
mv node.zip kubelet.sh proxy.sh k8s/
#在 master01 節(jié)點(diǎn)上操作
#把 kubelet、kube-proxy 拷貝到 node 節(jié)點(diǎn)
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.67.103:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.67.104:/opt/kubernetes/bin/
#上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導(dǎo)kubeconfig文件和kube-proxy.kubeconfig文件
#kubeconfig 文件包含集群參數(shù)(CA 證書(shū)、API Server 地址),客戶端參數(shù)(上面生成的證書(shū)和私鑰),集群 context 上下文參數(shù)(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過(guò)啟動(dòng)時(shí)指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
vim kubeconfig.sh
#!/bin/bash
#example: kubeconfig 192.168.67.102 /opt/k8s/k8s-cert/
#創(chuàng)建bootstrap.kubeconfig文件
#該文件中內(nèi)置了 token.csv 中用戶的 Token,以及 apiserver CA 證書(shū);kubelet 首次啟動(dòng)會(huì)加載此文件,使用 apiserver CA 證書(shū)建立與 apiserver 的 TLS 通訊,使用其中的用戶 Token 作為身份標(biāo)識(shí)向 apiserver 發(fā)起 CSR 請(qǐng)求
BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv)
APISERVER=$1
SSL_DIR=$2
export KUBE_APISERVER="https://$APISERVER:6443"
# 設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
#--embed-certs=true:表示將ca.pem證書(shū)寫(xiě)入到生成的bootstrap.kubeconfig文件中
# 設(shè)置客戶端認(rèn)證參數(shù),kubelet 使用 bootstrap token 認(rèn)證
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 使用上下文參數(shù)生成 bootstrap.kubeconfig 文件
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
#創(chuàng)建kube-proxy.kubeconfig文件
# 設(shè)置集群參數(shù)
kubectl config set-cluster kubernetes \
--certificate-authority=$SSL_DIR/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
# 設(shè)置客戶端認(rèn)證參數(shù),kube-proxy 使用 TLS 證書(shū)認(rèn)證
kubectl config set-credentials kube-proxy \
--client-certificate=$SSL_DIR/kube-proxy.pem \
--client-key=$SSL_DIR/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
# 設(shè)置上下文參數(shù)
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
# 使用上下文參數(shù)生成 kube-proxy.kubeconfig 文件
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.67.102 /opt/k8s/k8s-cert/
#指定本地地址和證書(shū)所在目錄
#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點(diǎn)
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.67.103:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.67.104:/opt/kubernetes/cfg/
#RBAC授權(quán),使用戶 kubelet-bootstrap 能夠有權(quán)限發(fā)起 CSR 請(qǐng)求證書(shū)
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
------------------------------------------------------------------------------------------
kubelet 采用 TLS Bootstrapping 機(jī)制,自動(dòng)完成到 kube-apiserver 的注冊(cè),在 node 節(jié)點(diǎn)量較大或者后期自動(dòng)擴(kuò)容時(shí)非常有用。
Master apiserver 啟用 TLS 認(rèn)證后,node 節(jié)點(diǎn) kubelet 組件想要加入集群,必須使用CA簽發(fā)的有效證書(shū)才能與 apiserver 通信,當(dāng) node 節(jié)點(diǎn)很多時(shí),簽署證書(shū)是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機(jī)制來(lái)自動(dòng)頒發(fā)客戶端證書(shū),kubelet 會(huì)以一個(gè)低權(quán)限用戶自動(dòng)向 apiserver 申請(qǐng)證書(shū),kubelet 的證書(shū)由 apiserver 動(dòng)態(tài)簽署。
kubelet 首次啟動(dòng)通過(guò)加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書(shū)發(fā)起首次 CSR 請(qǐng)求,這個(gè) Token 被預(yù)先內(nèi)置在 apiserver 節(jié)點(diǎn)的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請(qǐng)求能成功(即不會(huì)被 apiserver 401 拒絕),則需要先創(chuàng)建一個(gè) ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內(nèi)置 ClusterRole 綁定(通過(guò) kubectl get clusterroles 可查詢),使其能夠發(fā)起 CSR 認(rèn)證請(qǐng)求。
TLS bootstrapping 時(shí)的證書(shū)實(shí)際是由 kube-controller-manager 組件來(lái)簽署的,也就是說(shuō)證書(shū)有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個(gè) --experimental-cluster-signing-duration 參數(shù)來(lái)設(shè)置簽署的證書(shū)有效時(shí)間;默認(rèn)為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進(jìn)行 TLS bootstrapping 簽署證書(shū)即可。
也就是說(shuō) kubelet 首次訪問(wèn) API Server 時(shí),是使用 token 做認(rèn)證,通過(guò)后,Controller Manager 會(huì)為 kubelet 生成一個(gè)證書(shū),以后的訪問(wèn)都是用證書(shū)做認(rèn)證了。
------------------------------------------------------------------------------------------
#在 node01 節(jié)點(diǎn)上操作
#啟動(dòng) kubelet 服務(wù)
cd /opt/k8s
vim kubelet.sh
#!/bin/bash
NODE_ADDRESS=$1
DNS_SERVER_IP=${2:-"10.0.0.2"}
#創(chuàng)建 kubelet 啟動(dòng)參數(shù)配置文件
cat >/opt/kubernetes/cfg/kubelet <<EOF
KUBELET_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=${NODE_ADDRESS} \\
--network-plugin=cni \\
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \\
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \\
--config=/opt/kubernetes/cfg/kubelet.config \\
--cert-dir=/opt/kubernetes/ssl \\
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause-amd64:3.2"
EOF
#--hostname-override:指定kubelet節(jié)點(diǎn)在集群中顯示的主機(jī)名或IP地址,默認(rèn)使用主機(jī)hostname;kube-proxy和kubelet的此項(xiàng)參數(shù)設(shè)置必須完全一致
#--network-plugin:?jiǎn)⒂肅NI
#--kubeconfig:指定kubelet.kubeconfig文件位置,當(dāng)前為空路徑,會(huì)自動(dòng)生成,用于如何連接到apiserver,里面含有kubelet證書(shū),master授權(quán)完成后會(huì)在node節(jié)點(diǎn)上生成 kubelet.kubeconfig 文件
#--bootstrap-kubeconfig:指定連接 apiserver 的 bootstrap.kubeconfig 文件
#--config:指定kubelet配置文件的路徑,啟動(dòng)kubelet時(shí)將從此文件加載其配置
#--cert-dir:指定master頒發(fā)的kubelet證書(shū)生成目錄
#--pod-infra-container-image:指定Pod基礎(chǔ)容器(Pause容器)的鏡像。Pod啟動(dòng)的時(shí)候都會(huì)啟動(dòng)一個(gè)這樣的容器,每個(gè)pod里容器之間的相互通信需要Pause的支持,啟動(dòng)Pause需要Pause基礎(chǔ)鏡像
#----------------------
#創(chuàng)建kubelet配置文件(該文件實(shí)際上就是一個(gè)yml文件,語(yǔ)法非常嚴(yán)格,不能出現(xiàn)tab鍵,冒號(hào)后面必須要有空格,每行結(jié)尾也不能有空格)
cat >/opt/kubernetes/cfg/kubelet.config <<EOF
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: ${NODE_ADDRESS}
port: 10250
readOnlyPort: 10255
cgroupDriver: systemd
clusterDNS:
- ${DNS_SERVER_IP}
clusterDomain: cluster.local
failSwapOn: false
authentication:
anonymous:
enabled: true
EOF
#PS:當(dāng)命令行參數(shù)與此配置文件(kubelet.config)有相同的值時(shí),就會(huì)覆蓋配置文件中的該值。
#----------------------
#創(chuàng)建 kubelet.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kubelet.service <<EOF
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/opt/kubernetes/cfg/kubelet
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
chmod +x *.sh
./kubelet.sh 192.168.67.103 node01
ps aux | grep kubelet
#在 master01 節(jié)點(diǎn)上操作,通過(guò) CSR 請(qǐng)求
#檢查到 node01 節(jié)點(diǎn)的 kubelet 發(fā)起的 CSR 請(qǐng)求,Pending 表示等待集群給該節(jié)點(diǎn)簽發(fā)證書(shū)
kubectl get csr
kubectl certificate approve node-csr-VXBLUwWvGyHmU38mqZ3xusiKmDxzDVJc1okyRinafvw
kubectl get csr
kubectl get nodes
#在 node01 節(jié)點(diǎn)上操作
#加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
#啟動(dòng)proxy服務(wù)
cd /opt/k8s
vim proxy.sh
#!/bin/bash
NODE_ADDRESS=$1
#創(chuàng)建 kube-proxy 啟動(dòng)參數(shù)配置文件
cat >/opt/kubernetes/cfg/kube-proxy <<EOF
KUBE_PROXY_OPTS="--logtostderr=false \\
--v=2 \\
--log-dir=/opt/kubernetes/logs \\
--hostname-override=${NODE_ADDRESS} \\
--cluster-cidr=10.244.0.0/16 \\
--proxy-mode=ipvs \\
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig"
EOF
#--hostnameOverride: 參數(shù)值必須與 kubelet 的值一致,否則 kube-proxy 啟動(dòng)后會(huì)找不到該 Node,從而不會(huì)創(chuàng)建任何 ipvs 規(guī)則
#--cluster-cidr:指定 Pod 網(wǎng)絡(luò)使用的聚合網(wǎng)段,Pod 使用的網(wǎng)段和 apiserver 中指定的 service 的 cluster ip 網(wǎng)段不是同一個(gè)網(wǎng)段。 kube-proxy 根據(jù) --cluster-cidr 判斷集群內(nèi)部和外部流量,指定 --cluster-cidr 選項(xiàng)后 kube-proxy 才會(huì)對(duì)訪問(wèn) Service IP 的請(qǐng)求做 SNAT,即來(lái)自非 Pod 網(wǎng)絡(luò)的流量被當(dāng)成外部流量,訪問(wèn) Service 時(shí)需要做 SNAT。
#--kubeconfig: 指定連接 apiserver 的 kubeconfig 文件
#--proxy-mode:指定流量調(diào)度模式為ipvs模式,可添加--ipvs-scheduler選項(xiàng)指定ipvs調(diào)度算法(rr|lc|dh|sh|sed|nq)
#rr: round-robin,輪詢。
#lc: least connection,最小連接數(shù)。
#dh: destination hashing,目的地址哈希。
#sh: source hashing ,原地址哈希。
#sed: shortest expected delay,最短期望延時(shí)。
#nq: never queue ,永不排隊(duì)。
#----------------------
#創(chuàng)建 kube-proxy.service 服務(wù)管理文件
cat >/usr/lib/systemd/system/kube-proxy.service <<EOF
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
EnvironmentFile=-/opt/kubernetes/cfg/kube-proxy
ExecStart=/opt/kubernetes/bin/kube-proxy \$KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
./proxy.sh 192.168.67.103
ps aux | grep kube-proxy
2.6.1.2 node02 節(jié)點(diǎn)部署
#在 node01 節(jié)點(diǎn)上操作
cd /opt/k8s
scp kubelet.sh proxy.sh root@192.168.67.104:/opt/
#在 node02 節(jié)點(diǎn)上操作
#啟動(dòng)kubelet服務(wù)
cd /opt
chmod +x kubelet.sh
./kubelet.sh 192.168.67.104 node02
#在 master01 節(jié)點(diǎn)上操作
kubectl get csr
#通過(guò) CSR 請(qǐng)求
kubectl certificate approve node-csr-WSrwQuqYysVMvZdjTyZRkN0-D8LPXV38Zuynor0R16k
kubectl get csr
#加載 ip_vs 模塊
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-745445.html
#使用proxy.sh腳本啟動(dòng)proxy服務(wù)
./proxy.sh 192.168.67.104
ps aux | grep kube-proxy
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-745445.html
到了這里,關(guān)于[云原生案例2.1 ] Kubernetes的部署安裝 【單master集群架構(gòu) ---- (二進(jìn)制安裝部署)】節(jié)點(diǎn)部分的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!