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