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)
文章目录
- 系列文章
- 一、裸机部署 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 启动日志)
错误1:getting 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 版本出初始化成功
错误3: failed 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 集群相关推荐
- k8s使用StatefulSet部署MongoDB集群
1.1 前提准备 制作MongoDB 镜像,可从 Docker Hub 官网 下载镜像,目的是解决提示权限mongo-sidecar提示权限错误问题(官方镜像基础上添加了密码认证) 生成 keyfil ...
- K8s入门教程|这个给集群搞硬装的才是幕后英雄
大家好啊,咱们的Kubernetes学习笔记时隔两月终于又迎来了更新,前面咱们介绍的Deployment.Service.Statefulset 相信看过文章的同学都已经明白他们各自的能力和使用场景了 ...
- k8s容器化部署及集群搭建笔记
kubeadm部署k8s 将此文章写给我最心爱的女孩 目录 kubeadm部署k8s 1.部署准备工作 小知识 2.安装具体步骤 1.安装docker 2.配置国内镜像加速器 3.添加k8s的阿里云y ...
- K8S StatefulSet方式部署elasticsearch集群 —— 筑梦之路
直接上yaml内容 # es-cluster.yaml apiVersion: apps/v1 # 设置控制器 kind: StatefulSet metadata:name: es-clustern ...
- K8S Deployment脚本部署Tomcat集群
Deployment脚本范本 部署相关常用命令 kubectl apply 是更新已经存在的脚本 kubectl create 是创建部署脚本 vim tomcat-deploy.yml replic ...
- k8s入门:部署应用到 k8s 集群
系列文章 第一章:✨ k8s入门:裸机部署 k8s 集群 第二章:✨ k8s入门:部署应用到 k8s 集群 第三章:✨ k8s入门:service 简单使用 第四章:✨ k8s入门:StatefulS ...
- kubernetes入门到精通(二):k8s部署Tomcat集群,基于NTFS协议的文件集群共享,Service提供负载均衡,端口转发工具Rinetd配置外部访问
首先,配置 Docker 镜像加速服务 登录阿里云账号,进入控制台 -> 容器镜像服务 (不需要有阿里云的服务器,只要注册账号即可) 在两台 node 节点上配置好阿里云的镜像加速. 重启一下 ...
- 手动安装K8s第三节:etcd集群部署
手动安装K8s第三节:etcd集群部署 准备安装包 https://github.com/coreos/etcd 版本:3.2.18 wget https://github.com/coreos/et ...
- K8S 部署rabbitmq集群
K8S 部署rabbitmq集群 版本介绍 名称 版本 k8s 1.18 rabbitmq 3.8 命名空间:rabbitmq 我这里已经建立 configmap 配置文件 [root@k8s-mas ...
最新文章
- 如何利用pyecharts绘制炫酷的关系网络图?
- 【程序设计基础】第九、十、十一章 综合实例分析 递归
- 流式计算框架Storm后台启动命令(避免新开窗口)
- 十八、前端必学Bootstrap美化(上篇)
- POJ - 2002 Squares 数正方形【二分】【哈希表】
- VTK:相互作用之ImageClip
- Spork: Pig on Spark实现分析
- [Spark]PySpark入门学习教程---介绍(1)
- 《朝花夕拾》金句摘抄(一)
- 防水耐脏,超大容量双肩包,限时拼团仅需49元
- SQL2000系統表的應用
- AllenNLP2.2.0:入门篇
- linux卸载nvdia驱动_Ubuntu 卸载 Nvidia 驱动和安装最新驱动
- Php框架CodeIgniter 学习
- Golang内存逃逸
- 谷仓创造区块链+电商消费新模式
- python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)
- dedecms织梦模板|响应式粉红色母婴月嫂源码 母婴育儿类网站模板(自适应手机版)
- 二维空间下的向量旋转
- Android Gson解析json详解
热门文章
- 跟我学flutter:Flutter雷达图表(一)如何使用kg_charts
- 我在乐字节学习前端的第三天-学习笔记:H5+CSS3面试题总结
- 【AIOT】1.3 课程安排介绍
- Consider defining a bean of type 'com.cxh.common.service.OrderService' in your configuration.怎么解决呢
- Java文件下载工具类
- Win7如何修改文件夹背景颜色教学
- 登陆到虚拟机查看目前服务器开放的端口,查看虚拟机开放端口号
- Attention 注意力机制
- 敏学网------------资料下载
- 手把手带你重现菌群封面文章全部结果图表