天天看點

【 雲原生 | kubernetes 】- kubeadm部署k8s叢集(超詳細)

【 雲原生 | kubernetes 】- kubeadm部署k8s叢集(超詳細)

Kubeadm

是 kubernetes 社群為了友善普通使用者學習k8s,發起的一個簡單上手的部署工具。不用把大量時間花費在搭建叢集上面。

隻需通過兩條指令就可以部署一個

k8s

叢集

#建立一個Master節點
$ kubeadm init

# 将一個Node節點加入到目前叢集中
$ kubeadm join
           

安裝Kubeadm

實驗環境:CentOS7.9

前期準備

  • 确認linux核心版本在3.10以上
  • 确認Cgroups子產品正常
  • 确認kubernetes的預設工作端口沒有被占用

環境準備(所有機器下操作這一步驟)

  • 在所有節點上同步/etc/hosts
[root@master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.10 master
192.168.100.20 slave1
192.168.100.30 slave2
           
  • 在所有節點上配置防火牆和關閉selinux
[root@master ~]# systemctl stop firewalld
[root@master ~]# setenforce 0
           
  • 在所有節點上關閉swap分區,
[root@master ~]# sed -i '/swap/s/UUID/#UUID/g' /etc/fstab
[root@master ~]# swapoff -a  ##臨時關閉
           
  • 在所有節點配置好yum源
[root@master ~]# wget -c  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@master ~]#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=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
           
  • 在所有節點上安裝并啟動docker,并設定開機自啟
#選擇自己想要的版本
[root@master ~]# yum list  docker-ce --showduplicates|grep "^doc"|sort -r
docker-ce.x86_64            3:20.10.9-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.8-3.el7                    docker-ce-stable 
docker-ce.x86_64            3:20.10.8-3.el7                    @docker-ce-stable
docker-ce.x86_64            3:20.10.3-3.el7                    docker-ce-stable
[root@master ~]# yum -y install docker-ce-20.10.8-3.el7
[root@master ~]# systemctl enable docker && systemctl start docker
           

檢視确認Docker是否安裝成功

[root@master ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.18
 API version:       1.41
 Go version:        go1.18.6
 Git commit:        b40c2f6
 Built:             Thu Sep  8 23:14:08 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
           
  • 在所有節點設定核心參數(雲主機略)
[root@master ~]# cat <<EOF >  /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
[root@master ~]# sysctl -p   #讓其生效
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@master ~]# 
           

注意:如果發現如下錯誤

#sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables:沒有那個檔案或目錄
#sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables:沒有那個檔案或目錄
#net.ipv4.ip_forward = 1
           

可通過modrobe br_netfilter 解決,會自動加載br_netfilter子產品

  • 在所有節點安裝軟體包
[root@master ~]# yum install -y kubelet-1.21.0-0 kubeadm-1.21.0-0 kubectl-1.21.0-0  --disableexcludes=kubernetes

Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
·······


Complete!
[root@master ~]# systemctl restart kubelet ; systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.
           

部署Kubernetes

master節點

通過kubeadm檢視所需的鏡像

[root@master ~]# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.21.14
k8s.gcr.io/kube-controller-manager:v1.21.14
k8s.gcr.io/kube-scheduler:v1.21.14
k8s.gcr.io/kube-proxy:v1.21.14
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
           

拉取鏡像

預設的gcr鏡像我們是無法之間通路的,我們可以從阿裡鏡像擷取,

#!/bin/bash
image_name=(
        kube-apiserver:v1.21.14
        kube-controller-manager:v1.21.14
        kube-scheduler:v1.21.14
        kube-proxy:v1.21.14
        pause:3.4.1
        etcd:3.4.13-0
        coredns:v1.8.0
   ) 
aliyun_registry="registry.aliyuncs.com/google_containers/"
 
for image in ${image_name[@]};do
    docker pull $aliyun_registry$image
    echo "###########################################################################"
done

docker tag  registry.aliyuncs.com/google_containers/coredns:v1.8.0  registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
exit
           

Docker配置cgroup-driver

由于 cgroup-driver ,預設docker 是 cgroupfs ,而k8s 預設是 systemd,是以需要設定 docker 的 cgroup 為 systemd

修改Docker配置檔案,然後加載配置并重新啟動Docker

vim /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart docker
           

部署

現在在master上執行初始化操作

[root@master ~]# kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.21.0 --pod-network-cidr=10.244.0.0/16 
           
【 雲原生 | kubernetes 】- kubeadm部署k8s叢集(超詳細)

這裡我們master節點已經安裝成功,

根據提示運作下列指令

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# export KUBECONFIG=/etc/kubernetes/admin.conf
           
Kubernetes 叢集預設需要加密方式通路。是以這幾條指令,就是将剛剛部署生成的 Kubernetes 叢集的安全配置檔案,儲存到目前使用者的.kube 目錄下,kubectl 預設會使用這個目錄下的授權資訊通路 Kubernetes 叢集。

slave節點

配置slave加入叢集

下面的步驟是把slave1和slave2以worker的身份加入到kubernetes叢集。

  • 在slave1和slave2分别執行。
kubeadm join 192.168.100.10:6443 --token 8xey01.o9twtamnm2tdivoe \
        --discovery-token-ca-cert-hash sha256:0d2cf7a10b54aeb91edbfabb501655f99ea9c64b96cb81dbc07573e363fab43c 
           
【 雲原生 | kubernetes 】- kubeadm部署k8s叢集(超詳細)

部署網絡插件

安裝calico

[root@master ~]#  kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml
[root@master ~]# curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml
           

需要更改預設 IP 池 CIDR 以比對您的 pod 網絡 CIDR。然後部署,預設在calico-system命名空間

[root@master ~]# vi custom-resources.yaml 
··········
cidr: 192.168.0.0/16 替換為  cidr: 10.244.0.0/16  
··········
[root@master ~]# kubectl apply -f custom-resources.yaml 
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created
           
cidr和初始化叢集時保持一緻

檢視其狀态

[root@master ~]# kubectl get po -n calico-system
NAME                                       READY   STATUS     RESTARTS   AGE
calico-kube-controllers-78687bb75f-62zrs   1/1     Running    0          7m48s
calico-node-78sqm                          1/1     Running    0          7m49s
calico-node-f7wb6                          1/1     Running    0          7m49s
calico-node-s7qm3                          1/1     Running    0          7m49s
calico-typha-84cfb44987-vbrq9              1/1     Running    0          7m49s
csi-node-driver-4dn68                      2/2     Running    0          4m21s
           

可以使用 kubectl get 指令來檢視目前節點的狀态

[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
master   Ready    control-plane,master   8m   v1.21.0
slave1   Ready    <none>                 11m   v1.21.0
slave2   Ready    <none>                 11m   v1.21.0
           

檢視元件健康情況

[root@master ~]# kubectl get cs
NAME                 STATUS      MESSAGE                                                                                       ERROR
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
etcd-0               Healthy     {"health":"true"} 
           

這裡提示我們

scheduler

controller-manager

不健康的,我們先檢視下其服務端口是否正常

[root@master ~]# netstat -ntpl | grep contro
tcp        0      0 127.0.0.1:10257         0.0.0.0:*               LISTEN      3197/kube-controlle 

[root@master ~]# netstat -ntpl | grep scheduler
tcp        0      0 127.0.0.1:10259         0.0.0.0:*               LISTEN      3313/kube-scheduler 
           

我們發現這兩個服務都正常運作,隻不過檢測端口不一緻,

解決問題

[root@master ~]# kubectl edit po kube-controller-manager-master -n kube-system

········
	- --port=0        ###注釋掉或删除此行,scheduler同樣操作,edit 時需要确認,pod的名稱
           
[root@master ~]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS    MESSAGE             ERROR
controller-manager   Healthy   ok                  
scheduler            Healthy   ok                  
etcd-0               Healthy   {"health":"true"}  
           

繼續閱讀