新手搭建K8S
環境准備
通過vmware 准備系統為centos7 的虛機三台 。(一台也可以,后面在克隆虛機也可以)安裝vmware 虛機過程就不寫了比較基礎。
准備環境配置網絡 我選擇橋接模式。配置靜態ip ,靜態ip 可以ping通外網。(橋接模式下dhcp 獲取的地址,我們取和他同一網段的地址配置給我們虛機就好了,確保取地址是未被使用的可以通過ping 檢查)
我准備三台vm 的地址規划
master 192.168.0.50
node1 192.168.0.51
node2 192.168.0.52
吸引准備好后 對環境的設置
修改主機名
hostnamectl set-hostname +主機名
配置主機網絡
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33-1
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.0.50
PREFIX=24
GATEWAY=192.168.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=b1cac983-ca12-4acb-8e88-638e9ecda874
DEVICE=ens33
ONBOOT=yes
設置域名解析
[root@master ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.50 master
192.168.0.51 node1
192.168.0.52 node2
手動修改 selinux 配置文件,設置永久關閉(需要重啟動機器)
vi /etc/selinux/config
SELINUX=enforcing改為SELINUX=disabled
關閉iptables
systemctl stop iptables
systemctl disable iptables
關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
檢查server 是否可以ping 通外網 可以通過ping www.baidu.com
准備安裝docker
添加aliyun 的yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
檢查yum 源,此時出現的出來我們本機的yum 源 應該會多一個docker 的yum 源
yum makecache
安裝docker
yum install -y docker-ce
啟動docker 服務
systemctl start docker
systemctl enable docker
驗證docker 是否ok,結果如下
docker run hello-world
如果提示docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: Running hook #0:: error running hook: exit status 2, stdout: , stderr: fatal error: runtime: out of memory
是虛機的內存不夠,擴內存可以解決此問題我虛機是給了1G 擴至2G解決此問題
docker 是安裝K8S 的前提,確保docker 的可用性我們在安裝K8S
網絡使用的goofle 的K8S yum 源國內用不了,我們需要切換成阿里的yum 源
在 /etc/yum.repos.d/ 目錄下生產一個K8S 的yum 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
執行yum makecache 檢查
k8s 所需的組件: kubelet kubeadm kubectl
Kubelet 是運行在所有cluster 節點上的負責啟動pod 和容器
Kubeadm 用於初始化cluster
Kubectl 是K8S 的命令行工具,用於管理和部署應用,負責查看、刪除、創建 和更新組件
安裝K8S 需要的組件 (所有節點上安裝)
yum install -y kubelet kubeadm kubectl
可以使用kubectl version、 kubelet --version、 kubeadm version驗證是否安裝成功
如果做到這里如果大家使用的是一台虛機,現在可以將虛機克隆 需要幾個node 節點克隆幾個就可以了 然后修改ip hostname 即可
master 節點的操作
初始化master 節點
kubeadm init --pod-network-cidr=192.168.10.0/16 --apiserver-advertise-address=192.168.0.50
由於國內網絡原因 在獲取鏡像會超時會提示如下報錯
在根據網絡上添加阿里雲的鏡像時雖然會減少鏡像下載報錯但是還是有問題
我們使用以下方法來徹底解決此問題
原文鏈接“https://blog.csdn.net/weixin_43168190/article/details/107227626”
在初始化master 時候會有提示讓我們是使用 'kubeadm config images pull' 來提前知道image 的版本
我們直接從DockerHub的其它倉庫拉取
https://hub.docker.com/search?q=kube-proxy&type=image
選取一個訪問量最多的倉庫來使用
編寫下載鏡像的腳本
[root@master ~]# cat pull_k8s_images.sh
set -o errexit
set -o nounset
set -o pipefail
##這里定義版本,按照kubeadm config images pull 獲取到的版本填寫對應的版本號
KUBE_VERSION=v1.21.2
KUBE_PAUSE_VERSION=3.4.1
ETCD_VERSION=3.4.13-0
DNS_VERSION=1.8.0
##這是原始倉庫名,最后需要改名成這個
GCR_URL=k8s.gcr.io
##這里就是寫你要使用的倉庫
DOCKERHUB_URL=k8smx
##這里是鏡像列表,新版本要把coredns改成coredns/coredns
images=(
kube-proxy:${KUBE_VERSION}
kube-scheduler:${KUBE_VERSION}
kube-controller-manager:${KUBE_VERSION}
kube-apiserver:${KUBE_VERSION}
pause:${KUBE_PAUSE_VERSION}
etcd:${ETCD_VERSION}
coredns/coredns:${DNS_VERSION}
)
##這里是拉取和改名的循環語句
for imageName in ${images[@]} ; do
docker pull $DOCKERHUB_URL/$imageName
docker tag $DOCKERHUB_URL/$imageName $GCR_URL/$imageName
docker rmi $DOCKERHUB_URL/$imageName
done
執行腳本就可以下載對應的鏡像並給鏡像改成對應的名稱
bash pull_k8s_images.sh
這里我們提示我們倉庫coredns鏡像下載失敗
我們可以倉庫搜索關鍵字來尋找我們所需對應的版本image
docker pull coredns/coredns:1.8.0
給鏡像改名,因為我們需要的鏡像信息是k8s.gcr.io/coredns/coredns:v1.8.0
docker tag coredns/coredns:1.8.0 k8s.gcr.io/coredns/coredns:v1.8.0
在master 節點上執行初始化
最總結果記錄這些信息
根據最總結果的提示執行相關命令
查看相關節點的pod 信息 (pending 是正常的 正在啟動搭建pod 最后會變成running 狀態)
kubectl get pod -n kube-system
查看node 節點列表信息當前狀態是NotReady
節點列表中狀態為NotReady,是因為You should now deploy a pod network to the cluster,也就是需要在集群中部署一個pod network,上面的運行結果里寫到:
登錄到https://kubernetes.io/docs/concepts/cluster-administration/addons/ 選擇flannel 網絡
在flannel 中的目錄下進入documentation 目錄選擇kube-flannel.yml點擊raw 會獲取到下載flannel.yml 文件的路徑 (如果跳轉過去沒有信息顯示沒有關系復制http 的路徑就可以了)
https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
使用wget 下載flannel文件 失敗原因是我們虛機無法解析到這個域名ip 。
wget url --no-check-certificate https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
我需要知道這個raw.githubusercontent.com 對應的ip 地址
搜素nslookup 使用工具查找
添加域名解析
再次wget 下載 wget url --no-check-certificate https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
加載文件
kubectl apply -f kube-flannel.yml
在檢查node 狀態已經是ready 狀態了
Node 節點的部署
Node1 執行kubeadm join 192.168.0.50:6443 --token mp4ghu.k3wx612pnxtj27ys \
> --discovery-token-ca-cert-hash sha256:cbf3766f4563a35ebc4c0e85e2629abd7b09615462cc2164932365512cf2c56e (之前初始化成功狗有此命令)
Node2 同上
在master 檢查新加入的node 節點
kubectl get nodes
部署參照了“https://blog.csdn.net/weixin_43168190/article/details/107227550?spm=1001.2014.3001.5501”
目前node1 與node2 節點顯示狀態時NotReady 很明顯有問題。
檢查pod 信息發現flannel pod 節點異常
kubectl describe pod kube-flannel-ds-5rdhb -n kube-system
登錄報錯的node 節點查詢log
發現一直報網絡的問題 還有提示我們下載k8s.gcr.io/pause:3.4.1失敗 。
針對此問題我將環境中master 下載鏡像腳本cp 過來將下載了所有的鏡像。
正對network 問題,我將master 上的flanner 的image 保存下來另cp 到node節點上,在node 上重新加載。
[root@master ~]# docker save -o flannel.tar quay.io/coreos/flannel:v0.14.0
[root@master ~]# scp -r flannel.tar 192.168.0.52:/root/
flannel.tar 100% 66MB 99.6MB/s 00:00
[root@master ~]# scp -r flannel.tar 192.168.0.51:/root/
flannel.tar 100% 66MB 99.6MB/s 00:00
在node 節點上執行docker load -i flannel.tar
檢查pod 信息,flannel 還是異常的
手動刪除有問題的pod ,系統會自己重新在拉一個pod
kubectl delete pod kube-flannel-ds-p2ktn -n kube-system
查看pod 返現問題已經被恢復 ,另一個node的同理。
檢查node 狀態都是ready 的
驗證
下載nginx 的鏡像
docker pull nginx
創建一個pod
kubectl create deployment nginx --image=nginx
將端口映射出去
kubectl expose deployment nginx --port=80 --type=NodePort
查詢
kubectl get pods,svc
Pod 已經被運行在node2 節點上了,訪問node2 的ip+端口31830 可以訪問nginx 界面