1. 前言
吐槽
网上各种教程很多,但是大多数都不清不楚,根本很难部署起来。
b站的教程也很多,讲的好的都是N年前的,和现在的版本差距很大。
重装了好多次系统,才把这个一个一个部署起来,建议最好在虚拟机或者云服务器上玩 、
不要在本机部署!!!
而且 这个版本号真的很恶心 系统镜像的版本 docker的版本和 k8s的三个组件版本
如果搭配不当,根本就搭建不起来 我换了三次版本,重装了几次系统,才慢慢搭建起来
如果要自己搭配 一定要在网上查证一下
走了好多弯路,气死我了!!!
网络问题 一定要保证网络质量好 不然会导致好多镜像拉不下来,从而失败(master init步骤 失败了N次 换了家里的网 ,一下子就好了)
简述
本次我将从纯净的系统开始讲起 ,每一个组件的版本号,环境变量一一标注,帮助大家少走弯路,争取一次部署成功!
步骤大概分为:
1.yum源设置
2.docker安装
3.k8s(master&node)统一配置
4.master节点配置
6.calico CIN网络插件
5.node节点配置
6.验证
建议先看最后的报错信息 然后开始部署
2. 搭建k8s集群
1. 准备
1.1 物理硬件
(阿里云 腾讯云。。。都可以免费用1-3个月,可以尝试玩一玩)
阿里云
天翼云
1.2 统一版本
操作系统
阿里云 2H4G CentOS7.6
天翼云 2H4G CentOS7.6
docker 版本 : 19.03.14
yum 版本:3.4.3
Kubelet 版本: v1.23.1
kubeadm 版本: v1.23.1
kubectl 版本: v1.23.1
calico 版本: libseccomp-2.3.1-4.el7.x86_64
1.3 技能储备
docker高阶技能
玩过linux系统
1.4 工作目录
工作目录为:/root
登录用户为:root
配置文件就按照文章介绍的目录
2. 部署
2.1 环境(master&node)
2.1.1 yum源设置
更新yum工具包
yum -y update
yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp
安装yum-utils
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
每一个执行完都会有输出【Complete!】!!!
2.1.2 docker安装
原因
k8s对应的版本对有些docker版本不支持(k8s各版本对环境的参考地址)
很多错误基本都是版本不匹配 少组件或者少配置等等等等。。。
这里我们选择19.03.14版本
设置docker 镜像 ,阿里云镜像2014年以后有改动,
特别容易设置失败,所以这里最好两个都设置
# 阿里特别不稳定所以多添加一个 亚马逊 sudo yum-config-manager --add-repo https://mirror.azure.cn/docker-ce/linux/centos/docker-ce.repo # 阿里 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
要注意:会出现镜像添加失败的日志!!!
日出输出如下 才算设置成功。
添加镜像加速(all)
"exec-opts": ["native.cgroupdriver=systemd"] :指定docker的cgroupdriver为systemd
详见【2.1.3 k8s的各个节点的配置】章节
"https://docker.m.daocloud.io" :下载calico用到不然一直镜像拉取失败
![]()
"https://fuxr0eax.mirror.aliyuncs.com" :阿里速
阿里云镜像: 阿里云镜像加速 自己登录账号获取(每个人不一样)
"https://nmxk8hna.mirror.aliyuncs.com" 下载k8s组件用
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://docker.m.daocloud.io","https://fuxr0eax.mirror.aliyuncs.com","https://nmxk8hna.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload
下载docker 并检验安装是否成功
yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14
启动并设置开机自启
sudo systemctl start docker && sudo systemctl enable docker
每一个执行完都会有输出【Complete!】!!!
2.1.3 k8s安装
配置主机名字
# master节点设置为 master node节点设置为node1
sudo hostnamectl set-hostname mater
# 重新登录主机就会显示过来 或者 执行如下代码 刷新一下
bash
配置host文件 确保通过域名可以访问(重要)
## 增加host配置
cat >> /etc/hosts << EOF
公网IP master
公网IP node1
公网IP node2
EOF
配置 系统信息 关闭防火墙等之类。。。。
# (1)关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# (2)关闭selinux
setenforce 0
# 永久关闭
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# (3)关闭swap
swapoff -a
# 永久关闭
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
# (4)配置iptables的ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# (5)设置系统参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
配置k8s源
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
安装 kubectl,kubelet ,kubeadm
这三个东西一定要保证版本统一,一定要安装这个安装顺序来完成,一个一个安装
# 一行一行安装 yum install -y kubectl-1.23.1-0 yum install -y kubelet-1.23.1-0 yum install -y kubeadm-1.23.1-0
查看版本 并设置开机自启
kubectl version
kubelet --version
kubeadm version
# 开启自启动
systemctl start kubelet
systemctl enable kubelet
docker和k8s设置同一个cgroup 这个一定要设置 否则init的时候会一直报错(已经设置过就忽略)
# 编辑docker的daemon.json文件,每个节点都要执行
vi /etc/docker/daemon.json
# 增加这行
"exec-opts": ["native.cgroupdriver=systemd"]
systemctl restart docker
每一个执行完都会有输出【Complete!】!!!
2.2 检查
2.2.1 检查版本是否一致
# docker
docker version
# k8s
kubectl version
kubelet --version
kubeadm version
2.2.2 检查状态开启
检查docker active的状态
检查kubelet 是active的状态
2.2.3 检查主机通信
通过配置的域名是否可以通信(重要)
# 每个主机都执行命令 是否互相通信
ping master
ping node1
2.3 k8s master配置
2.3.1 master 初始化
2.3.1.1 master主机
随便选取一台主机为master节点 我这里选择阿里云
验证你的公网是否可用 如果没有就可以用此IP配置静态网络
# 看一下你的公网IP是否在机器中存在 ip a | grep 公网Ip
2.3.1.2 配置静态网络
原因
在目前的云服务器上公网IP不一定是实实在在绑定在机器上的
(当然有的服务器内公网用的确实是一个IP),
这个时候需要进行虚拟网卡的创建 防止Ip不固定,node和mater访问出错
新增虚拟网卡
# 如果没有就执行下面这段代码新增一个和公网IP一样的虚拟网卡IP
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=公网IP
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
重启网络
systemctl restart network
2.3.1.2 master节点
初始化master节点 把IP改成自己的 其他的不用管 大概几分钟,报错率极高
1.保证网络质量好,因为拉取镜像,网络不好会一致初始化失败
2.错误会有提示 注意看提示 通过命令查看日志,定位错误信息
3.有关涉及cni config等配置文件的 如果按照我这来 基本都可以归于网络问题
# 初始化
kubeadm init --image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=1.23.1 \
--pod-network-cidr=192.168.0.0/16 \
--control-plane-endpoint=master_公网IP \
--apiserver-advertise-address=master_公网IP
如果出现报错就执行这个
echo 1 > /proc/sys/net/ipv4/ip_forward
2.3.1.3 初始化成功
node节点的主机用node加入口令到master节点
多master节点用master加入口令到master节点
生效时间为一天,一天以后需要重新生成
kubeadm join 8.134.163.217:6443 --token aq5pgo.7ac6ov51llmyrcwu \
--discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77
2.3.1.4 口令管理
生成(node节点)及查看口令
# 生成口令
sudo kubeadm token create --print-join-command
# 查看口令
sudo kubeadm token list
生成(master节点)及查看口令
# 生成口令
kubeadm token create --ttl 0 --print-join-command
# 在master_2 节点执行 --control-plane:以管理员的身份加入
kubeadm join 8.134.163.217:6443 --token 92fak7.xmrf7qd0ea3atenu --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77 --control-plane
如果需要加入证书
# 生成口令 kubeadm token create --ttl 0 --print-join-command # 生成证书 kubeadm init phase upload-certs --upload-certs # 在master_2 节点执行 --control-plane:以管理员的身份加入 kubeadm join 8.134.163.217:6443 --token 92fak7.xmrf7qd0ea3atenu --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77 --control-plane --certificate-key ee31d7eaa8bea48bbd82c63c519e17562bdbf71daf6d89a1029b70a99ea2f2ff --cri-socket=unix:///var/run/cri-dockerd.sock
master_2 节点加入成功(理解为扩容)
To start administering your cluster from this node, 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
Run 'kubectl get nodes' to see this node join the cluster.
2.3.1.5 检查
检查镜像
# 查看镜像
docker images
# 查看容器运行实例
docker ps --format "{{.ID}}\t{{.Names}}\t\t{{.Status}}\t{{.Ports}}\t{{.Image}}"
# 查看容器运行日志
docker exec -it 容器名字/ID bash
我的因为已经装了calico 所以会多出来calico的镜像
没有装的话 一般就k8s开头的几个镜像
确保每个容器都是启动状态,如果是没运行,需要进入容器内部查看日志
查看节点
kubectl get nodes
[root@master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master NotReady control-plane,master 2d5h v1.23.1
原因:STATUS - NotReady :没有安装网络插件
master节点不用管 因为后续要装CNI网络组件
node节点就可以这个删掉 node不装CNI网络
详见【2.3.1 calico-CNI网络组件】
2.3.1.6 执行命令
执行【2.3.1.5 初始化成功】命令
配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,
这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理
mkdir -p /root/.kube cd .kube/ sudo cp -i /etc/kubernetes/admin.conf /root/.kube/config sudo chown $(id -u):$(id -g) /root/.kube/config vim /etc/profile # 添加以下内容永久生效 export KUBECONFIG="/etc/kubernetes/admin.conf" # 执行一下 source /etc/profile
到此master配置结束
2.3.1 calico-CNI网络组件
2.3.1.1 安装
官网
calico官网 根据k8s版本找到对应的calico版本
我这里选择calico 版本:libseccomp-2.3.1-4.el7.x86_64
方式一:
日出输出基本都是Create*** 如果出现warning就表示失败了
具体可看看日志(大概率是镜像拉取问题)
这里不用再执行【kubectl apply -f calico.yaml】因为本身就是kubectl指令获取的
# 有的主机选择这个会失败 ,比如我 哈哈哈!!!
kubectl create -f https://docs.projectcalico.org/manifests/calico.yaml
# 查看calico版本
rpm -qa | grep libseccomp
libseccomp-2.3.1-4.el7.x86_64
# 卸载calico
rpm -e libseccomp-2.3.1-3.el7.x86_6 --nodeps
yum remove -y libseccomp
方式二:
如果失败可以试试这种方式
kubectl apply -f calico.yaml
# 根据配置文件,curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
# 给集群创建资源
kubectl apply -f calico.yaml
2.3.1.2 检查
k8s自我修复能力,装好网络插件就会自动拉取镜像 启动镜像
一开始可能是pending状态 直到所有的runing就说明master节点部署成功了
# 确认一下calico是否安装成功 -w可以实时变化(看到calico都好了表示网络插件好了) kubectl get pods --all-namespaces -w
基本像我这样子都runing 就ok了 跟我不一样就是没起来。。。
健康检查
# 验证pod kubectl get pods -n kube-system # 健康检查(不要怀疑,就是healthz) curl -k https://localhost:6443/healthz
检查master节点
状态变为Ready
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 13h v1.23.1
[root@master ~]#
2.3.1.3 配置静态IP
如果你的ip是随机分配的(我的是因为公网 ip固定)需要将ip设置为静态ip
## 开启内核支持
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
## 执行生效
sysctl -p
## 开启ipvs支持
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
配置kube-proxy
## 配置kube-proxy,在master节点上操作
kubectl edit cm kube-proxy -n kube-system
## 文件示例
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
syncPeriod: 30s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs" #修改
在master重启kube-proxy
kubectl get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system
2.4 k8s node节点
2.4.1 node节点
2.4.1.1 准备
添加虚拟网卡(node_公网IP=node节点的IP地址)
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=node_公网IP
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
mastr和node 两台主机是可以互相通信的
详见【2.2.3 检查主机通信】章节
开放端口
如果是云服务器 要开放两个主机的部分端口
保证端口没被占用
建议除了常用端口以外 开放这几个端口
2.4.1.2 加入口令
【2.3.1.5 口令管理】拿到口令 到node节点中输入口令
# 到node节点 输入口令
kubeadm join 8.134.163.217:6443 --token vmpgj8.3zwadlknnt139c1d --discovery-token-ca-cert-hash sha256:de030273df16a6e237187e4a28a1324366065970b8dbe6f2c82fe78640a0de77
2.4.1.3 配置文件
kubectl 默认从 ~/.kube/config --- kube-proxy.kubeconfig的配置文件
配置文件获取访问 kube-apiserver 地址、证书、用户名等 信息,
如果没有配置该文件会读取默值,即localhost:8080
# 这里第一次执行会报错 [root@node1 ~]# kubectl get nodes The connection to the server localhost:8080 was refused - did you specify the right host or port?
默认安装目录应该是这两个
/opt/kubernetes/cfg(有的在这个目录)
/etc/kubernetes/kubelet.conf(我的在这个目录下)
确定这个地方指向的是master的IP
vim /etc/kubernetes/kubelet.conf
执行如下命令 将kubelet.conf 放入kubectl 读取的目录下
# 当前路径 /root
mkdir -p /root/.kube
sudo cp -i /etc/kubernetes/kubelet.conf /root/.kube/config
2.4.1.4 检查
master节点检查
当然 这个地方也会出现NotReady的报错
解决方法见下
node节点检查
2.4.1.5 部署完毕
我这里因为资金有限 只弄了两台云服务器 部署一主一丛玩玩
部署多主多从 可根据【2.3.1.5 口令管理】章节自己扩容
后续涉及集群高可用知识高级配置 也可以慢慢摸索
3. 错误汇总
3.1 yum源配置报错(极少)
3.1.1 没有输出Complete就有问题
报错为:
解决 :
# 删除或者备份以前的镜像源配置 然后添加新的镜像源
vim /etc/yum.repos.d/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#
[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
3.2.2 90%的yum报错都是镜像配置有问题 直接换镜像即可
3.2 docker错误
3.2.1 没有输出Complete就有问题
这个大多数也是镜像问题
错误一:sudo yum-config-manager命令报错:不能拉取成功 切换其他镜像试试
因为yum下镜像仓库地址太多 每次都不固定,这个建议多试几次就能解决
错误二: job for docker.service failed because the control process exited with error
查看自己的配置文件 最好是在外面写好 复制过来 数据格式为:json
vim /etc/docker/daemon.json
错误三:镜像加速失败
这个可以多配置几个,阿里云的镜像加速有时候却是有问题
不要复制别人的 要去自己的控制台复制自己的
3.2 master错误
这个安装没啥错误 输出Complete就ok 初始化错误 这里我只写我遇到的
错误一:网络问题
本人在单位安装失败,回家安装就成功,一样的步骤 归结于网络问题!!!
导致镜像拉不全,所以一定要看每一步的日志
错误二:cgroup
docker和k8s一定要设置cgroup 详见【2.1.3 k8s安装】章节
错误三:重新init的时候要删除init失败的配置
error execution phase preflight: [preflight] Some fatal errors occurred: [ERROR Port-10259]: Port 10259 is in use [ERROR Port-10257]: Port 10257 is in use [ERROR Port-10250]: Port 10250 is in use
上次失败的初始化 要把初始化配置文件删除重新初始化
rm -rf /etc/kubernetes/* rm -rf ~/.kube/* rm -rf /var/lib/etcd/* 重启 kubeadm reset 或者 systemctl restart kubeadm
注意:一定要保证网络好!!不然很多镜像拉不下来
这个地方出错的概率很大 原因很多 ,比如 网络 docker 版本 k8s的版本 阿里云镜像。。。。等等等等
我建议 如果实在找不到问题 就重新安装 注意每一步都要看清楚日志
因为日志有时候会输出 failed Err 等 可能没注意 我自己也重装了N次
错误四:多台master 加入集群时候
如下错误提示:
unable to add a new control plane instance a cluster that doesn't have a stable controlPlaneEndpoint address
原因:
kubeadm-config.yaml 文件没有配置controlPlaneEndpoint属性
解决:
kubectl edit cm kubeadm-config -n kube-system
上图所示位置添加
controlPlaneEndpoint: 192.168.2.124:6443//添加这个
3.3 node 节点
错误一:网络ping不通
阿里云需要开通ICMP 才能被其他主机通信 (烦得很!!!,注意配置上,不然两台主机不能通信)
- 登录服务器控制台(阿里云/腾讯云都有入口)
- 找到安全组设置→添加入站规则
- 协议类型选ICMP,源地址填0.0.0.0/0
除此之外 要检查域名是否配置正确
错误二:节点状体为:NotReady
# 这个命令查看日志 journalctl -xeu kubelet #报错如下: Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
修改:
node节点不装网络插件 所以删掉即可
vim /var/lib/kubelet/kubeadm-flags.env # 删除其中的 --network-plugin=cni # 重启kubelet systemctl daemon-reload systemctl restart kubelet # 查看状态 systemctl status kubelet
删除 --network-plugin=cni
3.4 运行
错误一:节点运行异常
可以看到有些节点运行状态不是为runing
状态不为runing 确定是节点为node1主机 应该是node1主机docker配置加速器没生效
切换node1主机
查看日志:会看到镜像拉取失败的日志
kubectl describe pod [对应节点] -n kube-system
可以将master主机的文件拷贝到node 然后重启docker!重启docker!
# master主机上输入 xxxx:node1主机的IP scp /etc/docker/daemon.json root@xxxx:/etc/docker/daemon.json
返回node主机
# 重启docker systemctl restart docker # 重启kubectl systemctl restart kubelet