K8S二進制部署


常見的K8S按照部署方式

●Mini kube

Minikube是一個工具,可以在本地快速運行一個單節點微型K8S,僅用於學習、預覽K8S的一些特性使用

部署地址:https://kubernetes.io/docs/setup/minikube

 

●Kubeadmin

Kubeadmin也是一個工具,提供kubeadm init和kubeadm join,用於快速部署K8S集群,相對簡單。

https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

 

●二進制安裝部署

生產首選,從官方下載發行版的二進制包,手動部署每個組件和自簽TLS證書,組成K8S集群,新手推薦。https://github.com/kubernetes/kubernetes/releases

 

小結∶ Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查。如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利於后期維護。

Kubernetes二進制部署(環境准備)

服務器

IP地址

安裝工具

K8s集群master01

(ectd節點1)

192.168.150.5

cfssl、cfssljson、cfssl-certinfo、etcd

K8s集群node01

(etcd節點2)

192.168.150.10

cfssl、cfssljson、cfssl-certinfo、etcd、Flannel、docker

k8s集群node02

(etcd節點3)

192.168.150.15

cfssl、cfssljson、cfssl-certinfo、etcd、Flannel、docker

#關閉防火牆 systemctl stop firewalld systemctl disable firewalld #關閉SE安全中心 setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config #關閉swap swapoff -a #臨時關閉 sed -ri 's/.*swap.*/#&/' /etc/fstab #永久關閉,&符號代表前面匹配的所有 #根據規划設置主機名 hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02 #在master添加hosts cat >> /etc/hosts << EOF 192.168.150.5 master01 192.168.150.10 node01 192.168.150.15 node02 EOF #將橋接的IPv4流量傳遞到iptables的鏈 cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system #時間同步,可以加入計划任務定時執行減小偏差 yum install ntpdate -y ntpdate time.windows.com

