目錄
二進制搭建 Kubernetes v1.20
操作系統初始化配置
關閉防火墻
關閉selinux
關閉swap
根據規(guī)劃設置主機名
在master添加hosts
調整內核參數
時間同步
部署 etcd 集群
準備簽發(fā)證書環(huán)境
準備cfssl證書生成工具
生成Etcd證書
上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中
創(chuàng)建用于生成CA證書、etcd 服務器證書以及私鑰的目錄
上傳 etcd-v3.4.9-linux-amd64.tar.gz 到 /opt/k8s 目錄中,啟動etcd服務
創(chuàng)建用于存放 etcd 配置文件,命令文件,證書的目錄
可另外打開一個窗口查看etcd進程是否正常
把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節(jié)點
檢查etcd群集狀態(tài)
查看etcd集群成員列表
部署 docker引擎
部署 Master 組件
上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip 壓縮包
創(chuàng)建kubernetes工作目錄
創(chuàng)建用于生成CA證書、相關組件的證書和私鑰的目錄
復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中
上傳 kubernetes-server-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 kubernetes 壓縮包cd /opt/k8s/
復制master組件的關鍵命令文件到 kubernetes工作目錄的 bin 子目錄中
創(chuàng)建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當于在集群內創(chuàng)建了一個這個用戶,接下來就可以用 RBAC 給他授權
二進制文件、token、證書都準備好后,開啟 apiserver 服務
檢查進程是否啟動成功
啟動 scheduler 服務
啟動 controller-manager 服務
生成kubectl連接集群的kubeconfig文件
綁定默認cluster-admin管理員集群角色,授權kubectl訪問集群
通過kubectl工具查看當前集群組件狀態(tài)
查看版本信息
部署 Worker Node 組件
創(chuàng)建kubernetes工作目錄
上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh
在 master01 節(jié)點上操作把 kubelet、kube-proxy 拷貝到 node 節(jié)點
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點s
#RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發(fā)起 CSR 請求證書
啟動 kubelet 服務
檢查到 node01 節(jié)點的 kubelet 發(fā)起的 CSR 請求,Pending 表示等待集群給該節(jié)點簽發(fā)證書
通過 CSR 請求
Approved,Issued 表示已授權 CSR 請求并簽發(fā)證書
查看節(jié)點,由于網絡插件還沒有部署,節(jié)點會沒有準備就緒 NotReady
加載 ip_vs 模塊
啟動proxy服務
部署 CNI 網絡組件
部署 flannel
K8S 中 Pod 網絡通信:
●Pod 內容器與容器之間的通信
●同一個 Node 內 Pod 之間的通信
●不同 Node 上 Pod 之間的通信
Overlay Network:
VXLAN:
Flannel:
Flannel udp 模式的工作原理:
ETCD 之 Flannel 提供說明:
vxlan 模式:
Flannel vxlan 模式的工作原理:
上傳 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目錄中
上傳 kube-flannel.yml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
?創(chuàng)建pod
部署 Calico
k8s 組網方案對比:
●flannel方案
●calico方案
Calico 主要由三個部分組成:
Calico 工作原理:
上傳 calico.yaml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
kubectl delete -f kube-flannel.yml
等 Calico Pod 都 Running,節(jié)點也會準備就緒
部署 CoreDNS
上傳 coredns.tar 到 /opt 目錄中
上傳 coredns.yaml 文件到 /opt/k8s 目錄中,部署 CoreDNS?
DNS 解析測試
從 master01 節(jié)點上拷貝證書文件、各master組件的配置文件和服務管理文件到 master02 節(jié)點
修改配置文件kube-apiserver中的IP
在 master02 節(jié)點上啟動各服務并設置開機自啟
查看node節(jié)點狀態(tài)
負載均衡部署
配置nginx的官方在線yum源,配置本地nginx的yum源
修改nginx配置文件,配置四層反向代理負載均衡,指定k8s群集2臺master的節(jié)點ip和6443端口
檢查配置文件語法
啟動nginx服務,查看已監(jiān)聽6443端口
部署keepalived服務
修改keepalived配置文件
創(chuàng)建nginx狀態(tài)檢查腳本?
啟動keepalived服務(一定要先啟動了nginx服務,再啟動keepalived服務)
修改node節(jié)點上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP
重啟kubelet和kube-proxy服務
在 lb01 上查看 nginx 和 node 、 master 節(jié)點的連接狀態(tài)
測試創(chuàng)建pod
查看Pod的狀態(tài)信息
部署 Dashboard
Dashboard 介紹
上傳 recommended.yaml 文件到 /opt/k8s 目錄中
二進制搭建 Kubernetes v1.20
k8s集群master01:192.168.110.100? ? kube-apiserver kube-controller-manager kube-scheduler etcd
k8s集群master02:192.168.110.60
k8s集群node01:192.168.110.90? ? kubelet kube-proxy docker?
k8s集群node02:192.168.110.70
etcd集群節(jié)點1:192.168.110.100? ? ? etcd
etcd集群節(jié)點2:192.168.110.90??
etcd集群節(jié)點3:192.168.110.70
負載均衡nginx+keepalive01(master): 192.168.110.50
負載均衡nginx+keepalive02(backup): 192.168.110.60
操作系統初始化配置
關閉防火墻
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?
根據規(guī)劃設置主機名
hostnamectl set-hostname master01
hostnamectl set-hostname node01
hostnamectl set-hostname node02
在master添加hosts
cat >> /etc/hosts << EOF
192.168.110.100 master01
192.168.110.90 node01
192.168.110.70 node02
EOF
調整內核參數
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF
sysctl --system
時間同步
yum install ntpdate -y
ntpdate ntp.aliyun.com
crontab -e
*/30 * * * * /usr/local/bin/ntpdate ntp.aliyun.com
部署 etcd 集群
etcd是CoreOS團隊于2013年6月發(fā)起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。
etcd 作為服務發(fā)現系統,有以下的特點:
簡單:安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
安全:支持SSL證書驗證
快速:單實例支持每秒2k+讀操作
可靠:采用raft算法,實現分布式系統數據的可用性和一致性
etcd 目前默認使用2379端口提供HTTP API服務, 2380端口和peer通信(這兩個端口已經被IANA(互聯網數字分配機構)官方預留給etcd)。 即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內部通訊。
etcd 在生產環(huán)境中一般推薦集群方式部署。由于etcd 的leader選舉機制,要求至少為3臺或以上的奇數臺。
準備簽發(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é)點上操作文章來源地址http://www.zghlxwxcb.cn/news/detail-632864.html
準備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 服務器證書以及私鑰
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服務
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 服務的啟動命令,后面可跟各種啟動參數
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.110.100 etcd02=https://192.168.110.90:2380,etcd03=https://192.168.110.70:2380
#進入卡住狀態(tài)等待其他節(jié)點加入,這里需要三臺etcd服務同時啟動,如果只啟動其中一臺后,服務會卡在那里,直到集群中所有etcd節(jié)點都已啟動,可忽略這個情況
可另外打開一個窗口查看etcd進程是否正常
ps -ef | grep etcd
把etcd相關證書文件、命令文件和服務管理文件全部拷貝到另外兩個etcd集群節(jié)點
scp -r /opt/etcd/ root@192.168.110.90:/opt/
scp -r /opt/etcd/ root@192.168.110.70:/opt/
scp /usr/lib/systemd/system/etcd.service root@192.168.110.90:/usr/lib/systemd/system/
scp /usr/lib/systemd/system/etcd.service root@192.168.110.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.110.90:2380"?? ??? ??? ?#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.110.90:2379"?? ??? ?#修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.110.90:2380"?? ??? ?#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.110.90:2379"?? ??? ??? ??? ?#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.110.100:2380,etcd02=https://192.168.110.90:2380,etcd03=https://192.168.110.70:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
啟動etcd服務
systemctl start etcd
systemctl enable etcd
systemctl status etcd
在 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.110.70:2380"?? ??? ??? ?#修改
ETCD_LISTEN_CLIENT_URLS="https://192.168.110.70:2379"?? ??? ?#修改
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.110.70:2380"?? ??? ?#修改
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.110.70:2379"?? ??? ??? ??? ?#修改
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.110.100:2380,etcd02=https://192.168.110.90:2380,etcd03=https://192.168.110.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.110.100:2379,https://192.168.110.90:2379,https://192.168.110.70:2379" endpoint health --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.110.100:2379,https://192.168.110.90:2379,https://192.168.110.70:2379" --write-out=table member list
部署 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?
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://20s3uutt.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "500m", "max-file": "3"
}
}
systemctl restart docker
部署 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證書、相關組件的證書和私鑰
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相關證書和私鑰到 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
復制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
#獲取隨機數前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.110.100 https://192.168.110.100:2379,https://192.168.110.90:2379,https://192.168.110.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
綁定默認cluster-admin管理員集群角色,授權kubectl訪問集群
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
kubectl create clusterrolebinding node-autoapprove-bootstrap --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient --user=kubelet-bootstrap?
kubectl create clusterrolebinding node-autoapprove-certificate-rotation --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient --user=kubelet-bootstrap
通過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
部署 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.110.90:/opt/kubernetes/bin/
scp kubelet kube-proxy root@192.168.110.70:/opt/kubernetes/bin/
上傳kubeconfig.sh文件到/opt/k8s/kubeconfig目錄中,生成kubelet初次加入集群引導kubeconfig文件和kube-proxy.kubeconfig文件
kubeconfig 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。
mkdir /opt/k8s/kubeconfig
cd /opt/k8s/kubeconfig
chmod +x kubeconfig.sh
./kubeconfig.sh 192.168.110.100 /opt/k8s/k8s-cert/
把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節(jié)點
s
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.110.90:/opt/kubernetes/cfg/
scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.110.70:/opt/kubernetes/cfg/
#RBAC授權,使用戶 kubelet-bootstrap 能夠有權限發(fā)起 CSR 請求證書
kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
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 參數來設置簽署的證書有效時間;默認為 8760h0m0s,將其改為 87600h0m0s,即 10 年后再進行 TLS bootstrapping 簽署證書即可。
也就是說 kubelet 首次訪問 API Server 時,是使用 token 做認證,通過后,Controller Manager 會為 kubelet 生成一個證書,以后的訪問都是用證書做認證了。
在 node01 節(jié)點上操作
啟動 kubelet 服務
cd /opt/
./kubelet.sh 192.168.110.90
ps aux | grep kubelet
在 master01 節(jié)點上操作,通過 CSR 請求
檢查到 node01 節(jié)點的 kubelet 發(fā)起的 CSR 請求,Pending 表示等待集群給該節(jié)點簽發(fā)證書
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-L-RyWyWX3YvvR1NzSp4IQfeZYx_7Ktgi5_na52LIZ4k 69m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
node-csr-kNnDWNHkryop_Bu4OQMfl2rwFzF8CRlyc2nTWIIFhaY 69m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending
通過 CSR 請求
kubectl certificate approve node-csr-L-RyWyWX3YvvR1NzSp4IQfeZYx_7Ktgi5_na52LIZ4
kubectl certificate approve node-csr-kNnDWNHkryop_Bu4OQMfl2rwFzF8CRlyc2nTWIIFhaY
Approved,Issued 表示已授權 CSR 請求并簽發(fā)證書
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
node-csr-L-RyWyWX3YvvR1NzSp4IQfeZYx_7Ktgi5_na52LIZ4k 69m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
node-csr-kNnDWNHkryop_Bu4OQMfl2rwFzF8CRlyc2nTWIIFhaY 69m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Approved,Issued
查看節(jié)點,由于網絡插件還沒有部署,節(jié)點會沒有準備就緒 NotReady
kubectl get node
NAME ? ? ? ? ? ? STATUS ? ? ROLES ? ?AGE ? ?VERSION
192.168.110.70 NotReady <none> 58m v1.20.15
192.168.110.90 NotReady <none> 59m v1.20.15
在 node01 節(jié)點上操作
加載 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
啟動proxy服務
cd /opt/
./proxy.sh 192.168.110.90
ps aux | grep kube-proxy
其他節(jié)點同上
部署 CNI 網絡組件
部署 flannel
K8S 中 Pod 網絡通信:
●Pod 內容器與容器之間的通信
在同一個 Pod 內的容器(Pod 內的容器是不會跨宿主機的)共享同一個網絡命令空間,相當于它們在同一臺機器上一樣,可以用 localhost 地址訪問彼此的端口。
●同一個 Node 內 Pod 之間的通信
每個 Pod 都有一個真實的全局 IP 地址,同一個 Node 內的不同 Pod 之間可以直接采用對方 Pod 的 IP 地址進行通信,Pod1 與 Pod2 都是通過 Veth 連接到同一個 docker0 網橋,網段相同,所以它們之間可以直接通信。
●不同 Node 上 Pod 之間的通信
Pod 地址與 docker0 在同一網段,docker0 網段與宿主機網卡是兩個不同的網段,且不同 Node 之間的通信只能通過宿主機的物理網卡進行。
要想實現不同 Node 上 Pod 之間的通信,就必須想辦法通過主機的物理網卡 IP 地址進行尋址和通信。因此要滿足兩個條件:Pod 的 IP 不能沖突;將 Pod 的 IP 和所在的 Node 的 IP 關聯起來,通過這個關聯讓不同 Node 上 Pod 之間直接通過內網 IP 地址通信。
Overlay Network:
疊加網絡,在二層或者三層基礎網絡上疊加的一種虛擬網絡技術模式,該網絡中的主機通過虛擬鏈路隧道連接起來(類似于VPN)。
VXLAN:
將源數據包封裝到UDP中,并使用基礎網絡的IP/MAC作為外層報文頭進行封裝,然后在以太網上傳輸,到達目的地后由隧道端點解封裝并將數據發(fā)送給目標地址。
Flannel:
Flannel 的功能是讓集群中的不同節(jié)點主機創(chuàng)建的 Docker 容器都具有全集群唯一的虛擬 IP 地址。
Flannel 是 Overlay 網絡的一種,也是將 TCP 源數據包封裝在另一種網絡包里面進行路由轉發(fā)和通信,目前支持 udp、vxlan、 host-GW 3種數據轉發(fā)方式。
Flannel udp 模式的工作原理:
數據從 node01 上 Pod 的源容器中發(fā)出后,經由所在主機的 docker0 虛擬網卡轉發(fā)到 flannel.1 虛擬網卡,flanneld 服務監(jiān)聽在 flannel.1 虛擬網卡的另外一端。
Flannel 通過 Etcd 服務維護了一張節(jié)點間的路由表。源主機 node01 的 flanneld 服務將原本的數據內容封裝到 UDP 中后根據自己的路由表通過物理網卡投遞給目的節(jié)點 node02 的 flanneld 服務,數據到達以后被解包,然后直接進入目的節(jié)點的 flannel.1 虛擬網卡,之后被轉發(fā)到目的主機的 docker0 虛擬網卡,最后就像本機容器通信一樣由 docker0 轉發(fā)到目標容器。
ETCD 之 Flannel 提供說明:
存儲管理Flannel可分配的IP地址段資源
監(jiān)控 ETCD 中每個 Pod 的實際地址,并在內存中建立維護 Pod 節(jié)點路由表
由于 udp 模式是在用戶態(tài)做轉發(fā),會多一次報文隧道封裝,因此性能上會比在內核態(tài)做轉發(fā)的 vxlan 模式差。
vxlan 模式:
vxlan 是一種overlay(虛擬隧道通信)技術,通過三層網絡搭建虛擬的二層網絡,跟 udp 模式具體實現不太一樣:
(1)udp模式是在用戶態(tài)實現的,數據會先經過tun網卡,到應用程序,應用程序再做隧道封裝,再進一次內核協議棧,而vxlan是在內核當中實現的,只經過一次協議棧,在協議棧內就把vxlan包組裝好
(2)udp模式的tun網卡是三層轉發(fā),使用tun是在物理網絡之上構建三層網絡,屬于ip in udp,vxlan模式是二層實現, overlay是二層幀,屬于mac in udp
(3)vxlan由于采用mac in udp的方式,所以實現起來會涉及mac地址學習,arp廣播等二層知識,udp模式主要關注路由
Flannel vxlan 模式的工作原理:
vxlan在內核當中實現,當數據包使用vxlan設備發(fā)送數據時,會打上vlxan的頭部信息,在發(fā)送出去,對端解包,flannel.1網卡把原始報文發(fā)送到目的服務器。
在 node01 節(jié)點上操作
上傳 cni-plugins-linux-amd64-v0.8.6.tgz 和 flannel.tar 到 /opt 目錄中
cd /opt/
docker load -i flannel.tar
mkdir /opt/cni/bin
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz -C /opt/cni/bin
在 master01 節(jié)點上操作
上傳 kube-flannel.yml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
cd /opt/k8s
kubectl apply -f kube-flannel.yml?
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-2csc8 1/1 Running 0 24s
kube-flannel kube-flannel-ds-nb2j4 1/1 Running 0 24s
?創(chuàng)建pod
kubectl create deployment ggl --image=nginx --port=80
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.110.70 Ready <none> 133m v1.20.15
192.168.110.90 Ready <none> 133m v1.20.15
部署 Calico
k8s 組網方案對比:
●flannel方案
需要在每個節(jié)點上把發(fā)向容器的數據包進行封裝后,再用隧道將封裝后的數據包發(fā)送到運行著目標Pod的node節(jié)點上。目標node節(jié)點再負責去掉封裝,將去除封裝的數據包發(fā)送到目標Pod上。數據通信性能則大受影響。
●calico方案
Calico不使用隧道或NAT來實現轉發(fā),而是把Host當作Internet中的路由器,使用BGP同步路由,并使用iptables來做安全訪問策略,完成跨Host轉發(fā)來。
Calico 主要由三個部分組成:
Calico CNI插件:主要負責與kubernetes對接,供kubelet調用使用。
Felix:負責維護宿主機上的路由規(guī)則、FIB轉發(fā)信息庫等。
BIRD:負責分發(fā)路由規(guī)則,類似路由器。
Confd:配置管理組件。
Calico 工作原理:
Calico 是通過路由表來維護每個 pod 的通信。Calico 的 CNI 插件會為每個容器設置一個 veth pair 設備, 然后把另一端接入到宿主機網絡空間,由于沒有網橋,CNI 插件還需要在宿主機上為每個容器的 veth pair 設備配置一條路由規(guī)則,用于接收傳入的IP包。
有了這樣的 veth pair 設備以后,容器發(fā)出的IP包就會通過 veth pair 設備到達宿主機,然后宿主機根據路由規(guī)則的下一跳地址, 發(fā)送給正確的網關,然后到達目標宿主機,再到達目標容器。
這些路由規(guī)則都是 Felix 維護配置的,而路由信息則是 Calico BIRD 組件基于 BGP 分發(fā)而來。calico 實際上是將集群里所有的節(jié)點都當做邊界路由器來處理,他們一起組成了一個全互聯的網絡,彼此之間通過 BGP 交換路由,這些節(jié)點我們叫做 BGP Peer。
目前比較常用的時flannel和calico,flannel的功能比較簡單,不具備復雜的網絡策略配置能力,calico是比較出色的網絡管理插件,但具備復雜網絡配置能力的同時,往往意味著本身的配置比較復雜,所以相對而言,比較小而簡單的集群使用flannel,考慮到日后擴容,未來網絡可能需要加入更多設備,配置更多網絡策略,則使用calico更好。
在 master01 節(jié)點上操作
上傳 calico.yaml 文件到 /opt/k8s 目錄中,部署 CNI 網絡
cd /opt/k8s
vim calico.yaml
#修改里面定義Pod網絡(CALICO_IPV4POOL_CIDR),與前面kube-controller-manager配置文件指定的cluster-cidr網段一樣
? ? - name: CALICO_IPV4POOL_CIDR
? ? ? value: "10.244.0.0/16"
kubectl delete -f kube-flannel.yml
注:不能兩個插件一起使用,要是用另一個就要卸掉了另一個
kubectl apply -f calico.yaml
kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-659bd7879c-zchhl 1/1 Running 0 71m
calico-node-svsd7 1/1 Running 0 71m
calico-node-zts9x 1/1 Running 0 71m
等 Calico Pod 都 Running,節(jié)點也會準備就緒
kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.110.70 Ready <none> 4h7m v1.20.15
192.168.110.90 Ready <none> 4h7m v1.20.15
部署 CoreDNS
kubectl get pods -o wide
ggl-84d79666cf-sr89g 1/1 Running 0 8m34s 10.244.218.68 192.168.110.70 <none> <none>
qhw-746d7bdb59-kgxl4 1/1 Running 0 28m 10.244.218.67 192.168.110.70 <none> <none>
ycx-84755b9b77-7rnxj 1/1 Running 0 42m 10.244.162.130 192.168.110.90 <none> <none>
zxr-664b6c8c9c-jwrk6 1/1 Running 0 71m 10.244.162.129 192.168.110.90 <none> <none>
在master01上curl 10.244.218.68不會訪問成功,在節(jié)點上會訪問成功。在用
kubectl delete pod ggl-84d79666cf-sr89g
后,他會換一個節(jié)點重新生成,并且重新生成一個新的ip,這個時候我們用kubectl describe service ggl就會發(fā)現IP又換了一個新的,但是Endpoints沒有變,集群ip沒有變
kubectl expose deployment ggl --port=80 --target-port=80
kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ggl ClusterIP 10.0.0.178 <none> 80/TCP 24s
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 27h
kubectl describe service ggl
Name: ggl
Namespace: default
Labels: app=ggl
Annotations: <none>
Selector: app=ggl
Type: ClusterIP
IP Families: <none>
IP: 10.0.0.178
IPs: 10.0.0.178
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.162.131:80
Session Affinity: None
Events: <none>
?用這條命令修改pod名字,集群IP也會改變,非常難辦,但是pod名字沒有變,我們可以用CoreDNS來固定pod
kubectl expose deployment ggl --port=80 --name ggl --target-port=80
在所有 node 節(jié)點上操作
上傳 coredns.tar 到 /opt 目錄中
cd /opt
docker load -i coredns.tar
在 master01 節(jié)點上操作
上傳 coredns.yaml 文件到 /opt/k8s 目錄中,部署 CoreDNS?
cd /opt/k8s
kubectl apply -f coredns.yaml
kubectl get pods -n kube-system
NAME ? ? ? ? ? ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
coredns-5ffbfd976d-j6shb ? ? ?1/1 ? ? Running ? 0 ? ? ? ? ?32s
DNS 解析測試
kubectl run -it --rm dns-test --image=busybox:1.28.4 sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: ? ?10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
Name: ? ? ?kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
master02 節(jié)點部署
從 master01 節(jié)點上拷貝證書文件、各master組件的配置文件和服務管理文件到 master02 節(jié)點
scp -r /opt/etcd/ root@192.168.110.60:/opt/
scp -r /opt/kubernetes/ root@192.168.110.60:/opt
scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.110.60:/usr/lib/systemd/system/
scp ./kube 192.168.110.60:/root
修改配置文件kube-apiserver中的IP
vim /opt/kubernetes/cfg/kube-apiserver
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.110.100:2379,https://192.168.110.90:2379,https://192.168.110.70:2379 \
--bind-address=192.168.110.60 \?? ??? ??? ??? ?#修改
--secure-port=6443 \
--advertise-address=192.168.110.60 \?? ??? ??? ?#修改
......
在 master02 節(jié)點上啟動各服務并設置開機自啟
systemctl start kube-apiserver.service
systemctl enable kube-apiserver.service
systemctl start kube-controller-manager.service
systemctl enable kube-controller-manager.service
systemctl start kube-scheduler.service
systemctl enable kube-scheduler.service
查看node節(jié)點狀態(tài)
ln -s /opt/kubernetes/bin/* /usr/local/bin/
kubectl get nodes
kubectl get nodes -o wide?? ??? ??? ?#-o=wide:輸出額外信息;對于Pod,將輸出Pod所在的Node名
此時在master02節(jié)點查到的node節(jié)點狀態(tài)僅是從etcd查詢到的信息,而此時node節(jié)點實際上并未與master02節(jié)點建立通信連接,因此需要使用一個VIP把node節(jié)點與master節(jié)點都關聯起來
負載均衡部署
配置load balancer集群雙機熱備負載均衡(nginx實現負載均衡,keepalived實現雙機熱備)
##### 在lb01、lb02節(jié)點上操作 #####?
配置nginx的官方在線yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF
yum install nginx -y
修改nginx配置文件,配置四層反向代理負載均衡,指定k8s群集2臺master的節(jié)點ip和6443端口
vim /etc/nginx/nginx.conf
events {
? ? worker_connections ?1024;
}
#添加
stream {
? ? log_format ?main ?'$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';
? ??
?? ?access_log ?/var/log/nginx/k8s-access.log ?main;
? ? upstream k8s-apiserver {
? ? ? ? server 192.168.80.10:6443;
? ? ? ? server 192.168.80.20:6443;
? ? }
? ? server {
? ? ? ? listen 6443;
? ? ? ? proxy_pass k8s-apiserver;
? ? }
}
http {
......
檢查配置文件語法
nginx -t ?
啟動nginx服務,查看已監(jiān)聽6443端口
systemctl start nginx
systemctl enable nginx
netstat -natp | grep nginx
部署keepalived服務
yum install keepalived -y
修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
? ?# 接收郵件地址
? ?notification_email {
? ? ?acassen@firewall.loc
? ? ?failover@firewall.loc
? ? ?sysadmin@firewall.loc
? ?}
? ?# 郵件發(fā)送地址
? ?notification_email_from Alexandre.Cassen@firewall.loc
? ?smtp_server 127.0.0.1
? ?smtp_connect_timeout 30
? ?router_id NGINX_MASTER?? ?#lb01節(jié)點的為 NGINX_MASTER,lb02節(jié)點的為 NGINX_BACKUP
}
#添加一個周期性執(zhí)行的腳本
vrrp_script check_nginx {
? ? script "/etc/nginx/check_nginx.sh"?? ?#指定檢查nginx存活的腳本路徑
}
vrrp_instance VI_1 {
? ? state MASTER?? ??? ??? ?#lb01節(jié)點的為 MASTER,lb02節(jié)點的為 BACKUP
? ? interface ens33?? ??? ??? ?#指定網卡名稱 ens33
? ? virtual_router_id 51?? ?#指定vrid,兩個節(jié)點要一致
? ? priority 100?? ??? ??? ?#lb01節(jié)點的為 100,lb02節(jié)點的為 90
? ? advert_int 1
? ? authentication {
? ? ? ? auth_type PASS
? ? ? ? auth_pass 1111
? ? }
? ? virtual_ipaddress {
? ? ? ? 192.168.80.100/24?? ?#指定 VIP
? ? }
? ? track_script {
? ? ? ? check_nginx?? ??? ??? ?#指定vrrp_script配置的腳本
? ? }
}
創(chuàng)建nginx狀態(tài)檢查腳本?
vim /etc/nginx/check_nginx.sh
#!/bin/bash
#egrep -cv "grep|$$" 用于過濾掉包含grep 或者 $$ 表示的當前Shell進程ID
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
? ? systemctl stop keepalived
fi
chmod +x /etc/nginx/check_nginx.sh
啟動keepalived服務(一定要先啟動了nginx服務,再啟動keepalived服務)
systemctl start keepalived
systemctl enable keepalived
ip a?? ??? ??? ??? ?#查看VIP是否生成
修改node節(jié)點上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP
cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig?
server: https://192.168.80.100:6443
? ? ? ? ? ? ? ? ? ? ??
vim kubelet.kubeconfig
server: https://192.168.80.100:6443
? ? ? ? ? ? ? ? ? ? ? ??
vim kube-proxy.kubeconfig
server: https://192.168.80.100:6443
重啟kubelet和kube-proxy服務
systemctl restart kubelet.service?
systemctl restart kube-proxy.service
在 lb01 上查看 nginx 和 node 、 master 節(jié)點的連接狀態(tài)
netstat -natp | grep nginx
tcp ? ? ? ?0 ? ? ? 0 0.0.0.0:6443 ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?44904/nginx: master?
tcp ? ? ? ?0 ? ? ? 0 0.0.0.0:80 ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?44904/nginx: master?
tcp ? ? ? ?0 ? ? ?0 192.168.110.100:6443 ? ?192.168.110.70:46954 ? ? ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.70:45074 ? ? 192.168.110.100:6443 ? ??ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.90:53308 ? ? 192.168.110.70:6443 ? ? ?ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.20:53316 ? ? 192.168.110.90:6443 ? ? ?ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.17:6443 ? ? 192.168.110.90:48784 ? ? ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.20:45070 ? ? 192.168.110.100:6443 ? ?ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.17:6443 ? ? 192.168.110.90:48794 ? ? ESTABLISHED 44905/nginx: worker?
tcp ? ? ? ?0 ? ? ?0 192.168.110.17:6443 ? ? 192.168.110.70:46968 ? ? ESTABLISHED 44905/nginx: worker?
在 master01 節(jié)點上操作
測試創(chuàng)建pod
kubectl run nginx --image=nginx
查看Pod的狀態(tài)信息
kubectl get pods
NAME ? ? ? ? ? ? ? ? ? ?READY ? STATUS ? ? ? ? ? ? ?RESTARTS ? AGE
nginx-dbddb74b8-nf9sk ? 0/1 ? ? ContainerCreating ? 0 ? ? ? ? ?33s ? #正在創(chuàng)建中
kubectl get pods
NAME ? ? ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE
nginx-dbddb74b8-nf9sk ? 1/1 ? ? Running ? 0 ? ? ? ? ?80s ??? ??? ??? ?#創(chuàng)建完成,運行中
kubectl get pods -o wide
NAME ? ? ? ? ? ? ? ? ? ?READY ? STATUS ? ?RESTARTS ? AGE ? IP ? ? ? ? ? ?NODE ? ? ? ? ? ?NOMINATED NODE
nginx-dbddb74b8-26r9l ? 1/1 ? ? Running ? 0 ? ? ? ? ?10m ? 172.17.36.2 ? 192.168.80.15 ? <none>
//READY為1/1,表示這個Pod中有1個容器
//在對應網段的node節(jié)點上操作,可以直接使用瀏覽器或者curl命令訪問
curl 172.17.36.2
//這時在master01節(jié)點上查看nginx日志,發(fā)現沒有權限查看
kubectl logs nginx-dbddb74b8-nf9sk
部署 Dashboard
Dashboard 介紹
儀表板是基于Web的Kubernetes用戶界面。您可以使用儀表板將容器化應用程序部署到Kubernetes集群,對容器化應用程序進行故障排除,并管理集群本身及其伴隨資源。您可以使用儀表板來概述群集上運行的應用程序,以及創(chuàng)建或修改單個Kubernetes資源(例如部署,作業(yè),守護進程等)。例如,您可以使用部署向導擴展部署,啟動滾動更新,重新啟動Pod或部署新應用程序。儀表板還提供有關群集中Kubernetes資源狀態(tài)以及可能發(fā)生的任何錯誤的信息。文章來源:http://www.zghlxwxcb.cn/news/detail-632864.html
在 master01 節(jié)點上操作
上傳 recommended.yaml 文件到 /opt/k8s 目錄中
cd /opt/k8s
vim recommended.yaml
#默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部:
kind: Service
apiVersion: v1
metadata:
? labels:
? ? k8s-app: kubernetes-dashboard
? name: kubernetes-dashboard
? namespace: kubernetes-dashboard
spec:
? ports:
? ? - port: 443
? ? ? targetPort: 8443
? ? ? nodePort: 30001 ? ? #添加
? type: NodePort ? ? ? ? ?#添加
? selector:
? ? k8s-app: kubernetes-dashboard
kubectl apply -f recommended.yaml
#創(chuàng)建service account并綁定默認cluster-admin管理員集群角色
kubectl create serviceaccount dashboard-admin -n kube-system
kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
#使用輸出的token登錄Dashboard
https://NodeIP:30001
到了這里,關于【Kubernetes】二進制搭建的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!