天天看點

使用Kubeadm搭建Kubernetes叢集

Kubernetes 架構

使用Kubeadm搭建Kubernetes叢集

Kubernetes 主要由以下幾個核心元件組成:

  • etcd 儲存了整個叢集的狀态;
  • kube-apiserver 提供了資源操作的唯一入口,并提供認證、授權、通路控制、API 注冊和發現等機制;
  • kube-controller-manager 負責維護叢集的狀态,比如故障檢測、自動擴充、滾動更新等;
  • kube-scheduler 負責資源的排程,按照預定的排程政策将 Pod 排程到相應的機器上;
  • kubelet 負責維持容器的生命周期,同時也負責 Volume(CVI)和網絡(CNI)的管理;
  • Container runtime 負責鏡像管理以及 Pod 和容器的真正運作(CRI),預設的容器運作時為 Docker;
  • kube-proxy 負責為 Service 提供 cluster 内部的服務發現和負載均衡;

今天我們先重點說一下kubelet元件,kubelet 主要負責同容器運作時(比如 Docker 項目)打交道。而這個互動所依賴的,是一個稱作 CRI(Container Runtime Interface)的遠端調用接口,這個接口定義了容器運作時的各項核心操作,比如:啟動一個容器需要的所有參數。

此外,kubelet 還通過 gRPC 協定同一個叫作 Device Plugin 的插件進行互動。這個插件,是 Kubernetes 項目用來管理 GPU 等主控端實體裝置的主要元件,也是基于 Kubernetes 項目進行機器學習訓練、高性能作業支援等工作必須關注的功能。

而kubelet 的另一個重要功能,則是調用網絡插件和存儲插件為容器配置網絡和持久化存儲。這兩個插件與 kubelet 進行互動的接口,分别是 CNI(Container Networking Interface)和 CSI(Container Storage Interface)。

kubelet 完全是為了實作 Kubernetes 項目對容器的管理能力而實作的一個元件。

了解完Kubernetes架構後,我們今天使用Kubeadm部署一個Kubernetes叢集。使用Kubeadm部署Kubernetes叢集很簡單,隻需要兩步操作即可:kubeadm init,kubeadm join,當然在正式安裝之前咱們先需要做一下基礎準備!

基礎環境準備

安裝一個Kubernates最小叢集需要三台機器,一台Master節點,兩台Node節點,機器規劃如下:

虛拟機版本 主機名 IP 角色
centos7 kubernetes-master 192.168.136.128 master
kubernetes-node1 192.168.136.129 node
kubernetes-node2 192.168.136.130
  • 安裝并啟動Docker

    安裝過程略,可參看我之前的Docker系列文章,安裝完成後使用

    systemctl start docker

    指令啟動Docker
  • 使用指令将docker服務設定開機啟動

    systemctl enable docker

  • 檢視docker 版本,確定各個節點安裝的docker版本一緻
  • 關閉禁用各節點的防火牆

    停止防火牆:

    systemctl stop firewalld.service

    禁用防火牆:

    systemctl disable firewalld.service

    檢視防火牆狀态:

    systemctl list-unit-files|grep firewalld.service

  • 關閉各節點的selinux

    編輯

    /etc/selinux/config

    檔案并設定

    SELINUX

    的值為

    disabled

  • 關閉各節點的swap

    如果不關閉kubernetes運作會出現錯誤, 即使安裝成功了,node重新開機後也會出現kubernetes server運作錯誤。

    sudo swapoff -a

  • 給各節點添加kubernetes的yum源

    進入目錄

    cd /etc/yum.repos.d/

使用Kubeadm搭建Kubernetes叢集

内容如下,大家可以直接複制粘貼。