Kubernetes二進制部署(部署 etcd 集群

etcd是CoreOS團隊於2013年6月發起的開源項目,它的目標是構建一個高可用的分布式鍵值(key-value)數據庫。etcd內部采用raft協議作為一致性算法,etcd是go語言編寫的。

 

etcd 作為服務發現系統,有以下的特點

簡單∶安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單

安全∶支持SSL證書驗證

快速∶單實例支持每秒2k+讀操作

可靠∶采用raft算法,實現分布式系統數據的可用性和一致性

 

etcd 目前默認使用2379端口提供HTTP API服務,2380端口和peer通信(這兩個端口已經被IANA(互聯網數字分配機構)官方預留給etcd)。

即etcd默認使用2379端口對外為客戶端提供通訊,使用端口2380來進行服務器間內部通訊。

etcd 在生產環境中一般推薦集群方式部署。由於etcd 的leader選舉機制,要求至少為3台或以上的奇數台。

 

准備簽發證書環境

CFSSL是CloudFlare 公司開源的一款 PKI/TLS 工具。CFSSL包含一個命令行工具和一個用簽名、驗證和捆綁 TLS 證書的 HTP API 服務。使用Go語言編寫。

CESSL 使用配置文件生成證書,因此自簽之前,需要生成它識別的 json 格式的配置文件,CESSL提供了方便的命令行生成配置文件。

CFSSL用來為 etcd 提供 TLS 證書,它支持簽三種類型的證書∶

1、client 證書,服務端連接客戶端時攜帶的證書,用於客戶端驗證服務端身份,如 kube-apiserver 訪問 etcd

2、server 證書,客戶端連接服務端時攜帶的證書,用於服務端驗證客戶端身份,如 etcd 對外提供服務

3、peer 證書,相互之間連接時使用的證書,如 etcd 節點之間進行驗證和通信。這里全部都使用同一套證書認證。

 在 master01 節點上操作下載證書制作工具

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 或 curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo chmod +x /usr/local/bin/cfssl* #提前下載好拉入/usr/local/bin/目錄並授權 字段解析 cfssl∶證書簽發的工具命令 cfssljson∶將 cfssl 生成的證書(json格式)變為文件承載式證書 cfssl-certinfo∶驗證證書的信息 cfssl-certinfo-cert <證書名稱> #查看證書的信息 #創建k8s工作目錄 mkdir /opt/k8s cd /opt/k8s/ #上傳 etcd-cert.sh 和 etcd.sh 到 /opt/k8s/ 目錄中 chmod +x etcd-cert.sh etcd.sh #創建用於生成CA證書、etcd 服務器證書以及私鑰的目錄 mkdir /opt/k8s/etcd-cert mv etcd-cert.sh etcd-cert/ cd /opt/k8s/etcd-cert/ ./etcd-cert.sh #生成CA證書、etcd 服務器證書以及私鑰

啟動etcd服務

# etcd 二進制包地址:https://github.com/etcd-io/etcd/releases #上傳 etcd-v3.3.10-linux-amd64.tar.gz 到 /opt/k8s/ 目錄中,解壓 etcd 壓縮包 cd /opt/k8s/ tar zxvf etcd-v3.3.10-1jnux-amd64.tar.gz ls etcd-v3.3.10-1inux-amd64 #etcd就是etcd 服務的啟動命令,后面可跟各種啟動參數 #etcdctl主要為etcd 服務提供了命令行操作

#創建用於存放 etcd 配置文件,命令文件,證書的目錄 mkdir -p /opt/etcd/{cfg,bin,ssl} #移動etcd和etcdctl文件到自定義的命令文件中 mv /opt/k8s/etcd-v3.3.10-linux-amd64/etcd /opt/k8s/etcd-v3.3.10-linux-amd64/etcdctl /opt/etcd/bin/ cp /opt/k8s/etcd-cert/ *.pem /opt/etcd/ssl/ #啟動etcd服務 /opt/k8s/etcd.sh etcd01 192.168.150.5 etcd02=https://192.168.150.10:2380,etcd03=https://192.168.150.15:2380 #進入卡住狀態等待其他節點加入,這里需要三台etcd服務同時啟動,如果只啟動其中一台后,服務會卡在那里,直到集群中所有etcd節點都已啟動,可忽略這個情況 #另外打開一個窗口查看etcd進程是否正常 ps -ef | grep etcd

#把etcd相關證書文件和命令文件全部拷貝到另外兩個etcd集群節點 scp -r /opt/etcd/ root@192.168.150.10:/opt/ scp -r /opt/etcd/ root@192.168.150.10:/opt/ #把etcd服務管理文件拷貝到另外兩個集群節點 scp /usr/lib/systemd/system/etcd.service root@192.168.150.10:/usr/lib/systemd/system/ scp /usr/lib/systemd/system/etcd.service root@192.168.150.15:/usr/lib/systemd/system/ #在etcd集群的其他節點配置對應的服務器名和ip地址 vim /opt/etcd/cfg/etcd 

#啟動etcd服務 systemctl enable --now etcd.servcie systemctl status etcd.service 在 master01 節點(etcd01)上操作檢查etcd群集狀態 ln -s /opt/etcd/bin/etcd* /usr/local/bin cd /opt/etcd/ssl /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.150.5:2379,https://192.168.150.10:2379,https://192.168.150.15:2379" \ cluster-health 字段解析 --ca-file∶使用此CA證書驗證啟用https的服務器的證書 --cert-file∶識別HTTPS端使用SSL證書文件 --key-file∶使用此SSL密鑰文件標識HTTPS客戶端 --endpoints∶集群中以逗號分隔的機器地址列表 cluster-health∶檢查etcd集群的運行狀況

切換到etcd v3版本查看集群節點狀態和成員列表 #v2和v3命令略有不同,etcd2和etcd3也是不兼容的,etcd3.3默認使用v2版本,3.4版本后模式使用的v3版本 export ETCDCTL_API=3 etcdctl --write-out=table endpoint status etcdctl --write-out=table member list export ETCDCTL_API=2 #再切回v2版本 或者 export ETCDCTL_API=3 etcdctl --write-out=table endpoint status #直接跟上命令

 Kubernetes二進制部署(部署docker 引擎

#所有node節點部署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 enable --now docker.service

#配置鏡像加速

瀏覽器訪問https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors獲取鏡像加速器配置

mkdir -p /etc/docker

tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": ["https://v13dhnlt.mirror.aliyuncs.com"]

}

EOF

systemctl daemon-reload

systemctl restart docker.service

Kubernetes二進制部署(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作為外層報文頭進行封裝,然后在以太網上傳輸,到達目的地后由隧道端點解封裝並將數據發送給目標地址。

Flannel

Flannel 是一款網絡插件CNI其中有(flannel、calico等),Flannel 的功能是讓集群中的不同節點主機創建的 Docker 容器都具有全集群唯一的虛擬 IP 地址在K8s中實現跨主機pod相互間通信

Flannel 是 Overlay 網絡的一種,也是將 TCP 源數據包封裝在另一種網絡包里面進行路由轉發和通信,目前支持 UDP、VXLAN、host-GW靜態路由3種數據轉發方式。

Flannel 工作原理

安裝flannel工具后,數據從源node節點的pod發出后,會經由 docker0 網卡轉發到 flannel0 網卡,在flannel0 網卡flanneld 服務會對其進行監聽,把數據包封裝到 udp 報文中,然后根據自己在etcd中維護路由表信息通過物理網卡轉發到目標node節點,數據包到達目標node節點后會被 flanneld 服務解封裝,然后經由該主機上的flannel0 網卡和docker0網卡轉發到目標 pod 的容器

 

ETCD  Flannel 提供

存儲管理Flannel可分配的IP地址段資源

監控 ETCD 中每個 Pod 節點對應node節點路由表,並在內存中建立維護 Pod 節點路由表

在 master01 節點上操作

添加 flannel 網絡配置信息,寫入分配的子網段到 etcd 中,供 flannel 使用 cd /opt/etcd/ssl /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.150.5:2379,https://192.168.150.10:2379,https://192.168.150.15:2379" \ set /coreos.com/network/config '{"Network": "172.17.0.0/16","Backend": {"Type": "vxlan"}}' #查看寫入的信息 /opt/etcd/bin/etcdctl \ --ca-file=ca.pem \ --cert-file=server.pem \ --key-file=server-key.pem \ --endpoints="https://192.168.150.5:2379,https://192.168.150.10:2379,https://192.168.150.15:2379" \ get /coreos.com/network/config {"Network": "172.17.0.0/16","Backend": {"Type": "vxlan"}}

字段解析

set <key> <value>

set /coreos.com/network/config 添加一條網絡配置記錄,這個配置將用於flannel分配給每個docker的虛擬IP地址段以及flannel使用轉發方式

 

get<key>

get /coreos.com/network/config 獲取網絡配置記錄,后面不用再跟參數了

 

Network∶用於指定Flannel地址池

Backend∶用於指定數據包以什么方式轉發,默認為udp模式,Backend為vxlan比起預設的udp性能相對好一些

在所有 node 節點上操作

上傳 flannel.sh 和 flannel-v0.10.0-linux-amd64.tar.gz 到/opt 目錄中,解壓 flannel 壓縮包 cd /opt tar zxvf flannel-v0.10.0-linux-amd64.tar.gz flanneld #flanneld為主要的執行文件 mk-docker-opts.sh #mk-docker-opts.sh腳本用於生成Docker啟動網絡環境參數 README.md #創建kubernetes工作目錄 mkdir -p /opt/kubernetes/{cfg,bin,ssl} cd /opt mv mk-docker-opts.sh flanneld /opt/kubernetes/bin/ #將主要執行文件和docker啟動參數移動到工作目錄中 #啟動flanneld服務,開啟flannel網絡功能 cd /opt chmod +x flannel.sh ./flannel.sh https://192.168.150.5:2379,https://192.168.150.10:2379,https://192.168.150.15:2379 flannel啟動后會生成一個docker網絡相關信息配置文件/run/flannel/subnet.env,包含了docker要使用flannel通訊的相關參數,子網段,空間等 cat /run/flannel/subnet.env DOCKER_OPT_BIP="--bip=172.17.27.1/24" DOCKER_OPT_IPMASQ="--ip-masq=false" DOCKER_OPT_MTU="--mtu=1450" DOCKER_NETWORK_OPTIONS=" --bip=172.17.27.1/24 --ip-masq=false --mtu=1450"

 字段解析

 --bip∶指定 docker 啟動時的子網

 --ip-masq∶ 設置 ipmasg=false 關閉 snat 偽裝策略

 --mtu=1450∶mtu 要留出50字節給外層的vxlan封包的額外開銷使用

進入docker啟動項中配置

進入docker啟動項中添加flannel定義的相關網路參數,並將flannel添加到啟動變量中 vim /usr/lib/systemd/system/docker.service EnvironmentFile=/run/flannel/subnet.env ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS -H fd:// --containerd=/run/containerd/containerd.sock systemctl daemon-reload #重載后重啟服務 systemctl restart docker.service ifconfig #重啟后docker網段與自定義的flannel網段一致 ping -I 172.17.27.1 172.17.26.1

 

部署 master節點組件

#在 master01 節點上操作

啟動apiserver組件

上傳 master.zip 和 k8s-cert.sh 到 /opt/k8s 目錄中,解壓 master.zip壓縮包 cd /opt/k8s/ unzip master.zip #解壓出壓縮包里三種組件的啟動腳本 apiserver.sh scheduler.sh controller-manager.sh chmod +x *.sh #給執行腳本權限 #創建kubernetes工作目錄 mkdir -p /opt/kubernetes/{cfg, bin,ssl} #創建用於生成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證書、相關組件的證書和私鑰,需要在文件中添加apiserver可能用到的所有ip ls *pem admin-key.pem apiserver-key.pem ca-key.pem kube-proxy-key.pem admin.pem apiserver.pem ca.pem kube-proxy.pem #controller-manager 和 kube-scheduler 設置為只調用當前機器的 apiserver,使用127.0.0.1:8080 通信,與apiserver在同一台機器上,因此不需要簽發證書

#復制CA證書、apiserver相關證書和私鑰到 kubernetes工作目錄的 ssl 子目錄中 cp ca*pem apiserver*pem /opt/kubernetes/ssl/ #上傳 kubernetes-server-linux-ama64.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/ #創建 bootstrap token 認證文件,apiserver 啟動時會調用,然后就相當於在集群內創建了一個這個用戶,接下來就可以用 RBAC 給他授權(注意文件token.csv內文件格式,如果格式問題可能后續證書無法正常對接) cd /opt/k8s/ vim token.sh #!/bin/bash #獲取隨機數前16個字節內容,以十六進制格式輸出,並刪除其中空格,/dey/urandom為生成隨機數的設備,head -c 可以指定字節 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.150.5 https://192.168.150.5:2379,https://192.168.150.10:2379,https://192.168.150.15:2379 #檢查進程是否啟動成功 ps aux | grep kube-apiserver

#k8s通過kube-apiserver這個進程提供服務,該進程運行在單個master節點上。默認有兩個端口6443和8080 #安全端口6443用於接收HTTPS請求,用於基於Token文件或客戶端證書等認證 netstat -natp | grep 6443 #本地端口8080用於接收HTTP請求,非認證或授權的HTTP請求通過該端口訪問API Server netstat -natp | grep 8080 #v1.20版本使用 58080 作本地端口 #查看版本信息(必須保證apiserver啟動正常,不然無法查詢到server的版本信息) kubectl version

啟動 scheduler 服務 cd /opt/k8s/ ./scheduler.sh 127.0.0.1 ps aux | grep kube-scheduler 啟動 controller-manager 服務 cd /opt/k8s/ ./controller-manager.sh 127.0.0.1 查看master節點狀態 kubectl get componentstatuses #也可以kubectl get cs

部署 Worker node節點組件(node1節點)

### 在 master01 節點上操作 把 kubelet、kube-proxy 拷貝到 node 節點 cd /opt/k8s/kubernetes/server/bin scp kubelet kube-proxy root@192.168.150.10:/opt/kubernetes/bin/ scp kubelet kube-proxy root@192.168.150.15:/opt/kubernetes/bin/ ### 在node01 節點上操作 上傳 node.zip 到 /opt 目錄中,解壓 node.zip 壓縮包,獲得kubelet.sh、proxy.sh執行腳本 cd /opt/ unzip node.zip ###在 master01 節點上操作 創建用於生成kubelet的配置文件的目錄 mkdir /opt/k8s/kubeconfig 上傳 kubeconfig.sh 文件到 /opt/k8s/kubeconfig目錄中 #kubeconfig.sh 文件包含集群參數(CA 證書、API Server 地址),客戶端參數(上面生成的證書和私鑰),集群 context 上下文參數(集群名稱、用戶名)。Kubenetes 組件(如 kubelet、kube-proxy)通過啟動時指定不同的 kubeconfig 文件可以切換到不同的集群,連接到 apiserver。 cd /opt/k8s/kubeconfig chmod +x kubeconfig.sh #生成kubelet的配置文件cd /opt/k8s/kubeconfig ./kubeconfig.sh 192.168.150.5 /opt/k8s/k8s-cert/ ls bootstrap.kubeconfig kubeconfig.sh kube-proxy.kubeconfig

#把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷貝到 node 節點 cd /opt/k8s/kubeconfig scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.150.10:/opt/kubernetes/cfg/ scp bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.150.15:/opt/kubernetes/cfg/ #RBAC授權,將預設用戶 kubelet-bootstrap 與內置的 ClusterRole system:node-bootstrapper 綁定到一起,使其能夠發起 CSR 請求 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap 字段解析 clusterrolebinding:為內置的一種資源在所有命名空間有效 kubelet-bootstrap:資源名稱 --clusterrole:綁定的角色 --user:指定用什么用戶綁定 kubelet 采用 TLS Bootstrapping 機制,自動完成到 kube-apiserver 的注冊,在 node 節點量較大或者后期自動擴容時非常有用。 Master apiserver 啟用TLS 認證后,node 節點 kubelet 組件想要加入集群,必須使用CA簽發的有效證書才能與 apiserver 通信,當 node 節點很多時,簽署證書是一件很繁瑣的事情。因此 Kubernetes 引入了 TLS bootstrapping 機制來自動頒發客戶端證書,kubelet 會以一個低權限用戶自動向 apiserver 申請證書,kubelet 的證書由 apiserver 動態簽署。 kubelet首次啟動通過加載 bootstrap.kubeconfig 中的用戶 Token 和apiserver CA 證書發起首次CSR 請求,這個 Token被預先內置在apiserver 節點的 token.csv 中,其身份為 kubelet-bootstrap 用戶和 system:kubelet-bootstrap 用戶組,想要首次 CSR 請求能成功(即不會被 apiserver 401 拒絕),則需要先創建一個 ClusterRoleBinding,將 kubelet-bootstrap 用戶和 system:node-bootstrapper 內置 ClusterRole 綁定(通過 kubectl get clusterroles 可查詢),使其能夠發起 CSR 認證請求。 TLS bootstrapping 時的證書實際是由 kube-controller-manager 組件來簽署的,也就是說證書有效期是 kube-controller-manager組件控制的;kube-controller-manager 組件提供了一個 --experimental-cluster-signing-duration 參數來設置簽署的證書有效時間,默認為8760h0m0s,將其改為 87600h0m0s,即 10 年后再進行 TLS bootstrapping 簽署證書即可。 也就是說 kubelet 首次訪問 APT Server 時,是使用 token 做認證,通過后,Controller Manager 會為 kubelet 生成一個證書,以后的訪問都是用證書做認證了。 #查看角色 kubectl get clusterroles | grep system:node-bootstrapper #查看已授權的角色 kubectl get clusterrolebinding

### 在 node01 節點上操作 使用kubelet.sh腳本啟動kubelet服務 cd /opt/ chmod +x kubelet.sh ./kubelet.sh 192.168.150.10 檢查kubelet服務啟動 ps aux | grep kubelet 此時還沒有生成證書 ls /opt/kubernetes/ssl/

###在 master01 節點上操作 ### 檢查到 node01 節點的 kubelet 發起的 CSR 請求,Pending 表示等待集群給該節點簽發證書 kubectl get csr #通過 CSR 請求 kubectl certificate approve [請求名] kubectl certificate approve node-csr-E3YtWW_vZECYdDoG0I6OUvz1I1hkLp-nV3dc3rMFR9s #再次查看 CSR 請求狀態,Approved,Issued 表示已授權 CSR 請求並簽發證書 kubectl get csr #查看群集節點狀態,成功加入node01節點 kubectl get nodes

### 在 node01 節點上操作 ### 自動生成了證書和 kubelet.kubeconfig 文件 ls /opt/kubernetes/cfg/kubelet.kubeconfig ls /opt/kubernetes/ssl/

加載 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.sh腳本啟動proxy服務 cd /opt/ chmod +x proxy.sh ./proxy.sh 192.168.150.10 systemctl status kube-proxy.service 

部署 Worker node節點組件(node2節點)

方法一:按照node1的方法執行一遍即可 方法二∶ ### 在node01節點操作 把現成的/opt/kubernetes目錄和kubelet、kube-proxy的service服務管理文件復制到其他node節點 scp -r /opt/kubernetes/ root@192.168.150.15:/opt/ scp /usr/lib/systemd/system/{kubelet,kube-proxy}.service root@192.168.150.15:/usr/lib/systemd/system/ ### 在node02節點上操作,進行修改 首先刪除復制過來的證書,等會node02會自行申請證書 cd /opt/kubernetes/ssl/ rm -rf * 修改配置文件kubelet、kubelet.config、kube-proxy的相關IP地址配置為當前節點的IP地址 cd /opt/kubernetes/cfg vim kubelet KUBELET_OPPS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.150.15 \ #修改 .......... vim kubelet.config kind: KubeletConfiguration apiversion: kubelet.config.k8s.io/vlbetal address:192.168.150.15 #修改 vim kube-proxy KUBE PROXY OPTS="--logtostderr=true \ --v=4 \ --hostname-override=192.168.150.15 \ #修改 加載 ipvs 模塊 modprobe ip_vs 啟動kubelet和kube-proxy服務並設置開機自啟 systemctl enable --now kubelet.service systemctl enable --now kube-proxy.service 到master01節點上發現未授權的node02請求,授權node02加入集群 kubectl get csr 授權許可加入群集 kubectl certificate approve kubectl get csr kubectl get nodes

驗證K8S集群

在master節點拉群鏡像 kubectl create deployment nginx-test --image=nginx:1.14 kubectl get pod kubectl get pod -o wide # -o wide 可以查看容器的詳細信息 kubectl describe pod nginx-test-7dc4f9dcc9-7f2t4 #指定pod名查看具體參數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM