單master集群架構(gòu)圖:
實驗環(huán)境(二進制搭建 Kubernetes v1.20)
注意:生產(chǎn)環(huán)境中,etcd集群和master、node節(jié)點都應該部署在不同的機器上,此處為了實驗方便,將三臺etcd節(jié)點分別部署在了master和node節(jié)點上了
k8s集群master01:192.168.126.27?? ?kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.80.21
k8s集群node01:192.168.80.11?? ?kubelet kube-proxy docker?
k8s集群node02:192.168.80.12
etcd集群節(jié)點01:192.168.126.27? ??
etcd集群節(jié)點02:192.168.126.28
etcd集群節(jié)點03:192.168.126.29
負載均衡nginx+keepalive01(master):192.168.126.22
負載均衡nginx+keepalive02(backup):192.168.126.23
1.操作系統(tǒng)初始化配置
#以下三臺同時操作
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è)置主機名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#添加hosts
cat >> /etc/hosts << EOF
192.168.126.27 master01
192.168.126.28 node01
192.168.126.29 node02
EOF
#調(diào)整內(nèi)核參數(shù)
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網(wǎng)橋模式,可將網(wǎng)橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關(guān)閉ipv6協(xié)議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system #加載
#時間同步
yum install ntpdate -y
ntpdate time.windows.com
2.?部署 etcd 集群(分布式鍵值對數(shù)據(jù)庫)
etcd是CoreOS團隊于2013年6月發(fā)起的開源項目,它的目標是構(gòu)建一個高可用的分布式鍵值(key-value)數(shù)據(jù)庫。etcd內(nèi)部采用raft協(xié)議作為一致性算法,etcd是go語言編寫的。
etcd 作為服務發(fā)現(xiàn)系統(tǒng),有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:單實例支持每秒2k+讀操作
可靠:采用raft算法,實現(xiàn)分布式系統(tǒng)數(shù)據(jù)的可用性和一致性
etcd 目前默認使用2379端口提供HTTP API服務, 2380端口和peer通信(這兩個端口已經(jīng)被IANA(互聯(lián)網(wǎng)數(shù)字分配機構(gòu))官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內(nèi)部通訊。
etcd 在生產(chǎn)環(huán)境中一般推薦集群方式部署。由于etcd 的leader選舉機制,要求至少為3臺或以上的奇數(shù)臺
準備簽發(fā)證書環(huán)境
CFSSL 是 CloudFlare 公司開源的一款 PKI/TLS 工具。 CFSSL 包含一個命令行工具和一個用于簽名、驗證和捆綁 TLS 證書的 HTTP API 服務。使用Go語言編寫。
CFSSL 使用配置文件生成證書,因此自簽之前,需要生成它識別的 json 格式的配置文件,CFSSL 提供了方便的命令行生成配置文件。
CFSSL 用來為 etcd 提供 TLS 證書,它支持簽三種類型的證書:
1、client 證書,服務端連接客戶端時攜帶的證書,用于客戶端驗證服務端身份,如 kube-apiserver 訪問 etcd;
2、server 證書,客戶端連接服務端時攜帶的證書,用于服務端驗證客戶端身份,如 etcd 對外提供服務;
3、peer 證書,相互之間連接時使用的證書,如 etcd 節(jié)點之間進行驗證和通信。
這里全部都使用同一套證書認證。
1)在 master01 節(jié)點上操作(即etcd01)
#準備cfssl證書生成工具
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*
#-O:指定下載目錄
#Linux命令行兩種下載方式:
#wget 源URL地址 [-O 下載到指定路徑]
#curl 源URL地址 [-o 下載到指定路徑]
#cfssl:證書簽發(fā)的工具命令
#cfssljson:將 cfssl 生成的證書(json格式)變?yōu)槲募休d式證書
#cfssl-certinfo:驗證證書的信息
#cfssl-certinfo -cert <證書名稱> #查看證書的信息
?#------------------------生成Etcd證書-----------------------
?#k8s目錄用于存放生成證書的腳本文件
?mkdir /opt/k8s/
?cd /opt/k8s/
??
?#上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中,為兩個文件增加執(zhí)行權(quán)限
?chmod +x etcd-cert.sh etcd.sh
??
?#創(chuàng)建用于生成CA證書、etcd 服務器證書以及私鑰的目錄
?mkdir /opt/k8s/etcd-cert/
?mv etcd-cert.sh etcd-cert/ ? ?#將etcd-cert.sh移動到該目錄
?cd /opt/k8s/etcd-cert/ ?
?./etcd-cert.sh ? ? ? ?#運行腳本生成CA證書、etcd 服務器證書以及私鑰
??
?#查看etcd-cert目錄,以.json和.csr結(jié)尾的文件都是請求生成證書的文件,以pem結(jié)尾的文件都是最終生成的證書文件。
?ls ? ? ? ? ? ? ? ? ?
?ca-config.json ca-csr.json ca.pem ? ? ? server.csr ? ? ? server-key.pem
?ca.csr ? ? ? ? ca-key.pem ? etcd-cert.sh server-csr.json server.pem
??
??
?#上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,啟動etcd服務
?#下載地址https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-1inux-amd64.tar.gz
?cd /opt/k8s/
?tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
??
?#查看安裝包解壓后的目錄,該目錄包含了etcd的啟動文件etcd和etcd的管理文件etcdctl
?cd /opt/k8s/etcd-v3.4.9-linux-amd64/
?ls
?--------------------------------------------------------------------------------
?etcd:就是etcd服務的啟動命令,后面可跟各種啟動參數(shù)
?etcdctl:主要為etcd服務提供了命令行操作
?--------------------------------------------------------------------------------
??
?#創(chuàng)建/opt/etcd目錄,并創(chuàng)建三個子目錄cfg、bin、ssl。cfg用于存放配置文件,bin用于存放執(zhí)行文件,ssl用于存放證書文件
?mkdir -p /opt/etcd/{cfg,bin,ssl}
??
?#將etcd和etcdctl兩個文件移動到/opt/etcd/bin目錄
?mv etcd etcdctl /opt/etcd/bin/
?#將證書文件復制到etcd01節(jié)點的/opt/etcd/ssl/目錄
?cp /opt/k8s/etcd-cert/*.pem /opt/etcd/ssl/
??
?cd /opt/k8s/
?#運行腳本,會卡在前臺
?./etcd.sh etcd01 192.168.126.27 etcd02=https://192.168.126.28:2380,etcd03=https://192.168.126.29:2380
?#另開一臺終端,查看進程信息
?ps -ef | grep etcd
??
#把etcd相關(guān)證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節(jié)點
?scp -r /opt/etcd/ root@192.168.126.28:/opt/
?scp -r /opt/etcd/ root@192.168.126.29:/opt/
?#傳輸etcd的系統(tǒng)服務管理文件
?scp /usr/lib/systemd/system/etcd.service root@192.168.126.28:/usr/lib/systemd/system/
?scp /usr/lib/systemd/system/etcd.service root@192.168.126.29:/usr/lib/systemd/system/
2)在 node01 節(jié)點上操作(即etcd02)
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd02" #修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.126.28:2380" #修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.126.28:2379" #修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.126.28:2380" #修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.126.28:2379" #修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.126.27:2380,etcd02=https://192.168.126.28:2380,etcd03=https://192.168.126.29:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動etcd服務
systemctl start etcd
systemctl enable etcd
systemctl status etcd
3)在 node02 節(jié)點上操作(即etcd03)
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03" #修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.126.29:2380" #修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.126.29:2379" #修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.126.29:2380" #修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.126.29:2379" #修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.126.27:2380,etcd02=https://192.168.126.28:2380,etcd03=https://192.168.126.29:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
#啟動etcd服務
systemctl start etcd
systemctl enable etcd
systemctl status etcd
4)檢查etcd群集狀態(tài)
?#三個etcd節(jié)點都可用查看
?#切換到/opt/etcd/ssl目錄,證書可使用相對路徑。如果不在該目錄下,證書要使用絕對路徑。
?#查看etcd集群每個節(jié)點的健康狀態(tài),true表示健康
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.126.27:2379,https://192.168.126.28:2379,https://192.168.126.29:2379" endpoint health --write-out=table
??
?#查看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.126.27:2379,https://192.168.126.28:2379,https://192.168.126.29:2379" --write-out=table member list
??
?#查看etcd集群中哪個節(jié)點是leader,true表示leader
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.126.27:2379,https://192.168.126.28:2379,https://192.168.126.29:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --write-out=table endpoint status
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://192.168.126.27:2379 | 66f49acac6299436 | 3.4.26 | 20 kB | true | false | 612 | 9 | 9 | |
| https://192.168.126.28:2379 | ebea4d5f7d427778 | 3.4.26 | 20 kB | false | false | 612 | 9 | 9 | |
| https://192.168.126.29:2379 | 1bbea197f31c6d0d | 3.4.26 | 20 kB | false | false | 612 | 9 | 9 | |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
#------------------注釋---------------------------------------
--cert-file:識別HTTPS端使用SSL證書文件
--key-file:使用此SSL密鑰文件標識HTTPS客戶端
--ca-file:使用此CA證書驗證啟用https的服務器的證書
--endpoints:集群中以逗號分隔的機器地址列表
cluster-health:檢查etcd集群的運行狀況
etcd備份與恢復
#備份etcd,打快照,放在/root/etcd-snapshot.db
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.126.27:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot save /root/etcd-snapshot.db
#恢復etcd
1.查看恢復文件
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.126.27:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot status ./etcd-snapshot.db --write-out=table
+----------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| b545df08 | 0 | 5 | 20 kB |
+----------+----------+------------+------------+
2.恢復
ETCDCTL_API=3 /opt/etcd/bin/etcdctl --endpoints="https://192.168.126.27:2379" --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem snapshot restore ./etcd-snapshot.db
3.部署 Master 組件
master01:192.168.126.27文章來源:http://www.zghlxwxcb.cn/news/detail-495093.html
?#在 master01 節(jié)點上操作,因為master01和etcd01部署在同一臺機器上,所以/opt/k8s/目錄已存在。
?#上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
?cd /opt/k8s/
?unzip master.zip
?chmod +x *.sh ? ?#為所有腳本文件加上執(zhí)行權(quán)限
??
?#創(chuàng)建kubernetes工作目錄
?mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
??
?#創(chuàng)建用于生成CA證書、相關(guān)組件的證書和私鑰的目錄
?mkdir /opt/k8s/k8s-cert/
?mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert/ ? ?#將k8s-cert.sh腳本移動到該目錄
?cd /opt/k8s/k8s-cert/ ? ? ? ? ? ? ? ? ? ? ? ? #切換到該目錄
vim k8s-cert.sh #修改里面的ip地址
chmod +x k8s-cert.sh
?./k8s-cert.sh ? #運行腳本,生成CA證書、相關(guān)組件的證書和私鑰
??
?#查看生成的證書文件
?ls *pem
?admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem ?
?admin.pem ? ? apiserver.pem ? ? ca.pem ? ? kube-proxy.pem
??
?#復制CA證書、apiserver相關(guān)證書和私鑰到kubernetes工作目錄的ssl子目錄中
?cp ca*pem apiserver*pem /opt/kubernetes/ssl/
??
?#上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包。
?#下載地址: https://github.com/kubernetes/kubernetes/blob/release-1.20/CHANGELOG/CHANGELOG-1.20.nd
?#注:打開鏈接你會發(fā)現(xiàn)里面有很多包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。
?cd /opt/k8s/
?tar xf kubernetes-server-linux-amd64.tar.gz
??
?#復制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)建軟鏈接,方便系統(tǒng)識別命令
??
?#創(chuàng)建 bootstrap token 認證文件,apiserver 啟動時會調(diào)用,然后就相當于在集群內(nèi)創(chuàng)建了一個這個用戶,接下來就可以用 RBAC 給他授權(quán)
?cd /opt/k8s/
?vim token.sh
?#!/bin/bash
?#獲取隨機數(shù)前16個字節(jié)內(nèi)容,以十六進制格式輸出,并刪除其中空格
?BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
?#生成 token.csv 文件,按照 Token序列號,用戶名,UID,用戶組 的格式生成
?cat > /opt/kubernetes/cfg/token.csv <<EOF
?${BOOTSTRAP_TOKEN},kubelet-bootstrap,10001,"system:kubelet-bootstrap"
?EOF
??
?chmod +x token.sh ? ?#為腳本增加執(zhí)行權(quán)限
?./token.sh ? ? ? ? ? #運行腳本 ? ?
??
?cat /opt/kubernetes/cfg/token.csv
??
?#二進制文件、token、證書都準備好后,開啟apiserver服務,和etcd進行對接。
?cd /opt/k8s/
?#腳本后面跟master01的IP,以及etcd集群的地址和端口
?./apiserver.sh 192.168.126.27 https://192.168.126.27:2379,https://192.168.126.28:2379,https://192.168.126.29:2379
??
?#檢查進程是否啟動成功
?ps aux | grep kube-apiserver
?netstat -natp | grep 6443 ? #安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
??
?#啟動 scheduler 服務
?cd /opt/k8s/
vim scheduler.sh #查看ip地址是否正確
./scheduler.sh
?ps aux | grep kube-scheduler
??
?#啟動 controller-manager 服務
vim controller-manager.sh #查看ip地址是否正確
?./controller-manager.sh
?ps aux | grep kube-controller-manager
??
?#生成kubectl連接集群的kubeconfig文件,即令kubectl對接apiserver
vim admin.sh?#查看ip地址是否正確
./admin.sh
??
?#綁定默認cluster-admin管理員集群角色,授權(quán)kubectl訪問集群
?kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
??
?#通過kubectl工具查看當前集群組件狀態(tài)
?kubectl get cs
?NAME ? ? ? ? ? ? ? ? STATUS ? MESSAGE ? ? ? ? ? ? ERROR
?controller-manager ? Healthy ? ok ? ? ? ? ? ? ? ? ?
?scheduler ? ? ? ? ? Healthy ? ok ? ? ? ? ? ? ? ? ?
?etcd-2 ? ? ? ? ? ? ? Healthy ? {"health":"true"} ?
?etcd-1 ? ? ? ? ? ? ? Healthy ? {"health":"true"} ?
?etcd-0 ? ? ? ? ? ? ? Healthy ? {"health":"true"} ?
??
?#查看版本信息
?kubectl version
注:k8s-cert.sh腳本
?#!/bin/bash
?#配置證書生成策略,讓 CA 軟件知道頒發(fā)有什么功能的證書,生成用來簽發(fā)其他組件證書的根證書
?cat > ca-config.json <<EOF
?{
? ?"signing": {
? ? ?"default": {
? ? ? ?"expiry": "87600h"
? ? },
? ? ?"profiles": {
? ? ? ?"kubernetes": {
? ? ? ? ? "expiry": "87600h",
? ? ? ? ? "usages": [
? ? ? ? ? ? ?"signing",
? ? ? ? ? ? ?"key encipherment",
? ? ? ? ? ? ?"server auth",
? ? ? ? ? ? ?"client auth"
? ? ? ? ]
? ? ? }
? ? }
? }
?}
?EOF
??
?#生成CA證書和私鑰(根證書和私鑰)
?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 的證書和私鑰(apiserver和其它k8s組件通信使用)
?#hosts中將所有可能作為 apiserver 的 ip 添加進去,后面 keepalived 使用的VIP 也要加入
?cat > apiserver-csr.json <<EOF
?{
? ? ?"CN": "kubernetes",
? ? ?"hosts": [
? ? ? ?"10.0.0.1",
? ? ? ?"127.0.0.1",
? ? ? ?"192.168.126.27", ? ?#master01。使用腳本時,要將這5行注釋刪除
? ? ? ?"192.168.126.21", ? ?#master02
? ? ? ?"192.168.126.88", ? #vip,后面keepalived要用到
? ? ? ?"192.168.126.22", ? ?#負載均衡器01(master)
? ? ? ?"192.168.126.23", ? ?#負載均衡器02(backup)
? ? ? ?"kubernetes",
? ? ? ?"kubernetes.default",
? ? ? ?"kubernetes.default.svc",
? ? ? ?"kubernetes.default.svc.cluster",
? ? ? ?"kubernetes.default.svc.cluster.local"
? ? ],
? ? ?"key": {
? ? ? ? ?"algo": "rsa",
? ? ? ? ?"size": 2048
? ? },
? ? ?"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 連接集群的證書和私鑰,具有admin權(quán)限
?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 的證書和私鑰
?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
apiserver.sh腳本
?#!/bin/bash
?#example: apiserver.sh 192.168.126.27 https://192.168.126.27:2379,https://192.168.126.28:2379,https://192.168.126.29:2379
?#創(chuàng)建 kube-apiserver 啟動參數(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/k8s/etcd-cert/ca.pem \
?--etcd-certfile=/opt/k8s/etcd-cert/server.pem \
?--etcd-keyfile=/opt/k8s/etcd-cert/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:啟用日志。輸出日志到標準錯誤控制臺,不輸出到文件
?#--v=4:日志等級。指定輸出日志的級別,v=4為調(diào)試級別詳細輸出
?#--etcd-servers:etcd集群地址。指定etcd服務器列表(格式://ip:port),逗號分隔
?#--bind-address:監(jiān)聽地址。指定 HTTPS 安全接口的監(jiān)聽地址,默認值0.0.0.0
?#--secure-port:https安全端口。指定 HTTPS 安全接口的監(jiān)聽端口,默認值6443
?#--advertise-address:集群通告地址。通過該 ip 地址向集群其他節(jié)點公布 api server 的信息,必須能夠被其他節(jié)點訪問
?#--allow-privileged=true:啟用授權(quán)。允許擁有系統(tǒng)特權(quán)的容器運行,默認值false
?#--service-cluster-ip-range:Service虛擬IP地址段。指定 Service Cluster IP 地址段
?#--enable-admission-plugins:準入控制模塊。kuberneres集群的準入控制機制,各控制模塊以>插件的形式依次生效,集群時必須包含ServiceAccount,運行在認證(Authentication)、授權(quán)(Authorization)之后,Admission Control是權(quán)限認證鏈上的最后一環(huán), 對請求API資源對象進行修改和校驗
?#--authorization-mode:認證授權(quán),啟用RBAC授權(quán)和節(jié)點自管理。在安全端口使用RBAC,Node授權(quán)模式,未通過授權(quán)的請求拒絕,默認值A(chǔ)lwaysAllow。RBAC是用戶通過角色與權(quán)限進行關(guān)聯(lián)的模式>;Node模式(節(jié)點授權(quán))是一種特殊用途的授權(quán)模式,專門授權(quán)由kubelet發(fā)出的API請求,在進行認證時,先通過用戶名、用戶分組驗證是否是集群中的Node節(jié)點,只有是Node節(jié)點的請求才能使用Node模式授權(quán)
?#--enable-bootstrap-token-auth:啟用TLS bootstrap機制。在apiserver上啟用Bootstrap Token 認證
?#--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token認證文件路徑
?#--service-node-port-range:指定 Service NodePort 的端口范圍,默認值30000-32767
?#–-kubelet-client-xxx:apiserver訪問kubelet客戶端證書
?#--tls-xxx-file:apiserver https證書
?#1.20版本必須加的參數(shù):–-service-account-issuer,–-service-account-signing-key-file
?#--etcd-xxxfile:連接Etcd集群證書
?#–-audit-log-xxx:審計日志
?#啟動聚合層相關(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 服務管理文件
?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
scheduler.sh腳本
?#!/bin/bash
?##創(chuàng)建 kube-scheduler 啟動參數(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 用的配置文件,用于識別 k8s 集群
?#--leader-elect=true:當該組件啟動多個時,自動啟動 leader 選舉
?#k8s中Controller-Manager和Scheduler的選主邏輯:k8s中的etcd是整個集群所有狀態(tài)信>息的存儲,涉及數(shù)據(jù)的讀寫和多個etcd之間數(shù)據(jù)的同步,對數(shù)據(jù)的一致性要求嚴格,所以>使用較復雜的 raft 算法來選擇用于提交數(shù)據(jù)的主節(jié)點。而 apiserver 作為集群入口,本身是無狀態(tài)的web服務器,多個 apiserver 服務之間直接負載請求并不需要做選主。Controller-Manager 和 Scheduler 作為任務類型的組件,比如 controller-manager 內(nèi)置的 k8s 各種資源對象的控制器實時的 watch apiserver 獲取對象最新的變化事件做期望狀態(tài)>和實際狀態(tài)調(diào)整,調(diào)度器watch未綁定節(jié)點的pod做節(jié)點選擇,顯然多個這些任務同時工作>是完全沒有必要的,所以 controller-manager 和 scheduler 也是需要選主的,但是選主邏輯和 etcd 不一樣的,這里只需要保證從多個 controller-manager 和 scheduler 之間選出一個 leader 進入工作狀態(tài)即可,而無需考慮它們之間的數(shù)據(jù)一致和同步。
??
??
?##生成kube-scheduler證書
?cd /opt/k8s/k8s-cert/
?#創(chuà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
??
?#生成證書
?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.126.27:6443" ? #master01的IP
??
?kubectl config set-cluster kubernetes \
? ?--certificate-authority=/opt/kubernetes/ssl/ca.pem \
? ?--embed-certs=true \
? ?--server=${KUBE_APISERVER} \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config set-credentials kube-scheduler \
? ?--client-certificate=./kube-scheduler.pem \
? ?--client-key=./kube-scheduler-key.pem \
? ?--embed-certs=true \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config set-context default \
? ?--cluster=kubernetes \
? ?--user=kube-scheduler \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
??
??
?##創(chuàng)建 kube-scheduler.service 服務管理文件
?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
controller-manager.sh腳本
?#!/bin/bash
?##創(chuàng)建 kube-controller-manager 啟動參數(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:當該組件啟動多個時,自動選舉(HA)
?#-–kubeconfig:連接 apiserver 用的配置文件,用于識別 k8s 集群
?#--cluster-cidr=10.244.0.0/16:pod資源的網(wǎng)段,需與pod網(wǎng)絡(luò)插件的值設(shè)置一致。通常,F(xiàn)lannel網(wǎng)絡(luò)插件的默認為10.244.0.0/16,Calico插件的默認值為192.168.0.0/16
?#--cluster-signing-cert-file/–-cluster-signing-key-file:自動為kubelet頒發(fā)證書>的CA,與apiserver保持一致。指定簽名的CA機構(gòu)根證書,用來簽名為 TLS BootStrapping 創(chuàng)建的證書和私鑰
?#--root-ca-file:指定根CA證書文件路徑,用來對 kube-apiserver 證書進行校驗,指定該參數(shù)后,才會在 Pod 容器的 ServiceAccount 中放置該 CA 證書文件
?#--experimental-cluster-signing-duration:設(shè)置為 TLS BootStrapping 簽署的證書有效時間為10年,默認為1年
??
??
?##生成kube-controller-manager證書
?cd /opt/k8s/k8s-cert/
?#創(chuà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
??
??
?#生成證書
?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.126.27:6443" ? #master01的IP
??
?kubectl config set-cluster kubernetes \
? ?--certificate-authority=/opt/kubernetes/ssl/ca.pem \
? ?--embed-certs=true \
? ?--server=${KUBE_APISERVER} \
? ?--kubeconfig=${KUBE_CONFIG}
?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}
?kubectl config set-context default \
? ?--cluster=kubernetes \
? ?--user=kube-controller-manager \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
??
??
?##創(chuàng)建 kube-controller-manager.service 服務管理文件
?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
admin.sh
?#!/bin/bash
?mkdir /root/.kube
?KUBE_CONFIG="/root/.kube/config"
?KUBE_APISERVER="https://192.168.126.27:6443" ? #master01的IP
??
?cd /opt/k8s/k8s-cert/
??
?kubectl config set-cluster kubernetes \
? ?--certificate-authority=/opt/kubernetes/ssl/ca.pem \
? ?--embed-certs=true \
? ?--server=${KUBE_APISERVER} \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config set-credentials cluster-admin \
? ?--client-certificate=./admin.pem \
? ?--client-key=./admin-key.pem \
? ?--embed-certs=true \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config set-context default \
? ?--cluster=kubernetes \
? ?--user=cluster-admin \
? ?--kubeconfig=${KUBE_CONFIG}
?kubectl config use-context default --kubeconfig=${KUBE_CONFIG}
總結(jié):
etcd數(shù)據(jù)庫:
- 分布式鍵值對型的數(shù)據(jù)庫,服務發(fā)現(xiàn)系統(tǒng)(之前的docker-consul 就是服務發(fā)現(xiàn))
- go語言開發(fā)的,使用raft-a致性算法
- 部署集群時需要3臺或以上的奇數(shù)臺
- 2379 對外(客戶端)通信的端口
- 2380 對內(nèi)(集群內(nèi)部節(jié)點間)通信的端口
etcd安裝步驟:
- 使用CFSSL工具,生成ca證書和私鑰文件,再使用ca簽發(fā)服務端證書和私鑰文件
- 使用ca證書、服務端證書和私鑰文件加上etcd集群配置文件,去啟動etcd服務
- 解壓etcd軟件包
- 復制etcd工作目錄和服務管理文件到另外幾個節(jié)點上,修改etcd集群配置文件并啟動etcd服務
- 使用v3版本的接口執(zhí)行etcdctl +證書選項+ (endpoint health | endpoint status | member list) 查看etcd 集群和節(jié)點狀態(tài)
正常情況etcd應該生成三套證書:客戶端證書,服務端證書,對等體證書(內(nèi)部)。初學者可以先只生成兩套。文章來源地址http://www.zghlxwxcb.cn/news/detail-495093.html
master組件安裝步驟:
1.先安裝apiserver
- 準備組件的相關(guān)證書和私鑰文件
- 準備bootstraptoken認證文件(給kubelet啟動時簽發(fā)證書時使用)
- 準備組件的啟動配置文件
- 啟動apiserver 服務、端口號、6443、https
2.再啟動controller-manager 和scheduler
- 準備啟動配置文件
- 準備證書和私鑰文件生成kubeconfig 文件(用于指定對接哪個apiserver,使用什么證書認證)
- 啟動服務
3.檢查集群組件狀態(tài)
- 需要準備kubeconfig 文件,把kubectl 加入到集群中( 指定對接哪個apiserver,使用什么證書認證)
- kubectl get cs
到了這里,關(guān)于二進制搭建Kubernetes集群(一)——部署etcd集群和單master的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!