利用kubeadm搭建kubernetes集羣

前言

k8s的部署方式:node

  1. 傳統方式,從github上拉取對應的二進制安裝包,解壓安裝各個組件和節點,過程步驟複雜,特別是各組件要通訊,配置各類ca證書。GitHub連接
  2. 因爲傳統方式安裝比較麻煩,因此咱們用kubeadm(k8s官方提供的集羣部署工具)安裝,只需按照如下基本步驟安裝便可:
    • master,nodes機器上安裝:kubelet、kubeadm和docker,其中node和master都要運行在kebulet和docker環境之上
    • Master:用kubeadm init 命令,拉取下載相關的組件鏡像,並啓動相關pods(靜態pods,不受k8s自身管理),相關的pods組件有:etcd、api-server、controller-manager、scheduler
    • Nodes:用kubeadm join命令把nodes加入到k8s集羣中
    • flannel組件,運行在pods的守護級進程,起到個nodes的通訊做用。是一個額外的組件(adds on)。GitHub連接
    • kubeadm相關參考文檔

1、準備工做

  1. kubernetes須要容器運行時的支持,目前官方支持的容器運行時包括:Docker、Containerd、CRI-O和frakti。本次以Docker做爲容器運行環境,推薦版本爲Docker CE 18.09。宿主機操做系統使用CentOslinux

  2. 因爲Kubernetes的master和node之間會進行大量通訊,安全作法是開放對應的通訊端口,在安全的內網環境下能夠關閉防火牆服務:git

    sudo systemctl disable firewalldgithub

    sudo systemctl stop firewallddocker

  3. 關閉swap:swapoff -acentos

  4. 另外,建議在主機上禁用SELinux,讓容器能夠讀取主機的文件系統api

    sudo setenforce 0安全

  5. 解決路由異常:`bash

    echo "net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 vm.swappiness=0" >> /etc/sysctl.d/k8s.conf`
    sudo sysctl -p /etc/sysctl.d/k8s.conf
    若報不存在目錄的錯誤,則運行:sudo modprobe br_netfilter
    複製代碼

2、基礎環境安裝

Kubernetes 從1.4版開始引入了命令行工具kubeadm,致力於簡化集羣安裝的過程,並解決集羣的高可用問題。服務器

  • 下載yum-key.gpg和rpm-package-key.gpg

    sudo wget mirrors.aliyun.com/kubernetes/…

    sudo wget mirrors.aliyun.com/kubernetes/…

    導入:

    sudo rpm --import yum-key.gpg

    sudo rpm --import rpm-package-key.gpg

  • 安裝docker環境,docker運行時環境的配置:kubernetes.io/docs/setup/…

    cd /etc/yum.repos.d/

    wget <https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    yum install -y docker-ce

    最後安裝18.09版本,否則後面會出現各類問題。

    yum list docker-ce --showduplicates|sort -r  
    yum install docker-ce-18.09.0 -y
    複製代碼
  • 安裝kubeadm和相關工具

    • 配置yum源,yum源配置文件/etc/yum.repos.d/kubernetes.repo:

      [kubernetes]

      name=Kubernetes Repo

      baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

      enabled=1

      gpgcheck=0

    • 運行命令:yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

  • 啓動kubelet和docker服務,並開啓開機啓動。可是如今啓動kubelet是會失敗的,可先忽略

    systemctl enable docker && systemtcl start docker

    systemctl enable kubelet && systemtcl start kubelet

  • 使用kubeadm config print init-defaults > init-config.yaml 初始化一份配置文件,而且修改文件中配置爲:imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers,由於默認的鏡像地址在國內是會被牆的。(注意,若是advertiseAddress的值配置有問題,到加入節點kubeadm join的時候會出現卡住的狀況,這時候檢查advertiseAddress配置的ip是否有問題)

  • kubeadm config images pull --config=init-config.yaml 拉取下載所需鏡像。

3、master節點的安裝

  • 至此,準備工做已經完畢。運行kubeadm init --config=init-config.yaml 進行初始化,如運行結果提示kubelet沒啓動或者啓動失敗,能夠重啓kubelet。而後運行kubeadm rest重置,再進行kubeadm init操做

  • 安裝完畢後,按照提示命令,複製配置文件到普通用戶的home目錄下:

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

    這樣就在master安裝了kubernetes,可是在集羣內尚未任何的node和缺少對容器網絡的配置。其中值得注意的是,在kubeadm init完成後,最後幾行提示信息包含了加入其餘節點的指令和所要的token。若是遺忘。可用命令sudo kubeadm token create --print-join-command從新打印出來。

4、安裝Node

  • 新增一個節點,系統準備所需的yun源是同樣的,安裝的工具能夠不裝kubectl。安裝完畢後,啓動docker和kubelet服務。

  • 爲kubeadm命令生成配置文件,文件內容以下:

    其中apiServerEndpoint的值是master的服務器地址,token和tlsBootstrapToken的值是master安裝最後的一行信息。

  • kubeadm join大體的生命流程是:一、preflight checks;二、從集羣中讀取配置,也就是apiServerEndpoint中配置的地址中獲取;也就是在master的這個配置,能夠用命令kubectl -n kube-system get cm kubeadm-config -oyaml查看。三、下載這個配置,而後寫入到/var/lib/kubelet/config.yaml;四、激活kubelet。若是在第二部中,讀取配置出現問題,有可能出現卡住的狀況,這時要檢查maste的apiServerEndpoint和node的是否一致。

  • node join完畢後,能夠在master節點kubectl get nodes查看節點列表和狀態等

5、安裝網絡插件

  1. 執行kubectl get nodes 你會發現master和node節點都是NoReady狀態,那是由於還沒安裝CNI網絡插件

  2. 對於CNI網絡插件,可有不少選擇,可參考:<kubernetes.io/docs/setup/…

  3. 這裏,咱們選擇weave插件,執行命令kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"便可完成安裝。

  4. 最後master上運行命令kubectl get pods --all-namespaces看看相關的pods是否是都running狀態了,不然,運行kubectl describe -n kube-system(命名空間) pods [pod名稱]查看對應pod的詳細信息,通常失敗緣由都是拉取鏡像失敗

    至此,咱們簡單的k8s集羣已經部署完畢。。。

6、一些有用的命令

  • sudo netstat -ntlp | grep LISTEN 查看監聽的端口
  • kubectl get pods -n kube-system -o wide 查看pods的更多擴展信息
  • kubectl get ns 獲取全部的命名空間
  • sudo yum list kubelet --showduplicates //查看全部yum包的可用版本
  • kubectl get pods --all-namespaces 查看全部命名空間下的pods
  • kubectl get pod [pod name] -n [namespace] -o yaml | kubectl replace --force -f flannel.yaml 根據配置重啓某pods
相關文章
相關標籤/搜索