最新版本的K8S集群搭建


之前搞过几次 k8s 集群搭建,由于网络各种问题没成功,就没有去研究了。最近闲下来在家里的软路由上开了 3 台 centos8 虚拟机,又 k8s 集群搭建搞了一遍。

环境准备

服务环境准备

我准备了 3 台服务器,越多越好。一台 master,多台 slave 节点。

服务器角色系统ip主机名
mastercentos8192.168.1.12master
slavecentos8192.168.1.13slave1
slavecentos8192.168.1.14slave2
slavecentos8……slave……
slavecentos8……NslaveN

系统环境准备

所有服务器都需要执行、确认

  • 确保可以通外网,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

文章作者:   risfeng
版权声明:   本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 risfeng !
 本篇
最新版本的K8S集群搭建 最新版本的K8S集群搭建
之前搞过几次 k8s 集群搭建,由于网络各种问题没成功,就没有去研究了。最近闲下来在家里的软路由上开了 3 台 centos8 虚拟机,又 k8s 集群搭建搞了一遍。 环境准备服务环境准备我准备了 3 台服务器,越多越好。一台 mast
2021-05-11
下一篇 
centos frps开机启动服务配置注意点 centos frps开机启动服务配置注意点
在 centos 中设置 frps 服务端开机启动服务配置时有一个注意点,顺便记录一下。 frps 搭建本文不再说明,网上很多教程,请自行查阅。 frps 服务开机自启动# 将frps这个二进制文件复制到/usr/local/bin/这
2021-05-05
  目录