基於 kubeadm 搭建高可用的kubernetes 1.18.2 (k8s)集群一 環境准備


本k8s集群參考了 Michael 的 https://gitee.com/pa/kubernetes-ha-kubeadm-private 這個項目,再此表示感謝!
Michael的項目k8s版本為1.14.0,筆者基於他的項目進行改進,填了不少坑,搭建了 kubernetes 1.18.2高可用集群,特將搭建過程進行記錄
詳細信息請參考本人的git倉庫 地址為 https://gitee.com/salmon_163/kubernetes-ha-kubeadm.git
kubernetes 組建的版本都全面升級了,dashboard版本升級到2.0.1,詳細內容請參考文檔

1. 服務器說明

我們這里使用的是五台centos-7.6的虛擬機,具體信息如下表:

系統類型 IP地址 節點角色 CPU Memory Hostname
centos-7.8 172.16.249.130 master >=2 >=2G m1
centos-7.8 172.16.249.131 master >=2 >=2G m2
centos-7.8 172.16.249.132 master >=2 >=2G m3
centos-7.8 172.16.249.135 worker >=2 >=2G s1
centos-7.8 172.16.249.136 worker >=2 >=2G s2

2. 系統設置(所有節點)

2.1 主機名

主機名必須每個節點都不一樣,並且保證所有點之間可以通過hostname互相訪問。

# 查看主機名
$ hostname
# 修改主機名
$ hostnamectl set-hostname <your_hostname>
# 配置host,使所有節點之間可以通過hostname互相訪問
$ vi /etc/hosts
# <node-ip> <node-hostname>

2.2 安裝依賴包

# 更新yum
$ yum update
# 安裝依賴包
$ yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp

2.3 關閉防火牆、swap,重置iptables

# 關閉防火牆
$ systemctl stop firewalld && systemctl disable firewalld
# 重置iptables
$ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 關閉swap
$ swapoff -a
# 使用下面的命令對文件/etc/fstab操作,注釋 /dev/mapper/centos_master-swap  swap  swap    defaults        0 0 這行
$ sed -i 's/.*swap.*/#&/' /etc/fstab
# 關閉selinux
$ vim /etc/selinux/config 
# 將SELINUX=enforcing改為SELINUX=disabled
$ setenforce 0
# 查看selinux狀態
$ sestatus
# 關閉dnsmasq(否則可能導致docker容器無法解析域名)
$ service dnsmasq stop && systemctl disable dnsmasq

2.4 系統參數設置

# 制作配置文件
$ cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
# 生效文件
$ sysctl -p /etc/sysctl.d/kubernetes.conf
# 執行sysctl -p 時出現下面的錯誤
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
# 解決方法:運行命令 modprobe br_netfilter 然后再執行 sysctl -p /etc/sysctl.d/kubernetes.conf
$ modprobe br_netfilter
# 查看
$ ls /proc/sys/net/bridge
bridge-nf-call-arptables bridge-nf-filter-pppoe-tagged
bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged
bridge-nf-call-iptables bridge-nf-pass-vlan-input-dev

3. 安裝docker(所有節點)

# 1. 方法一: 通過yum源的方式安裝
# 創建所需目錄
$ mkdir -p /opt/kubernetes/docker && cd /opt/kubernetes/docker
# 清理原有版本, 如果系統沒有安裝過跳過
$ yum remove -y docker* container-selinux
# 安裝依賴包
$ yum install -y yum-utils device-mapper-persistent-data lvm2
# 設置yum源
$ yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 可以查看所有倉庫中所有docker版本,並選擇特定版本安裝:
$ yum list docker-ce --showduplicates | sort -r
# 安裝指定版本docker, 如果不指定版本號,將安裝最新版本的docker
$ sudo yum install -y docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
# 示例-安裝docker版本是: 19.03.8
$ yum install -y docker-ce-19.03.8 docker-ce-cli-19.03.8 containerd.io
# 開機啟動
$ systemctl enable docker && systemctl start docker

# 2. 方法二: 通過rpm方式安裝
# 手動下載rpm包【示例docker 19.03.8版本的安裝】
$ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm
$ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-19.03.8-3.el7.x86_64.rpm
$ wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-19.03.8-3.el7.x86_64.rpm
# 安裝rpm包
$ yum localinstall -y *.rpm
# 開機啟動
$ systemctl enable docker && systemctl start docker