[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enable=1
EOF      
  • 檢視yum源是否可用

    yum repolist

使用Kubeadm搭建Kubernetes叢集

做好上面的準備工作後,我們來安裝Kubeadm。

Kubeadm 安裝

Master安裝

  • 修改master主機名為kubernetes-master

    hostnamectl set-hostname kubernetes-master

  • 解除安裝原kubeadm(若有):

    yum remove -y kubelet kubeadm kubectl

  • 安裝kubeadm:

    yum install -y kubelet kubeadm kubectl

  • 重新開機 docker,并啟動 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet      
  • 檢視kubelet狀态:

    systemctl status kubelet

如果此時執行 service status kubelet 指令,将得到 kubelet 啟動失敗的錯誤提示,請忽略此錯誤,因為必須完成後續步驟中 kubeadm init 的操作,kubelet 才能正常啟動
  • 生成kubeadm配置檔案kubeadm.yml

    進入檔案夾

    cd /app/k8s

    ,執行指令生成配置檔案

    kubeadm config print init-defaults --kubeconfig ClusterConfiguration > kubeadm.yml

    在檔案夾下,會生成一個kubeadm.yml檔案,需要對kubeadm.yml進行修改。
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.136.128
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: kubernetes-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
networking:
  dnsDomain: cluster.local
  podSubnet: "192.168.0.0/16"
  serviceSubnet: 10.96.0.0/12
scheduler: {}      

主要做三處修改:

修改imageRepository為

registry.aliyuncs.com/google_containers

阿裡鏡像源;

修改

kubernetesVersion

,我們使用v1.18.0作為kubernetes版本;

podSubnet

,配置成Calico預設網段

  • 檢視并拉取鏡像
# 檢視所需鏡像清單
kubeadm config images list --config kubeadm.yml
# 拉取鏡像
kubeadm config images pull --config kubeadm.yml      
使用Kubeadm搭建Kubernetes叢集
  • master初始化

    執行以下指令初始化主節點,該指令指定了初始化時需要使用的配置檔案,其中添加 --upload-certs 參數可以在後續執行加入節點時自動分發證書檔案。追加的 tee kubeadm-init.log 用以輸出日志。

    kubeadm init --config=kubeadm.yml --upload-certs | tee kubeadm-init.log

使用Kubeadm搭建Kubernetes叢集
  • 再次檢視kebelet狀态

    systemctl status kubelet

使用Kubeadm搭建Kubernetes叢集
  • 此時kubelet為active,運作狀态。
  • 配置kubelet
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config      
  • 驗證是否安裝成功

    kubectl get node

使用Kubeadm搭建Kubernetes叢集

此時節點的狀态為NotReady,這是由于我們還沒部署任何網絡插件,是正常的。

Node 節點安裝

Node節點隻需要在安裝docker的基礎上安裝

kubeadm

元件即可。

  • 修改主機名

    hostnamectl set-hostname kubernetes-node1

  • yum remove -y kubelet kubeadm kubectl

  • yum install -y kubeadm

  • 擷取join指令(在Master節點執行)

    kubeadm token create --print-join-command

kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64     --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc      

Node2節點安裝過程略。。。

完成兩個節點的join後可以在master節點檢視節點狀态,

kubectl get nodes -o wide

使用Kubeadm搭建Kubernetes叢集

至此  Node節點都已經加入Master。

安裝網絡插件Calico

在Master節點使用指令

kubectl apply -f

https://docs.projectcalico.org/v3.13/manifests/calico.yaml

進行Calico網絡插件的安裝。

安裝完成後我們可以使用指令

kubectl get pods -n kube-system -o wide

檢視pod狀态。

使用Kubeadm搭建Kubernetes叢集

再次檢視node節點狀态

kubectl get nodes -o wide

,發現處于Ready狀态

使用Kubeadm搭建Kubernetes叢集

這樣我們整個Kubernetes叢集已經搭建完成,大家可以開始部署你的服務應用了!

重新加入節點

若節點需要重新加入節點可以按照如下步驟進行:

  • 先在node節點執行

    kubeadm reset -f

    指令,重置kubeadm
  • 在Master節點删除原節點

    kubectl delete node kubernetes-node1

  • 在Master節點擷取join指令

    kubeadm token create --print-join-command

  • 在Node節點執行指令重新加入叢集

    kubeadm join 192.168.136.128:6443 --token bk1hs7.bxxz26xkzamtpn64 --discovery-token-ca-cert-hash sha256:a3ce56bb691c996e2b842ccfc08dbec834e295f30e582be0ca258500e02f49cc

安裝錯誤

在安裝Node節點時可能會出現如下的錯誤

[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1      
使用Kubeadm搭建Kubernetes叢集

解決方法:

echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables      

重新開機Master節點後執行kubectl 相關指令出現如下錯誤,則很可能是沒關閉swap導緻kubelet無法正常啟動,可以使用

free -m

指令檢視

使用Kubeadm搭建Kubernetes叢集

若swap所在行不為0則表示未關閉swap,可以使用

swapoff -a

指令關閉,然後使用指令

systemctl start kubelet

重新啟動kubelet 。