1. 程式人生 > 其它 >kubeadm搭建單master k8s叢集

kubeadm搭建單master k8s叢集

                                                                                               kubeadm搭建單master k8s叢集

一、準備環境

                 軟體環境:

軟體

版本

作業系統

CentOS7.9_x64

核心

kernel-ml-5.17.3-1.el7

Docker

docker-ce-20.10.14-3.el7.x86_64

Kubernetes

v1.23

 

               伺服器規劃:

主機名(角色)

IP

CPU

記憶體

K8s-master

192.168.20.211

2核

4G

K8s-node1

192.168.20.212

4核

8G

K8s-node2

192.168.20.213

4核

8G

K8s-node3

192.168.20.214

4核

8G

K8s-node4

192.168.20.215

4核

8G

 

二、環境初始化(所有主機)

  1. 關閉防火牆

            systemctl stop firewalld

            systemctl disable firewalld

         2.關閉selinux

           sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久

           setenforce 0  # 臨時

         3.關閉swap

           swapoff -a  # 臨時

           sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

         4.修改主機名

           hostnamectl set-hostname <hostname>

           cat >> /etc/hosts << EOF

           192.168.20.211 k8s-master

           192.168.20.212 k8s-node1

           192.168.20.213 k8s-node2

           192.168.20.214 k8s-node3

           192.168.20.215 k8s-node4

           EOF

         5.將橋接的IPv4流量傳遞到iptables的鏈

          cat > /etc/sysctl.d/k8s.conf << EOF

          net.ipv4.ip_forward=1

          net.bridge.bridge-nf-call-ip6tables = 1

          net.bridge.bridge-nf-call-iptables = 1

          net.bridge.bridge-nf-call-arptables = 0

          EOF

          sysctl --system  # 生效

  1. 時間同步

    yum install ntpdate -y

ntpdate time.windows.com

       echo "0 * * * * ntpdate time.windows.com " >> /etc/crontab

三、安裝docker

  1. 解除安裝之前的docker

yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

  1. 安裝docker

          # 安裝依賴包

yum install -y yum-utils

# 新增Docker軟體包源

yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

# 安裝Docker CE

yum install -y docker-ce

# 啟動Docker服務並設定開機啟動

systemctl start docker

systemctl enable docker

  1. 配置映象加速器

cat > /etc/docker/daemon.json << EOF

{

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

"exec-opts": ["native.cgroupdriver=systemd"]

}

EOF

 

systemctl restart docker

docker info

四、安裝kubeadm,kubelet和kubectl

  1. 新增阿里雲yum源

  cat > /etc/yum.repos.d/kubernetes.repo << EOF

[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

  1. 安裝kubeadm,kubelet和kubectl

   yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0

    systemctl enable kubelet

五、部署Kubernetes Mastermaster節點

    kubeadm init \

  --apiserver-advertise-address=192.168.20.211 \

  --image-repository registry.aliyuncs.com/google_containers \

  --kubernetes-version v1.23.0 \

  --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中保持一致

 

如果報此錯誤請排查第二步的初始化過程都執行過,如果沒有執行,先執行第二 、步後在執行安裝master,第二步的任何一個步驟沒執行都會報此錯誤

初始化完成後,最後會輸出一個join命令先記住新增node節點要

 

拷貝kubectl使用的連線k8s認證檔案到預設路徑:

 

 

 

mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

檢視工作節點:kubectl get nodes

 

注:由於網路外掛還沒有部署,還沒有準備就緒 NotReady

六、加入node節點(所有node主機)

  所有node主機執行下圖的命令

 

預設token有效期為24小時,當過期之後,該token就不可用了。這時就需要重新建立token,可以直接使用命令快捷生成:

kubeadm token create --print-join-command

七、部署容器網路(CNI)

  Calico是一個純三層的資料中心網路方案,是目前Kubernetes主流的網路方案。

下載YAML:

curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O

下載完後還需要修改裡面定義Pod網路(CALICO_IPV4POOL_CIDR),與前面kubeadm init的 --pod-network-cidr指定的一樣。

修改完後文件後,部署:

kubectl apply -f calico.yaml

kubectl get pods -n kube-system

Calico Pod都Running,節點也會準備就緒

CoreDNS問題處理:

kubectl get pods -n kube-system

NAME                                     READY   STATUS             RESTARTS   AGE

calico-kube-controllers-8db96c76-z7h5p   1/1     Running            0          16m

calico-node-pshdd                        1/1     Running            0          16m

calico-node-vjwlg                        1/1     Running            0          16m

coredns-545d6fc579-5hd9x                 0/1     ImagePullBackOff   0          16m

coredns-545d6fc579-wdbsz                 0/1     ImagePullBackOff   0          16m

在所有節點執行:

docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0

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

過一會兒,CoreDNS Pod會自動恢復正常。

以後所有yaml檔案都只在Master節點執行。

八、部署 Dashboard

   Dashboard是官方提供的一個UI,可用於基本管理K8s資源。

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

課件中檔名是:kubernetes-dashboard.yaml

預設Dashboard只能叢集內部訪問,修改Service為NodePort型別,暴露到外部:

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

...

 

kubectl apply -f recommended.yaml

kubectl get pods -n kubernetes-dashboard

 

訪問地址:https://NodeIP:30001

 

建立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。