# 設置參數
# 1.查看磁盤掛載
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        98G  2.8G   95G   3% /
devtmpfs         63G     0   63G   0% /dev
/dev/sda5      1015G  8.8G 1006G   1% /tol
/dev/sda1       197M  161M   37M  82% /boot
# 2.設置docker啟動參數
# - 設置docker數據目錄:選擇比較大的分區(我這里是根目錄就不需要配置了,默認為/var/lib/docker)
# - 設置cgroup driver, 防止文件驅動不一致,導致鏡像無法啟動(默認是cgroupfs,主要目的是與kubelet配置統一,這里也可以不設置后面在kubelet中指定cgroupfs)
# docker info 可以查看到cgroup driver的類型
$ cat <<EOF > /etc/docker/daemon.json
{
    "graph": "/docker/data/path",
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 啟動docker服務
systemctl start docker

# daemon.json 詳細配置示例
{
  "debug": false,
  "experimental": false,
  "graph": "/home/docker-data",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://fy707np5.mirror.aliyuncs.com"
  ],
  "insecure-registries": [
    "hub.zy.com",
    "172.16.249.159:8082"
  ]
}
# 啟動docker服務
systemctl restart docker

4. 安裝必要工具(所有節點)

4.1 工具說明

  • kubeadm: 部署集群用的命令
  • kubelet: 在集群中每台機器上都要運行的組件,負責管理pod、容器的生命周期
  • kubectl: 集群管理工具(可選,只要在控制集群的節點上安裝即可)

4.2 安裝方法

# 配置yum源(網絡不受限制可以把"mirrors.aliyun.com"替換為"packages.cloud.google.com")
$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 安裝工具
# 找到要安裝的版本號
$ yum list kubeadm --showduplicates | sort -r

# 安裝指定版本(這里用的是1.18.2)
$ yum install -y kubeadm-1.18.2-0 kubelet-1.18.2-0 kubectl-1.18.2-0 --disableexcludes=kubernetes

# 設置kubelet的cgroupdriver(kubelet的cgroupdriver默認為systemd,如果上面沒有設置docker的exec-opts為systemd,這里就需要將kubelet的設置為cgroupfs)
$ sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

# 啟動kubelet 所有的節點
$ systemctl enable kubelet && systemctl start kubelet

5. 准備配置文件(任意節點)

5.1 下載配置文件

我這准備了一個項目,專門為大家按照自己的環境生成配置的。它只是幫助大家盡量的減少了機械化的重復工作。它並不會幫你設置系統環境,不會給你安裝軟件。總之就是會減少你的部署工作量,但不會耽誤你對整個系統的認識和把控。

$ cd ~ && git clone https://gitee.com/salmon_163/kubernetes-ha-kubeadm.git
# 看看git內容
$ ls -l kubernetes-ha-kubeadm
addons/
configs/
scripts/
init.sh
global-configs.properties

5.2 文件說明

  • addons

kubernetes的插件,比如calico和dashboard。

  • configs

包含了部署集群過程中用到的各種配置文件。

  • scripts

包含部署集群過程中用到的腳本,如keepalive檢查腳本。

  • global-configs.properties

全局配置,包含各種易變的配置內容。

  • init.sh

初始化腳本,配置好global-config之后,會自動生成所有配置文件。

5.3 生成配置

這里會根據大家各自的環境生成kubernetes部署過程需要的配置文件。

此腳本不支持MACOS系統,切記不要使用MACOS來運行 init.sh

# cd到之前下載的git代碼目錄
$ cd kubernetes-ha-kubeadm

# 編輯屬性配置(根據文件注釋中的說明填寫好每個key-value)
$ vi global-config.properties

# 生成配置文件,確保執行過程沒有異常信息
$ ./init.sh

# 查看生成的配置文件,確保腳本執行成功
$ find target/ -type f

執行init.sh常見問題:

  1. Syntax error: "(" unexpected
  • bash版本過低,運行:bash -version查看版本,如果小於4需要升級
  • 不要使用 sh init.sh的方式運行(sh和bash可能不一樣哦)
  1. global-config.properties文件填寫錯誤,需要重新生成
    再執行一次./init.sh即可,不需要手動刪除target


免責聲明!

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



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