k8s入门:裸机部署 k8s 集群

系列文章

第一章:✨ k8s入门:裸机部署 k8s 集群
第二章:✨ k8s入门:部署应用到 k8s 集群
第三章:✨ k8s入门:service 简单使用
第四章:✨ k8s入门:StatefulSet 简单使用
第五章:✨ k8s入门:存储(storage)
第六章:✨ K8S 配置 storageclass 使用 nfs 动态申领本地磁盘空间
第七章:✨ k8s入门:配置 ConfigMap & Secret
第八章:✨ k8s入门:k8s入门:Helm 构建 MySQL
第九章:✨ k8s入门:kubernetes-dashboard 安装
第十章:✨ k8s入门:kube-prometheus-stack 全家桶搭建(Grafana + Prometheus)



参考文章:https://k8s.easydoc.net/

一、裸机部署 k8s 集群

租用云服务器搭建比较方便,如果想使用虚拟机可参考我另一篇文章 https://blog.csdn.net/qq_41538097/article/details/124942720

下面步骤假设你已经有三台 centos 7.9 机器

1、基础环境

系统:Linux、centos 7.9 、3 台可以联网
k8s 版本:1.23.1
docker 版本:20.10.16
注意: 如果是虚拟机网关不要设置 192.168.1.2,虚拟机IP不要设置 192.168.1.x,安装 kube-flannel 会报错,下面部分错误是其他版本报的错误,有些信息和上面指定版本不同

2、添加域名映射
①、设置主机名 HostName

三台服务器分别设置为 master、node1、node2

# 192.168.25.100
hostnamectl set-hostname master 
# 192.168.25.101
hostnamectl set-hostname node1
# 192.168.25.102
hostnamectl set-hostname node2
②、三台服务器添加域名映射

三台服务器都添加内网 ip 映射关系

cat <<EOF >> /etc/hosts
192.168.25.100 master
192.168.25.101 node1
192.168.25.102 node2
EOF

测试能否 ping 通

ping master
ping node1
ping node2
3、关闭相关服务

三台服务器都关闭 SELinux、关闭防火墙

①、关闭SELinux

Linux 中关闭 SELinux 的方法(一般云服务器都已经关闭)
1、临时关闭:输入命令 setenforce 0,重启系统后还会开启。
2、永久关闭:输入命令 vim /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后保存退出。

# 也可以使用 sed 命令快捷替换
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
②、关闭防火墙

云服务默认关闭

systemctl stop firewalld && systemctl disable firewalld
③、关闭 swap 分区

虚拟机搭建需要关闭

# 临时关闭
swapoff -a

# 永久关闭  
vim /etc/fstab 
#注释下面这行,或使用 sed 命令注释 sed -ri 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

# 查看是否关闭成功
free -m
# 若都显示 0 则表示关闭成功,需要重启服务器生效,可以使用 reboot 或 shutdown -r now 命令重启
[root@node2 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           3770         305        3115          11         350        3242
Swap:             0           0           0

如果修改 swap 重启服务器报错,参考 https://blog.csdn.net/weixin_45492179/article/details/102709752,注释掉 /etc/fstab 文件 UUID 即可

4、同步网络时间

可以先执行 date 查看时间是否准确,不准确则去同步网络时间,三台服务器都执行 ntpdate ntp1.aliyun.com,通过网络同步时间

# 如果没有 ntpdate ,使用如下命令安装
# yum install -y ntpdate
ntpdate ntp1.aliyun.com # 使用
date  # 2022年 05月 26日 星期四 18:03:19 +08
5、添加 yum 源

三台服务器都添加

①、添加 k8s 的yum源

添加 k8s 的yum源 (如果不指定目录,默认 kubernetes.repo 文件在当前目录)

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=1
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
②、添加 docker 的 yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果报错 -bash: yum-config-manager: command not found 则运行 yum install -y yum-utils
如果安装 yum-utils 报错 failure: repodata/repomd.xml from kubernetes: [Errno 256] No more mirrors to try.,则设置 repo_gpgcheck=0

6、安装 k8s 组件

三台服务器都添加

若安装指定版本 docker 可运行 yum list kubelet --showduplicates | tail -n 10 查看版本号
若安装指定版本 k8s 组件可运行 yum list docker-ce --showduplicates | sort -r 查看版本号,(注意:不要选择过高版本,我安装的 1.23.1,1.24.0 会报错)

  • Kubectl: Kubectl 管理 Kubernetes 集群命令行工具
  • kubeadm:Kubeadm 是一个快捷搭建kubernetes(k8s)的安装工具,它提供了kubeadm init 以及 kubeadm join这两个命令来快速创建kubernetes集群
  • kubelet:kubelet 是在每个 Node 节点上运行的主要 “节点代理”。
yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 docker-ce

docker 报错 : Problem 1: problem with installed package podman-2.0.5-5.module_el8.3.0+512+b3b58dca.aarch64
原因是 centos 8.0 以上版本 docker 和 podman 冲突,使用 yum erase -y podman buildah 移除 podman 即可
kubelet 报错:Error: Problem: cannot install the best candidate for the job - package kubelet does not have a compatible architecture
选的 centos 7.9 安装成功,centos 8.2 安装失败,不建议选过高版本

报错:[Errno -1] repomd.xml signature could not be verified for kubernetes Trying other mirror.
解决方法:https://github.com/kubernetes/kubernetes/issues/60134

7、启动配置服务

三台服务器都运行

①、启动 docker、kubelet 服务
systemctl enable kubelet && systemctl start kubelet # 开机自启动并启动 kubelet 服务
systemctl enable docker && systemctl start docker # 开机自启动并启动 docker 服务
②、修改 docker 配置

官方建议修改 docker Cgroup Driver 为 systemd

文件不存在如下方式添加,如果文件存在 vi 进入 /etc/docker/daemon.json 文件添加 “exec-opts”: [“native.cgroupdriver=systemd”] 即可

cat <<EOF > /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": ["https://m24eqnhh.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload && systemctl restart docker # 重启完之后可使用 docker info 查看是否修改成功
8、kubeadm 初始化集群(只需要在主节点跑)

注意: 失败了要使用用 kubeadm reset 重置

方式一

# 初始化集群控制台 Control plane
# apiserver-advertise-address: master 节点 IP
# image-repository:镜像仓库地址
# kubernetes-version: 版本号
# pod-network-cidr 和 service-cidr 不清楚如何设置,使用该默认值
# 查看其他默认值可使用命令: kubeadm config print init-defaults > kubeadm.yaml 查看默认初始化文件
kubeadm init \
--apiserver-advertise-address=192.168.25.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.1 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/16 

方式二

# 如果选择方式二安装,需要手动修改 kubeadm.yaml 文件中参数(具体参数参考方式一)

kubeadm config print init-defaults > kubeadm.yaml #  生成默认 kubeadm 文件

kubeadm config images list --config kubeadm.yaml # 查看组件版本号

kubeadm config images pull --config kubeadm.yaml # 提前拉取组件镜像

kubeadm init --config kubeadm.yaml # 使用 kubeadm.yaml 文件初始化集群

常见错误可参考:https://blog.csdn.net/IT_Java_Roy/article/details/104631745

1、kubeadm init 遇到的错误

错误解决方法

  • systemctl status kubelet 查看 kubelet 有没有启动(初始化失败会启动失败,初始化成功会自动重启)
  • kubectl get pods -n kube-system (查看系统 pod 运行状态)
  • kubectl describe pod [pod-name] -n kube-system(查看系统 pod 启动详情)
  • journalctl -xefu kubelet (查看 kubelet 启动日志)

错误1getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService

解决方法:

rm -f /etc/containerd/config.toml
systemctl restart containerd

错误2[kubelet-check] Initial timeout of 40s passed
安装 1.24.0(如果未指定版本,默认最新版本)报错,暂未解决,指定 1.23.1 版本出初始化成功

错误3failed to run Kubelet: running with swap on is not supported, please disable swap

解决方法:

  • 方法一:kubelet 配置忽略 swap

    # vim /etc/sysconfig/kubelet 
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    
  • 方法二:关闭 swap

    # 临时关闭
    swapoff -a
    
    # 永久关闭  
    vim /etc/fstab 
    #注释下面这行
    #/dev/mapper/centos-swap swap                    swap    defaults        0 0
    

错误4/proc/sys/net/ipv4/ip_forward contents are not set to 1

在这里插入图片描述
解决方法

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
2、初始化成功

初始化成功,记得把 kubeadm join xxx 保存起来,忘记了重新获取:
kubeadm token create --print-join-command 默认 24h 过期
kubeadm token create --print-join-command --ttl=0 永不过期
kubeadm token list 查看是否有存活的 token
在这里插入图片描述

9、授权节点访问控制集群

初始化成功可以看到提示信息,配置成功可以使用 kubectl 控制集群
在这里插入图片描述

复制主节点授权文件到其他节点,以便 kubectl 的 node 节点也有权限访问集群

①、master 节点添加认证

kubectl 的 master 节点初始化成功会生成 /etc/kubernetes/admin.conf 认证文件

  • 方法一:添加环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
  • 方法二:修改认证文件访问权限
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
②、node 节点添加认证

如果上面 master 认证使用的方式二,则将 $HOME/.kube/config 文件复制到 node 节点 $HOME/.kube 路径下,node 节点也可以访问 kubectl 集群,配置环境方式类似。

# 将 master 节点 config 文件通过 scp 命令传递到 node 子节点
# 不能直接使用 scp 命令复制$HOME/.kube/config 文件,使用如下方法或文件传输工具
mkdir -p $HOME/.kube # node 节点执行
scp /etc/kubernetes/admin.conf root@node1:/root/.kube/config # master 节点
chown $(id -u):$(id -g) $HOME/.kube/config # node 节点

如果不复制文件会报错The connection to the server localhost:8080 was refused - did you specify the right host or port?

查看节点状态,发现都是 NotReady

kubectl get nodes
③、node 工作节点加入集群

把工作节点加入集群(只在工作节点跑),kubeadm master 节点初始化集群保存的 kubeadm join

kubeadm join 192.168.25.100:6443 --token b0t2j0.te29am3punpg93ir --discovery-token-ca-cert-hash sha256:90fbef8b3f2d63cb35127fdbc1214870bb9251858928c7647ce9d874a71d421b 

注意: 如果 node 节点加入集群报错,使用 journalctl -xefu kubelet 查看日志,再次执行kubeadm join 命令前使用 kubeadm reset 重置

错误x509: certificate has expired or is not yet valid

kubeadm join 报错如下
在这里插入图片描述

解决方法:
master 主节点执行 kubeadm token create --print-join-command --ttl=0 ,token 永不过期

节点加入集群成功,使用 kubectl get nodes 查看节点信息,发现都是 NotReady,需要在主节点安装网络插件 Flannel 或 Calicos

④、安装网络插件 Flannel
  • Flannel 是一种基于 overlay 网络的跨主机容器网络解决方案,也就是将 TCP 数据包封装在另一种网络包里面进行路由转发和通信。

  • Flannel 配合 etcd 可以实现不同宿主机上的 docker 容器内网IP的互通。

安装网络插件,否则 node 是 NotReady 状态(主节点跑,安装可能需要几分钟)

# 很有可能国内网络访问不到这个资源,你可以网上找找国内的源安装 flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 也可以使用如下方式安装 flannel 组件,先下载  yaml 文件
wget -c  https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 
kubectl apply -f kube-flannel.yml

# 如果要卸载 flannel 可以使用如下方式,根据你安装时的方式选择
# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl delete -f kube-flannel.yml

# r如果要安装 calico,使用如下方式
# kubectl apply -f https://projectcalico.docs.tigera.io/manifests/calico.yaml

可能遇到错误Error registering network: failed to acquire lease: node "master" pod cidr not assigned(虚拟机安装 k8s 发现,云服务器未发现)

kubectl get pods -n kube-system 查看 容器运行状态
在这里插入图片描述
查看一个启动错误容器的日志 kubectl logs -f kube-flannel-ds-bzkcl -n kube-system 发现报错 Error registering network: failed to acquire lease: node “master” pod cidr not assigned
在这里插入图片描述
解决方法: 分配 cidr
vim /etc/kubernetes/manifests/kube-controller-manager.yaml

--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16

添加到如下位置
在这里插入图片描述
安装完成等几分钟所有节点状态从 NotReady 变为 Ready
在这里插入图片描述
查看所有系统的 pod,保证每个都是运行状态,如果还有失败的,排查错误
在这里插入图片描述

更多 kubectl 命令可参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

下篇讲述部署应用到 k8s 集群

  • 23
    点赞
  • 205
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值