kubeadm快速搭建K8s集群 基於v1.22.2版本


### 一、環境介紹

1.1 kubeadm介紹

kubeadm是官方社區推出的一個用於快速部署kubernetes集群的工具。

kubeadm采用的是容器化部署方式,組件除了kubelet其他都以容器形式啟動並運行。

1.2 部署流程

  1. 安裝Docker
  2. 使用kubeadm init創建一個Master節點
  3. 使用kubeadm join將一個node節點加入到集群中
  4. 部署容器網絡
  5. 部署Web UI

1.3 安裝要求

在開始之前,部署Kubernetes集群機器需要滿足以下幾個條件:

  • 一台或多台機器,操作系統 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多
  • 集群中所有機器之間網絡互通
  • 可以訪問外網,需要拉取鏡像
  • 禁止swap分區

1.4 k8s運行圖示

kubernetes架构图

1.5 環境准備

1.更新內核

k8s對系統內核要求較高,最好使用較新版本的內核,我這里使用的是5.4版本的內核,更新內核操作如下

#查看當前內核版本
uname -r
uname -a
cat /etc/redhat-release 

#添加yum源倉庫
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

#更新yum源倉庫
yum -y update

#查看可用的系統內核包
yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

#安裝內核,注意先要查看可用內核,我安裝的是5.4版本的內核
yum --enablerepo=elrepo-kernel install kernel-lt

#查看目前可用內核
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg

#使用序號為0的內核,序號0是前面查出來的可用內核編號
grub2-set-default 0

#生成 grub 配置文件並重啟
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

查看可用的系統內核包,可以看到有5.4跟5.14版本兩個內核,我安裝的是5.4版本的內核

image-20211026144133319

查看目前可用內核

image-20211026144613034

參考資料:升級內核

2.准備環境

用三台機器,一台master,兩台node作為實驗環境

角色 IP
k8s-master01 10.154.0.111
k8s-node01 10.154.0.112
k8s-node02 10.154.0.113

以下命令除了設置主機名外,其他所有機器都要設置

#關閉防火牆,selinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0

#關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

#設置主機名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

#在master添加hosts
cat >> /etc/hosts << EOF
10.154.0.111 k8s-master01
10.154.0.112 k8s-node01
10.154.0.113 k8s-node02
EOF

#啟用IPv4模塊
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

#重啟服務器
reboot

二、部署k8s集群

以下操作在所有節點進行,如果使用的xshell工具,可以使用工具-->發送鍵到所有會話

2.1 安裝Docker

這里我安裝的是目前最新版本v20.10.9,使用的yum源安裝的,也可以二進制安裝docker

2.2 安裝集群組件

1.添加阿里雲YUM軟件源

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

wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo

2.安裝kubeadm,kubelet和kubectl

目前最新版本是1.22.2,我們直接上最新版

yum install -y kubectl-1.22.2 kubelet-1.22.2 kubeadm-1.22.2
systemctl enable kubelet

2.3 部署Master節點

初始化有如下兩種方式

方式一:使用kubeadm init命令初始化

在k8s-Master01上執行,報錯請看k8s報錯匯總

kubeadm init \
--apiserver-advertise-address=10.154.0.111 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.22.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
  • --apiserver-advertise-address 集群通告地址
  • --image-repository 由於默認拉取鏡像地址k8s.gcr.io國內無法訪問,這里指定阿里雲鏡像倉庫地址
  • --kubernetes-version K8s版本,與上面安裝的一致
  • --service-cidr 集群內部虛擬網絡,Pod統一訪問入口
  • --pod-network-cidr Pod網絡,,與下面部署的CNI網絡組件yaml中保持一致
  • --ignore-preflight-errors=all 忽略一些檢查錯誤

執行完畢后會出現以下內容,第一個框內是將連接集群的配置文件拷貝到默認路徑下,第二個框內是加入集群命令kubeadm join,復制該命令在node節點執行就能加入該集群

