目錄
二進制搭建 Kubernetes v1.20 ? ?
操作系統(tǒng)初始化配置
部署 docker引擎
部署 etcd 集群
準備簽發(fā)證書環(huán)境
在 master01 節(jié)點上操作 ? ??
生成Etcd證書
在 node01 節(jié)點上操作
在 node02 節(jié)點上操作
部署 Master 組件
在 master01 節(jié)點上操作
部署 Worker Node 組件
在所有 node 節(jié)點上操作
在 master01 節(jié)點上操作
在 node01 節(jié)點上操作
在 master01 節(jié)點上操作,通過 CSR 請求
在 node01 節(jié)點上操作
二進制搭建 Kubernetes v1.20 ? ?
k8s集群master01:192.168.233.100?? ?kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.233.30
k8s集群node01:192.168.233.60?? ?kubelet kube-proxy docker?
k8s集群node02:192.168.233.70
etcd集群節(jié)點1:192.168.233.100?? ?etcd
etcd集群節(jié)點2:192.168.233.60 ? ?etcd
etcd集群節(jié)點3:192.168.233.70 ? ?etcd
負載均衡nginx+keepalive01(master):192.168.233.10
負載均衡nginx+keepalive02(backup):192.168.233.20
VIP 192.168.233.111
操作系統(tǒng)初始化配置
關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
關閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab?
根據(jù)規(guī)劃設置主機名
hostnamectl set-hostname master01
hostnamectl set-hostname master02
hostnamectl set-hostname node01
hostnamectl set-hostname node02
在master添加hosts
cat >> /etc/hosts << EOF
192.168.233.100 master01
192.168.233.30 master02
192.168.233.60 node01
192.168.233.70 node02
EOF
調整內核參數(shù)
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉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
部署 docker引擎
所有 node 節(jié)點部署docker引擎
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
systemctl start docker.service
systemctl enable docker.service?
部署 etcd 集群
etcd是CoreOS團隊于2013年6月發(fā)起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數(shù)據(jù)庫。etcd內部采用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通信(這兩個端口已經被IANA(互聯(lián)網數(shù)字分配機構)官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內部通訊。
etcd 在生產環(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é)點之間進行驗證和通信。
這里全部都使用同一套證書認證。
在 master01 節(jié)點上操作 ? ??
準備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*
cfssl:證書簽發(fā)的工具命令
cfssljson:將 cfssl 生成的證書(json格式)變?yōu)槲募休d式證書
cfssl-certinfo:驗證證書的信息
cfssl-certinfo -cert <證書名稱>?? ??? ??? ?#查看證書的信息
?
生成Etcd證書
mkdir /opt/k8s
cd /opt/k8s/
上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
chmod +x etcd-cert.sh etcd.sh
創(chuàng)建用于生成CA證書、etcd 服務器證書以及私鑰的目錄
mkdir /opt/k8s/etcd-cert
mv etcd-cert.sh etcd-cert/
cd /opt/k8s/etcd-cert/
./etcd-cert.sh?? ??? ??? ?#生成CA證書、etcd 服務器證書以及私鑰
上傳 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-linux-amd64.tar.gz
cd /opt/k8s/
tar zxvf etcd-v3.4.9-linux-amd64.tar.gz
ls etcd-v3.4.9-linux-amd64
Documentation ?etcd ?etcdctl ?README-etcdctl.md ?README.md ?READMEv2-etcdctl.md
etcd就是etcd 服務的啟動命令,后面可跟各種啟動參數(shù)
etcdctl主要為etcd 服務提供了命令行操作
#創(chuàng)建用于存放 etcd 配置文件,命令文件,證書的目錄
mkdir -p /opt/etcd/{cfg,bin,ssl}
cd /opt/k8s/etcd-v3.4.9-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.233.100 etcd02=https://192.168.233.60:2380,etcd03=https://192.168.233.70:2380
進入卡住狀態(tài)等待其他節(jié)點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節(jié)點都已啟動,可忽略這個情況
可另外打開一個窗口查看etcd進程是否正常
ps -ef | grep etcd
把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節(jié)點
scp -r /opt/etcd/ root@192.168.233.60:/opt/
scp -r /opt/etcd/ root@192.168.233.70:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.233.60:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.233.70:/usr/lib/systemd/system/
在 node01 節(jié)點上操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd02"?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?#修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.233.60:2380"?? ??? ??? ?#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.233.60:2379"?? ??? ?#修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.233.60:2380"?? ??? ?#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.233.60:2379"?? ??? ??? ??? ?#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.233.100:2380,etcd02=https://192.168.233.60:2380,etcd03=https://192.168.233.70:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
啟動etcd服務
systemctl start etcd
systemctl enable etcd ????##systemctl enable --now etcd
systemctl status etcd
systemctl在enable、disable、mask子命令里面增加了--now選項,可以激活同時啟動服務,激活同時停止服務等。
在 node02 節(jié)點上操作
vim /opt/etcd/cfg/etcd
#[Member]
ETCD_NAME="etcd03"?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?#修改
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://192.168.233.70:2380"?? ??? ??? ?#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.233.70:2379"?? ??? ?#修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.233.70:2380"?? ??? ?#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.233.70:2379"?? ??? ??? ??? ?#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.233.100:2380,etcd02=https://192.168.233.60:2380,etcd03=https://192.168.233.70:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
啟動etcd服務
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.233.100:2379,https://192.168.233.60:2379,https://192.168.233.70:2379" endpoint health --write-out=table
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.233.100:2379,https://192.168.233.60:2379,https://192.168.233.70:2379" endpoint status --write-out=table
--cert-file:識別HTTPS端使用SSL證書文件
--key-file:使用此SSL密鑰文件標識HTTPS客戶端
--ca-file:使用此CA證書驗證啟用https的服務器的證書
--endpoints:集群中以逗號分隔的機器地址列表
cluster-health:檢查etcd集群的運行狀況
查看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.233.100:2379,https://192.168.233.60:2379,https://192.168.233.70:2379" --write-out=table member list
部署 Master 組件
在 master01 節(jié)點上操作
上傳 master.zip 和 k8s-cert.sh 到 /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證書、相關組件的證書和私鑰的目錄
mkdir /opt/k8s/k8s-cert
mv /opt/k8s/k8s-cert.sh /opt/k8s/k8s-cert
cd /opt/k8s/k8s-cert/
./k8s-cert.sh?? ??? ??? ??? ?#生成CA證書、相關組件的證書和私鑰
復制CA證書、apiserver相關證書和私鑰到 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.md
注:打開鏈接你會發(fā)現(xiàn)里面有很多包,下載一個server包就夠了,包含了Master和Worker Node二進制文件。
cd /opt/k8s/
tar zxvf kubernetes-server-linux-amd64.tar.gz
復制master組件的關鍵命令文件到 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 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創(chuàng)建了一個這個用戶,接下來就可以用 RBAC 給他授權
cd /opt/k8s/
vim token.sh
#!/bin/bash
#獲取隨機數(shù)前16個字節(jié)內容,以十六進制格式輸出,并刪除其中空格
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
./token.sh
cat /opt/kubernetes/cfg/token.csv
二進制文件、token、證書都準備好后,開啟 apiserver 服務
cd /opt/k8s/
./apiserver.sh 192.168.233.100 https://192.168.233.100:2379,https://192.168.233.60:2379,https://192.168.233.70:2379
檢查進程是否啟動成功
ps aux | grep kube-apiserver
netstat -natp | grep 6443 ?
安全端口6443用于接收HTTPS請求,用于基于Token文件或客戶端證書等認證
啟動 scheduler 服務
cd /opt/k8s/
./scheduler.sh
ps aux | grep kube-scheduler
啟動 controller-manager 服務
./controller-manager.sh
ps aux | grep kube-controller-manager
生成kubectl連接集群的kubeconfig文件
./admin.sh
#通過kubectl工具查看當前集群組件狀態(tài)
kubectl get cs
查看版本信息
kubectl version
部署 Worker Node 組件
在所有 node 節(jié)點上操作
創(chuàng)建kubernetes工作目錄
mkdir -p /opt/kubernetes/{bin,cfg,ssl,logs}
上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
cd /opt/
unzip node.zip
chmod +x kubelet.sh proxy.sh
在 master01 節(jié)點上操作
把 kubelet、kube-proxy 拷貝到 node 節(jié)點
cd /opt/k8s/kubernetes/server/bin
scp kubelet kube-proxy root@192.168.233.60:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.233.70:/opt/kubernetes/bin/
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
kubeconfig 文件包含集群參數(shù)(CA 證書、API Server 地址),客戶端參數(shù)(上面生成的證書和私鑰),集群 context 上下文參數(shù)(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.233.100 /opt/k8s/k8s-cert/
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.233.60:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.233.70:/opt/kubernetes/cfg/
RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發(fā)起 CSR 請求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
若執(zhí)行失敗,可先給kubectl綁定默認cluster-admin管理員集群角色,授權集群操作權限
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubelet 采用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的注冊,在 node 節(jié)點量較大或者后期自動擴容時非常有用。
Master apiserver 啟用 TLS 認證后,node 節(jié)點 kubelet 組件想要加入集群,必須使用CA簽發(fā)的有效證書才能與 apiserver 通信,當 node 節(jié)點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstraping 機制來自動頒發(fā)客戶端證書,kubelet 會以一個低權限用戶自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態(tài)簽署。
kubelet 首次啟動通過加載 bootstrap.kubeconfig 中的用戶 Token 和 apiserver CA 證書發(fā)起首次 CSR 請求,這個 Token 被預先內置在 apiserver 節(jié)點的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組;想要首次 CSR 請求能成功(即不會被 apiserver 401 拒絕),則需要先創(chuàng)建一個 ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內置 ClusterRole 綁定(通過 kubectl get clusterroles 可查詢),使其能夠發(fā)起 CSR 認證請求。
TLS bootstrapping 時的證書實際是由 kube-controller-manager 組件來簽署的,也就是說證書有效期是 kube-controller-manager 組件控制的;kube-controller-manager 組件提供了一個 --experimental-cluster-signing-duration 參數(shù)來設置簽署的證書有效時間;默認為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進行 TLS bootstrapping 簽署證書即可。
也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過后,Controller Manager 會為 kubelet 生成一個證書,以后的訪問都是用證書做認證了。
在 node01 節(jié)點上操作
啟動 kubelet 服務
cd /opt/
./kubelet.sh 192.168.233.60
ps aux | grep kubelet
在 master01 節(jié)點上操作,通過 CSR 請求
檢查到 node01 節(jié)點的 kubelet 發(fā)起的 CSR 請求,Pending 表示等待集群給該節(jié)點簽發(fā)證書
kubectl get csr
通過 CSR 請求
kubectl certificate approve node-csr-xM6TwQtEBgXEI7eQN7QZ-E3eukcsGOldLly8sFasBnc
#Approved,Issued 表示已授權 CSR 請求并簽發(fā)證書
kubectl get csr
#查看節(jié)點,由于網絡插件還沒有部署,節(jié)點會沒有準備就緒 NotReady
kubectl get node
在 node01 節(jié)點上操作
加載 ip_vs 模塊文章來源:http://www.zghlxwxcb.cn/news/detail-736014.html
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
啟動proxy服務文章來源地址http://www.zghlxwxcb.cn/news/detail-736014.html
cd /opt/
./proxy.sh 192.168.233.60
ps aux | grep kube-proxy
到了這里,關于二進制搭建 Kubernetes與k8s集群搭建(一)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!