K8S安裝(二): 在Oracle VM VirtualBox 虛擬機中搭建基於CentOS8-Steam 的kubernetes 集群及網絡NAT和橋接模式設置


本文記錄了完整的在虛擬機中搭建K8S集群遇到的問題及解決方法,僅供大家學習。

部分教程可參考:https://k8s.easydoc.net/docs/dRiQjyTY/28366845/6GiNOzyZ/nd7yOvdY

   硬件准備

 1. 准備安裝一個master 節點和3個worker節點(強烈推薦為1核CPU,2G以上內存,如果設置為2核CPU,則本地打開多虛擬機會非常卡頓並得到內核軟件鎖死等錯誤信息),,本人首先只創建了一個master和worker1兩台虛擬機,其他node 節點可以在worker1節點完成后通過虛擬機自帶的克隆(clone)功能快速復制一模一樣的環境(ip,hostname等信息需要自己更新),克隆時需要選擇生成全新的網卡和mac地址等信息。

虛擬機創建好后通過以下命令 設置相應的hostname:

hostnamectl set-hostname master   hostnamectl set-hostname worker1  

master : 192.168.50.50 

worker1:192.168.50.51

worker1:192.168.50.52

worker1:192.168.50.53

 2. Oracle VM 設置:網卡連接都設置為橋接模式,通過宿主機(windows10)輸入ipconfig /all  命令得到宿主機IP 和網關,DNS 等信息。以便在虛擬機中/etc/sysconfig/network-scripts/目錄下網卡信息文件中配置中增加網絡配置信息,在文件中增加IPADDR 和宿主機在同一網段,增加NETMASK 和GATEWAY,DNS1 等信息,這樣可用保證虛擬機之間可以和宿主機在同一網段中,並能通過橋接連接訪問外部互聯網,方便k8s組件安裝包的下載。

 

 

 

 重啟后route -n查看

 

 

 

 注意:有些公司網絡會對橋接模式的IP dhcp 獲取有限制,如果需要宿主機訪問虛擬機,則可以使用NAT 網絡適配模式並進行端口映射。需要在全局設置中創建新的NAT network並分配好IP 網絡段

 

 

 

 

 3.修改各個虛擬機/etc/hosts文件,配置映射信息。

 

 

 安裝K8S組件 (每台主機需要安裝docker-ce組件,此文docker安裝步驟略過)

 1.所有節點關閉和禁用各節點的防火牆:

systemctl stop firewalld && systemctl disable firewalld
臨時關閉SELINUX:setenforce 0
查看SELINUX狀態:sestatus -v
查看狀態:getenforce
永久關閉 vi /etc/selinux/config
關閉交換分區:swapoff -a

 也可以使用這命令修改: sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

2. 下載最新版本K8S kubectl

curl -LO https://dl.k8s.io/release/v1.23.4/bin/linux/amd64/kubectl

下載校驗文件:curl -LO "https://dl.k8s.io/1.23.4/bin/linux/amd64/kubectl.sha256"
校驗文件: echo "$(<kubectl.sha256) kubectl" | sha256sum --check
通過:kubectl: OK
安裝:install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 

查看安裝版本是否最新 :kubectl version --client

3.所有節點主機添加安裝源(進入網址操作)

 https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11kIpGBF

 通過如下命令生成k8s repo文件

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安裝所需組件( 在所有節點) 

yum install -y kubelet kubeadm kubectl   
systemctl enable kubelet && systemctl start kubelet #啟用和開啟kubelet服務

查看狀態用 systemctl status kubelet,如果失敗 則查看失敗日志:journalctl -xefu kubelet 

kubernetes 官方推薦docker等使用systemd 作為cgroupdriver,否則kubelet啟動不了。

cat <<EOF > daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
EOF 

生成文件后通過命令移動到docker配置目錄下 

mv daemon.json /etc/docker 

systemctl daemon-reload #重加載配置

systemctl restart docker #重啟docker服務

如果kubelet啟動仍然失敗 提示 :failed to load Kubelet config file /var/lib/kubelet/config.yaml 則需要查看是否執行了kubeadm init命令(僅在主節點跑)

如果swap分區沒關閉 需要swapoff -a 關閉分區 並進入文件 注釋掉加載swap分區那行 /etc/fstab ,完畢后reboot重啟。