image-20211022215248384

#框一內容
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#框二內容
kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
	--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

:'
kubeadm init初始化工作過程
1、[preflight] 環境檢查和拉取鏡像 kubeadm config images pull
2、[certs] 生成k8s證書和etcd證書 /etc/kubernetes/pki
3、[kubeconfig] 生成kubeconfig文件
4、[kubelet-start] 生成kubelet配置文件
5、[control-plane] 部署管理節點組件,用鏡像啟動容器  kubectl get pods -n kube-system
6、[etcd] 部署etcd數據庫,用鏡像啟動容器
7、[upload-config] [kubelet] [upload-certs] 上傳配置文件到k8s中
8、[mark-control-plane] 給管理節點添加一個標簽 node-role.kubernetes.io/master='',再添加一個污點[node-role.kubernetes.io/master:NoSchedule]
9、[bootstrap-token] 自動為kubelet頒發證書
10、[addons] 部署插件,CoreDNS、kube-proxy
'

方式二:使用配置文件引導

vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.22.2
imageRepository: registry.aliyuncs.com/google_containers 
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 

kubeadm init --config kubeadm.conf --ignore-preflight-errors=all  

參考文檔:官方中文文檔官方英文文檔

2.查看效果

此時就能使用kubectl管理集群了,查看集群狀態

kubectl get node
docker ps #可以看到集群實際上是拉起了很多容器

可以看到k8s-master01已經在集群中了

可以看到kube-system命名空間中的pod,命名空間跟pod概念以后講解

2.4 部署Node節點

在k8s-node01跟02上執行

1.將node節點加入集群

向集群添加新節點,執行在kubeadm init輸出的kubeadm join命令:

kubeadm join 10.154.0.111:6443 --token dtiqj4.z8xpk6hdio0e4mbu \
	--discovery-token-ca-cert-hash sha256:7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

默認token有效期為24小時,當過期之后,該token就不可用了。這時就需要重新創建token。

2.重新創建token

重新創建token有兩種方式

方式一:一次性創建

kubeadm token create --print-join-command

方式二:分批創建

#創建token
$ kubeadm token create
w2ouca.erkyzzbw70xuxoqb

#創建token-ca-cert-hash
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

#合起來就是加入集群命令
$ kubeadm join 10.154.0.111:6443 --token w2ouca.erkyzzbw70xuxoqb --discovery-token-ca-cert-hash 7845faa23c64a2317d3bd059581635c7678d0f3a6b96c5b5db992d29f935485d

#查看token列表
kubeadm token list

3.查看效果

這時node已經加入到集群中了,狀態為NotReady是因為沒有部署網絡插件導致的。

image-20211022230409614

如果報錯查看kubelet日志

journalctl -u kubelet >error.log
vim error.log

參考資料:官方文檔

2.5 部署容器網絡

網絡組件有很多種,只需要部署其中一個即可,推薦Calico。

Calico是一個純三層的數據中心網絡方案,Calico支持廣泛的平台,包括Kubernetes、OpenStack等。

Calico 在每一個計算節點利用 Linux Kernel 實現了一個高效的虛擬路由器( vRouter) 來負責數據轉發,而每個 vRouter 通過 BGP 協議負責把自己上運行的 workload 的路由信息向整個 Calico 網絡內傳播。

此外,Calico 項目還實現了 Kubernetes 網絡策略,提供ACL功能。

1.下載Calico

目前最新版本為v3.20,按最新版本的來,不怕報錯,不怕困難,解決今天的報錯就是減少以后加班的時間,干就完了!

官方下載Calico

wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml

2.修改calico.yaml

下載完后還需要修改里面定義Pod網絡(字段為CALICO_IPV4POOL_CIDR),與前面kubeadm init中定義的pod-network-cidr網段一樣

