系列文章


第一章:✨ 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)


文章目录

  • 系列文章
  • 一、裸机部署 k8s 集群
    • 1、基础环境
    • 2、添加域名映射
      • ①、设置主机名 HostName
      • ②、三台服务器添加域名映射
    • 3、关闭相关服务
      • ①、关闭SELinux
      • ②、关闭防火墙
      • ③、关闭 swap 分区
    • 4、同步网络时间
    • 5、添加 yum 源
      • ①、添加 k8s 的yum源
      • ②、添加 docker 的 yum源
    • 6、安装 k8s 组件
    • 7、启动配置服务
      • ①、启动 docker、kubelet 服务
      • ②、修改 docker 配置
    • 8、kubeadm 初始化集群(只需要在主节点跑)
      • 1、kubeadm init 遇到的错误
      • 2、初始化成功
    • 9、授权节点访问控制集群
      • ①、master 节点添加认证
      • ②、node 节点添加认证
      • ③、node 工作节点加入集群
      • ④、安装网络插件 Flannel

参考文章: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 -mtotal        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 集群

k8s入门:裸机部署 k8s 集群相关推荐

  1. k8s使用StatefulSet部署MongoDB集群

    1.1 前提准备 制作MongoDB 镜像,可从 Docker Hub 官网 下载镜像,目的是解决提示权限mongo-sidecar提示权限错误问题(官方镜像基础上添加了密码认证) 生成 keyfil ...

  2. K8s入门教程|这个给集群搞硬装的才是幕后英雄

    大家好啊,咱们的Kubernetes学习笔记时隔两月终于又迎来了更新,前面咱们介绍的Deployment.Service.Statefulset 相信看过文章的同学都已经明白他们各自的能力和使用场景了 ...

  3. k8s容器化部署及集群搭建笔记

    kubeadm部署k8s 将此文章写给我最心爱的女孩 目录 kubeadm部署k8s 1.部署准备工作 小知识 2.安装具体步骤 1.安装docker 2.配置国内镜像加速器 3.添加k8s的阿里云y ...

  4. K8S StatefulSet方式部署elasticsearch集群 —— 筑梦之路

    直接上yaml内容 # es-cluster.yaml apiVersion: apps/v1 # 设置控制器 kind: StatefulSet metadata:name: es-clustern ...

  5. K8S Deployment脚本部署Tomcat集群

    Deployment脚本范本 部署相关常用命令 kubectl apply 是更新已经存在的脚本 kubectl create 是创建部署脚本 vim tomcat-deploy.yml replic ...

  6. k8s入门:部署应用到 k8s 集群

    系列文章 第一章:✨ k8s入门:裸机部署 k8s 集群 第二章:✨ k8s入门:部署应用到 k8s 集群 第三章:✨ k8s入门:service 简单使用 第四章:✨ k8s入门:StatefulS ...

  7. kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问

    首先,配置 Docker 镜像加速服务 登录阿里云账号,进入控制台 -> 容器镜像服务 (不需要有阿里云的服务器,只要注册账号即可) 在两台 node 节点上配置好阿里云的镜像加速. 重启一下 ...

  8. 手动安装K8s第三节:etcd集群部署

    手动安装K8s第三节:etcd集群部署 准备安装包 https://github.com/coreos/etcd 版本:3.2.18 wget https://github.com/coreos/et ...

  9. K8S 部署rabbitmq集群

    K8S 部署rabbitmq集群 版本介绍 名称 版本 k8s 1.18 rabbitmq 3.8 命名空间:rabbitmq 我这里已经建立 configmap 配置文件 [root@k8s-mas ...

最新文章

  1. 如何利用pyecharts绘制炫酷的关系网络图?
  2. 【程序设计基础】第九、十、十一章 综合实例分析 递归
  3. 流式计算框架Storm后台启动命令(避免新开窗口)
  4. 十八、前端必学Bootstrap美化(上篇)
  5. POJ - 2002 Squares 数正方形【二分】【哈希表】
  6. VTK:相互作用之ImageClip
  7. Spork: Pig on Spark实现分析
  8. [Spark]PySpark入门学习教程---介绍(1)
  9. 《朝花夕拾》金句摘抄(一)
  10. 防水耐脏,超大容量双肩包,限时拼团仅需49元
  11. SQL2000系統表的應用
  12. AllenNLP2.2.0:入门篇
  13. linux卸载nvdia驱动_Ubuntu 卸载 Nvidia 驱动和安装最新驱动
  14. Php框架CodeIgniter 学习
  15. Golang内存逃逸
  16. 谷仓创造区块链+电商消费新模式
  17. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)
  18. dedecms织梦模板|响应式粉红色母婴月嫂源码 母婴育儿类网站模板(自适应手机版)
  19. 二维空间下的向量旋转
  20. Android Gson解析json详解

热门文章

  1. 跟我学flutter:Flutter雷达图表(一)如何使用kg_charts
  2. 我在乐字节学习前端的第三天-学习笔记:H5+CSS3面试题总结
  3. 【AIOT】1.3 课程安排介绍
  4. Consider defining a bean of type 'com.cxh.common.service.OrderService' in your configuration.怎么解决呢
  5. Java文件下载工具类
  6. Win7如何修改文件夹背景颜色教学
  7. 登陆到虚拟机查看目前服务器开放的端口,查看虚拟机开放端口号
  8. Attention 注意力机制
  9. 敏学网------------资料下载
  10. 手把手带你重现菌群封面文章全部结果图表