4. 用kubeadm初始化一個集群(僅在主節點執行),失敗了可用kubeadm reset重置 :

kubeadm init --image-repository=registry.aliyuncs.com/google_containers --ignore-preflight-errors=NumCPU

增加 --ignore-preflight-errors=NumCPU 命令是為了跳過要求cpu核高於2的限制,上文提到如果設置虛擬機cpu為2個則會很卡。

不增加則運行kubeadm init 會出現錯誤: [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

另外一種解決方法:臨時增加虛擬機為2個也可以,完成安裝后可恢復為1個。

安裝過程中當出現字樣 :Your Kubernetes control-plane has initialized successfully!  說明安裝成功!

TIPS: 如果更換了虛擬機的 ip地址則需要更改相應的hosts文件和/etc/kubernetes路徑下很多conf 文件里的ip地址,需要 kubeadm reset后重新安裝,

否則會出現kubectl 各種命令失效連接不上server的錯誤。如果reset不行 ,則可以yum remove 刪除之前的kubectl keubelet kubeadm 等組件。

安裝過程中還會打印出token信息,便於其他節點連接master主機加入K8S集群。注意保存該包含token的命令行信息 ,命令行中IP信息為master節點,下列命令是在worker節點中執行的。

kubeadm join 192.168.50.50:6443 --token 6vzabt.3zp3cbs7f7wmw4r8 --discovery-token-ca-cert-hash sha256:04abedbba674eab570cad77abc4f2ac61e029fa31c666493670ad958b74a2f3d

 如果丟失或者過期,則可以重新獲取,執行命令

kubeadm token create --print-join-command

TIPS: 正常集群都是局域網內的機器,如果是用外網別的雲平台機器加入當前集群,則需要配置iptables :iptables -t nat -A OUTPUT -d    TX雲外網ip -j DNAT --to-destination TX雲內網ip
iptables -t nat -A OUTPUT -d Ali內網ip -j DNAT --to-destination Ali外網ip
兩台機子需要相反得操作,網上搜下iptables就差不多了,如果是使用TX雲部署的時候,在端口轉發。

5.# 復制授權文件,以便 kubectl 可以有權限訪問集群 # 如果你其他節點需要訪問集群,需要從主節點復制這個文件過去其他節點

mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

6. 把其他工作節點加入到集群中  

kubeadm join 192.168.50.50:6443 --token 6vzabt.3zp3cbs7f7wmw4r8 --discovery-token-ca-cert-hash sha256:04abedbba674eab570cad77abc4f2ac61e029fa31c666493670ad958b74a2f3d

7.安裝網絡插件calico.yaml

此時start 然后查看master節點 systemctl start kubelet  systemctl status kubelet,發現服務已經running了,但是有錯:Unable to update cni config" err="no networks found in /etc/cni/net.d 

在老版本1.21之前可安裝的是 kube-flannel(被牆了,需要自己網上搜索文件下載)

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 

我當前安裝的是1.23.4 ,所以安裝calico

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

如果報錯:Port 10250 is in use 則執行以下:
kubeadm reset 重置配置
在將worker 節點加入master時報錯:It seems like the kubelet isn't running or healthy,無法加入master節點
journalctl -xefu kubelet查看kubelet日志 發現swap未關閉 ,則需要關閉。

8.安裝完成后查看安裝信息

通過命令kubectl get node 查看集群節點信息, 通過kubectl get configmap -n kube-system 命令查看已安裝插件信息,如果出現NotReady的節點,極可能是忘記安裝了網絡插件。

 

 

 

 

 

如果開啟兩個虛擬主機很卡 而且經常 出現soft lockup cpu#1 stuck 等錯誤,則需要改回虛擬機處理器設置為1個即可,之前安裝k8s組件時 設置了2個。

 9.  worker node 節點加入進master節點后 ,通過命令查看關鍵pod運行狀態

kubectl get pod -n kube-system 

  

   

 

 

 

 如果有發現coredns兩個pod無法啟動 一直為ContainerCreating 狀態,kubectl edit cm coredns -n kube-system 命令進入文件刪除loop 所在行 退出后 重啟 coredns pods並刪除那2個運行失敗的 ,再次查看 他們會自動創建運行。如果此種方法仍然失敗,則kubectl delete pod coredns-xxx-xxx -n kube-system 刪除

那2個失敗的容器,如果還是無法重新創建成功 則輸入命令查看pod日志信息:

kubectl describe pods -n kube-system coredns-6d8c4cb4d-jgxwb 

 更大的可能是忘記安裝了網絡插件 :我在安裝過程中復制錯了插件地址kubectl apply -f https://projectcalico.docs.tigera.io/manifests/flannel-migration/calico.yaml,導致calico沒有安裝成功。正確的是 kubectl apply -f  https://docs.projectcalico.org/manifests/calico.yaml

刪除文件,可以用命令 kubectl delete -f   xxxx.yaml

 

kubectl get cs 查詢健康狀態

 

10. 安裝dashboard  

注意該文件地址有時會無法訪問

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml  

可以下載到本地保存比如保存k8s-dashboar.yaml.

vim k8s-dashboar.yaml 增加type: nodeport 模式

 

 

 

 

 

執行變化 : 

kubectl apply -f k8s-dashboar.yaml

  

如果不增加nodeport模式,則用kubectl 命令行工具來啟用 Dashboard 訪問:

kubectl proxy

查看clusterIP 信息

get svc -n kubernetes-dashboard

 安裝成功后 通過master IP 訪問

http://192.168.50.50:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
出現 Token和KubeConfig ,根據提示操作即可

 11.  生成admin token

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

 

 

如果使用nodeport 模式,則查看NodePort服務端口位32275 

kubectl  get service --all-namespaces |grep dash

 

 

 

 則通過https://192.168.50.50:32275/#/login 訪問,復制上方步驟11生成的admin token

 

 

登錄成功

 

 

 TIPS:如果重啟機器后Dashboard 沒有及時up,可能是在下載安裝..... 意外的機器重啟可能會導致一些docker容器出現異常 ,需要手動查看 docker ps -a 刪掉不在運行的容器,否則K8S 服務會有問題。

kubectl get pods --all-namespace 查看所有的pod 

 

配置使用overlay2
# cat /etc/docker/daemon.json
{
"storage-opts": [
"overlay2.override_kernel_check=true",
"overlay2.size=10G"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m"
}
}
systemctl daemon-reload systemctl restart docker
這樣就可以把每個容器磁盤大小限制在10G了

 

12.同步K8S 集群網絡時間

做時間同步
之前的版本:yum install -y ntp
centos8:yum -y install chrony
查看同步狀態 chronyc sourcestats
查看ntp詳細的同步狀態 chronyc sources -v
查看時間同步狀態 timedatectl status
# 開啟網絡時間同步
timedatectl set-ntp true
# 查看時區列表
timedatectl list-timezones
timedatectl list-timezones | grep -E "Asia/S.*"
設定為上海時區timedatectl set-timezone Asia/Shanghai


13.查看全屬性pod 狀態信息
kubectl get pods --all-namespaces -o wide
查看所有kind資源類型
kubectl api-resources -o wide --namespaced=true 或者kubectl api-resources -o wide --namespaced=false
創建nginxpod
kubectl create deployment web --image=nginx
暴露對外接口
kubectl expose deployment web --port=80 --target-port=80 --type=NodePort
定義一個service並導出yaml文件類型(Type如果沒做設置,默認ClusterIP) :kubectl expose deployment web --port=80 --target-port=80 --dry-run -o yaml >service1.yaml,
基於這個service1.yaml可通過kubectl apply -f service1.yaml 創建service
查看service kubectl get svc
刪除service kubectl delete service nginx-web
顯示完成的docker描述信息,不顯示省略號:docker search kube-webhook-certgen:v1.1.1 --no-trunc

 

14.設置swap

****************************設置swap*****************
free -m
swapon -s
dd if=/dev/zero of=/tmp/swap bs=1M count=4096 通過dd命令在/tmp/目錄下新增加一個4G大小的空文件。
chmod 600 /tmp/swap 修改文件權限,只有root讀寫
mkswap /tmp/swap 使用mkswap命令把創建的文件格式化為swap
ls -lh /tmp/swap           #查看創建的文件大小和權限
swapon /tmp/swap 使用swapon命令使swap生效
編輯fatab文件加入下面swap 便於下次啟用
/tmp/swap swap swap defaults 0 0


免責聲明!

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



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