之前搞过几次 k8s 集群搭建,由于网络各种问题没成功,就没有去研究了。最近闲下来在家里的软路由上开了 3 台 centos8 虚拟机,又 k8s 集群搭建搞了一遍。
环境准备
服务环境准备
我准备了 3 台服务器,越多越好。一台 master,多台 slave 节点。
服务器角色 | 系统 | ip | 主机名 |
---|---|---|---|
master | centos8 | 192.168.1.12 | master |
slave | centos8 | 192.168.1.13 | slave1 |
slave | centos8 | 192.168.1.14 | slave2 |
slave | centos8 | …… | slave…… |
slave | centos8 | ……N | slaveN |
系统环境准备
所有服务器都需要执行、确认
- 确保可以通外网,ping 一下百度通就行
[root@master ~]# ping baidu.com
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=50 time=31.3 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=50 time=31.1 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=3 ttl=50 time=31.2 ms
- uname -a 查看内核是否大于等于 3.1
[root@master ~]# uname -a
Linux master 4.18.0-193.el8.x86_64 #1 SMP Fri May 8 10:59:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
- 关闭防火墙(我只关闭了从节点,master 节点没有关闭,我要对外;嫌麻烦就三个节点都关闭)
[root@slave1 ~]# systemctl stop firewalld
[root@slave1 ~]# systemctl disable firewalld
- 把系统的软件安装源切换到阿里云(目的就是快)
# 此处不要学我,我图方便直接删除了,你可以把原来的备份一下 eg: mv /etc/yum.repos.d/CentOS-AppStream.repo /etc/yum.repos.d/CentOS-AppStream.repo.bak
[root@slave1 ~]# rm -rfv /etc/yum.repos.d/*
已删除'/etc/yum.repos.d/CentOS-Base.repo'
已删除'/etc/yum.repos.d/CentOS-CR.repo'
已删除'/etc/yum.repos.d/CentOS-Debuginfo.repo'
已删除'/etc/yum.repos.d/CentOS-Devel.repo'
已删除'/etc/yum.repos.d/CentOS-fasttrack.repo'
已删除'/etc/yum.repos.d/CentOS-HA.repo'
已删除'/etc/yum.repos.d/CentOS-Media.repo'
已删除'/etc/yum.repos.d/CentOS-Sources.repo'
已删除'/etc/yum.repos.d/CentOS-Vault.repo'
已删除'/etc/yum.repos.d/docker-ce.repo'
已删除'/etc/yum.repos.d/kubernetes.repo'
[root@slave1 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2595 100 2595 0 0 25194 0 --:--:-- --:--:-- --:--:-- 25194
[root@slave1 ~]#
- 关闭 selinux
[root@slave1 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
- 关闭 swap
[root@slave1 ~]# swapoff -a
[root@slave1 ~]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun May 2 00:48:08 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=736130fd-9e4f-4df5-a7e4-f6e518aedf84 /boot ext4 defaults 1 2
# 注释掉下面这行 保存退出即可
#/dev/mapper/cl-swap swap swap defaults 0 0
- 查看 swap 是否全为 0,全为 0 即已关闭
[root@slave1 ~]# free -m
total used free shared buff/cache available
Mem: 1826 386 108 32 1331 1259
Swap: 0 0 0
- 配置三台服务器的主机名,在三台服务器上对应执行
# master服务器上执行:
[root@master ~]# hostnamectl set-hostname master
# slave1服务器上执行:
[root@slave1 ~]# hostnamectl set-hostname slave1
# slave2服务器上执行:
[root@slave2 ~]# hostnamectl set-hostname slave2
- 在 master 的服务器上添加 hosts,在 master 上执行命令
[root@master ~]# cat >> /etc/hosts << EOF
192.168.1.12 master
192.168.1.13 slave1
192.168.1.14 slave2
EOF
- 配置将桥接的 IPV4 流量传递到 iptables 的链,三台服务器都需执行命令
[root@master ~]# cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
[root@master ~]# sysctl --system
- 同步每个服务器的时间和时区,三台服务器上都需执行
[root@master ~]# systemctl enable chronyd
[root@master ~]# systemctl start chronyd
[root@master ~]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 查看三台服务器时间是否一致
[root@master ~]#date
2021年 05月 11日 星期二 17:23:05 CST
安装 docker
安装常用工具包
- 在三台服务器上执行
[root@master ~]# yum install vim bash-completion net-tools gcc -y
配置 docker 安装源
- 在三台服务器上执行
[root@master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@master ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 docker-ce
- 在三台服务器上执行
[root@master ~]# yum -y install docker-ce
#可能会报错:Problem: package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
#解决方法,如没报错请跳过。
[root@master ~]# wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
[root@master ~]# yum install containerd.io-1.2.6-3.3.el7.x86_64.rpm
# 然后再次执行安装docker-ce
[root@master ~]# yum -y install docker-ce
#如还是报错,可以在安装命令后加上错误最后提示大参数
[root@master ~]# yum -y install docker-ce --allowerasing
配置 docker aliyun 镜像及启动
- 三台服务器上都执行
请把下面的阿里云 docker 加速镜像地址替换成自己的。获取方式:进入https://www.aliyun.com,登录–>控制台–>产品与服务–>容器镜像服务
[root@master ~]# mkdir -p /etc/docker
[root@master ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"]
}
EOF
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable docker
[root@master ~]# systemctl restart docker
安装 k8s
配置 aliyun k8s 源
- 三台服务器上都需要执行
[root@master ~]# cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@master ~]#
安装 k8s 工具
- 三台服务器都需要执行
[root@master ~]# yum install kubectl kubelet kubeadm -y
[root@master ~]# systemctl enable kubelet
初始化 k8s 集群
以下操作仅在 master 节点上执行
- 初始化时可能会有的警告提前解决
# 初始化前安装一下tc工具,否则有警告提示:[WARNING FileExisting-tc]: tc not found in system path
[root@master ~]# yum install tc -y
# 我master节点没有关闭防火墙,所以需要放行2个端口,在初始化时的警告提示:[WARNING Firewalld]: firewalld is active, please ensure ports [6443 10250] are open or your cluster may not function correctly
# 解决方案1:放行端口:6443 10250
[root@master ~]# firewall-cmd --zone=public --add-port=6443/tcp --permanent
[root@master ~]# firewall-cmd --zone=public --add-port=10250/tcp --permanent
[root@master ~]# firewall-cmd --reload
# 解决方案2:禁用防火墙
[root@master ~]# systemctl stop firewalld.service
- 执行初始化命令
[root@master ~]# kubeadm init --kubernetes-version=1.21.0 \
--apiserver-advertise-address=192.168.1.12 \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
命令说明:
kubernetes-version 是 k8s 的版本 1.21.0 目前最新的,可以通过官网查看目前最新版本:https://kubernetes.io/ 导航栏中的 Versions
apiserver-advertise-address 地址就是 master 本机 ip
service-cidr 的网段为:10.10.0.0/16
pod-network-cidr 的网段为: 10.122.0.0/16
image-repository:由于 kubeadm 默认从官网 k8s.grc.io 下载所需镜像,一般国内无法访问,故需指定为阿里云镜像仓库地址
- 如果执行上面初始化命令失败,提示无法下载镜像时,请参考附录 A-1处理后再次执行初始化命令
- 如果集群初始化成功后返回如下信息,请记录最后的加入集群的命令及 token 信息:kubeadm join 192.168.1.12:6443 –token xxxx –discovery-token-ca-cert-hash xxxx
此处省略很多输出信息.......
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.1.12:6443 --token **************** \
--discovery-token-ca-cert-hash ****************
[root@master ~]#
- 根据初始化成功的信息提示创建 kubectl
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 使 kubectl 可以自动补全命令
[root@master ~]# source <(kubectl completion bash)
- 查看节点、pods 情况
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master NotReady control-plane,master 2m29s v1.21.0
[root@master01 ~]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-57d4cbf879-rqdbl 0/1 Pending 0 2m12s
kube-system coredns-57d4cbf879-tst9q 0/1 Pending 0 2m12s
kube-system etcd-master 1/1 Running 0 2m22s
kube-system kube-apiserver-master 1/1 Running 0 2m22s
kube-system kube-controller-manager-master 1/1 Running 0 2m22s
kube-system kube-proxy-76xc8 1/1 Running 0 2m12s
kube-system kube-proxy-8cmh6 1/1 Running 0 2m12s
kube-system kube-proxy-pw96q 1/1 Running 0 2m12s
kube-system kube-scheduler-master 1/1 Running 0 2m22s
说明:
Node 节点的状态为 NotReady,原因是 coredns pod 没有启动状态是 Pending,缺少网络插件 pod
- 安装 flannel 网络插件
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 再次看 pod 情况,均为 Running,此时集群初始化完成
[root@master ~]# kubectl get pods -n kube-system
加入 K8s 集群
- 在 slave1、slave2 服务器上执行加入集群的命令
[root@slave1 ~]# kubeadm join 192.168.1.12:6443 --token **************** \
--discovery-token-ca-cert-hash ****************
[root@slave2 ~]# kubeadm join 192.168.1.12:6443 --token **************** \
--discovery-token-ca-cert-hash ****************
- 在 master 节点上查看加入情况
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 35m20s v1.21.0
slave1 Ready 2m20s v1.21.0
slave2 Ready 2m20s v1.21.0
目前三个节点的状态都为 Ready,正常服务中,加入集群完成。
附 A:常见问题解决方案
A-1:初始化集群时提示无法下载镜像
- 解决方案:手动拉取镜像,在 master 节点上执行
# 查看V1.21.0对应的镜像版本
[root@master ~]# kubeadm config images list --kubernetes-version=v1.21.0
k8s.gcr.io/kube-apiserver:v1.21.0
k8s.gcr.io/kube-controller-manager:v1.21.0
k8s.gcr.io/kube-scheduler:v1.21.0
k8s.gcr.io/kube-proxy:v1.21.0
k8s.gcr.io/pause:3.4.1
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns/coredns:v1.8.0
# 手动拉取镜像
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.21.0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.21.0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.21.0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.13-0
[root@master ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.4.1
[root@master ~]# docker pull coredns/coredns:1.8.0
[root@master ~]# docker tag coredns/coredns:1.8.0 registry.cn-hangzhou.aliyuncs.com/google_containers/coredns/coredns:v1.8.0
[root@master ~]# docker rmi coredns/coredns:1.8.0
A-2:重置 K8S 集群
集群初始化后已经 join 了其他节点,但是现在某些组件一直不停的重启、创建、销毁等状态中,尝试了各种方法都无法解决时,不妨尝试重置集群从头来一次初始化集群。
# 驱离名为"slave1"的节点上的pod(master上执行)
[root@master ~]# kubectl drain slave1 --delete-local-data --force --ignore-daemonset
[root@master ~]# kubectl drain slave2 --delete-local-data --force --ignore-daemonset
[root@master ~]# kubectl drain master --delete-local-data --force --ignore-daemonset
# 删除节点(master上)
[root@master ~]# kubectl delete node slave1
[root@master ~]# kubectl delete node slave2
[root@master ~]# kubectl delete node master
# 重置节点(三个节点都执行)
[root@master ~]# kubeadm reset
# master上在reset之后需要删除如下文件
[root@master ~]# rm -rf /var/lib/cni/ $HOME/.kube/config
# 清除历史文件及网络配置信息,三个节点都执行一下
[root@master ~]# systemctl stop kubelet
[root@master ~]# systemctl stop docker
[root@master ~]# rm -rf /var/lib/cni/
[root@master ~]# rm -rf /var/lib/kubelet/*
[root@master ~]# rm -rf /etc/cni/
[root@master ~]# ifconfig cni0 down
[root@master ~]# ifconfig flannel.1 down
[root@master ~]# ifconfig docker0 down
[root@master ~]# ip link delete cni0
[root@master ~]# ip link delete flannel.1
[root@master ~]# systemctl restart kubelet
[root@master ~]# systemctl restart docker