#大約在3878行,取消注釋,並改為前面kubeadm init中pod-network-cidr字段定義的網段
vim calico.yaml +3878
...
- name: CALICO_IPV4POOL_CIDR
  value: "10.244.0.0/16"
...

3.修改完后應用清單

kubectl apply -f calico.yaml
kubectl get pods -n kube-system

我們看READY這一列,這里的1/1,左邊的1表示已經運行了的容器個數,右邊的1表示一共需要運行的容器個數。

image-20211022233332192

calico.yaml也是以容器方式啟動的,以下是所需的容器

cat calico.yaml | grep image

image-20211022233538478

2.6 部署 Dashboard

1.下載yaml文件

官網下載地址

目前最新版本為v2.4.0,我先沖了各位!

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml

2.修改資源類型

默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部30001端口

#加入下面的15行暴露3001端口,跟18行,對應配置文件的43跟46行
vi recommended.yaml
...
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 30001
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
...

注意格式對齊

3.應用清單

kubectl apply -f recommended.yaml
kubectl get pods -n kubernetes-dashboard
kubectl get pods,svc -n kubernetes-dashboard

image-20211023000452627

image-20211023000635723

訪問地址:

容器內訪問:curl https://10.104.22.253:443

容器外訪問:https://10.154.0.111:30001

4.登錄UI

有兩種方式登錄,使用token或者kubeconfig登錄

下面使用token方式登錄

創建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

# 獲取用戶Token
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

使用輸出的token登錄Dashboard。

image-20211023001255805

效果如下所示

image-20211023001439927

2.7 驗證集群狀態

從以下三個方面驗證集群狀態

  1. 驗證Pod工作
  2. 驗證Pod網絡通信
  3. 驗證DNS解析

1.創建pod驗證

在Kubernetes集群中k8s-master01上創建一個pod,驗證是否正常運行:

#創建一個nginx容器
kubectl create deployment nginx --image=nginx

#將nginx端口暴露出來
kubectl expose deployment nginx --port=80 --type=NodePort

#查看
kubectl get pod,svc

可以看到暴露出來的訪問端口是30180

image-20211023171723730

訪問地址:

容器內部訪問:crul http://10.99.175.88 (在集群內任意節點都能訪問,如k8s-master01,k8s-node01等等節點上)

容器外部訪問:http://10.154.0.111:30180

2.使用命令驗證

kubectl get pods -n kube-system

image-20211023172700643

參考資料:官方文檔支持的網絡組件官方文檔之網絡配置

三、查看集群命令

這里介紹幾個常見的查看集群狀態的命令

3.1 查看集群節點狀態

kubectl get node

image-20211023193004922

這里部署了kubelet的節點都會被顯示出來,如果使用二進制安裝的話,master因為沒部署kubelet將不會被顯示出來,需要注意。

3.2 查看組件狀態

kubectl get cs

這里的警告表示在v1.19+版本,該命令要被棄用了

這里的cs是縮寫,全稱是componentstatuses,意為組件狀態

該命令是查看k8s資源,k8s資源有很多,resources意為資源

kubectl api-resources | more

第一列是資源的名字

第二列是縮寫

第三列是API組

第四列是否支持命名空間

3.3 查看api代理的URL

kubectl cluster-info

3.4 查看集群詳細信息

kubectl cluster-info dump |more

image-20211023200204280

信息很多,以json格式輸出的,一般很少使用,常用的如下

kubectl describe node k8s-master

image-20211023200423104

3.5 查看事件信息

kubectl get event

image-20211023200705982

多久創建的節點,多久加入的節點都會記錄在事件里

3.6 查看資源信息

kubectl describe cs

image-20211023200946205

查看組件狀態信息,其他k8s支持的資源可使用kubectl api-resources | more命令查看

3.7 查看容器信息

kubectl get pods -n kube-system

image-20211023202521005

3.8 查看服務狀態

kubectl get pod,svc

image-20211023202942350

四、參考資料

51CTO課程


免責聲明!

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



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