系列文章
第一章:✨ 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 集群
租用云服务器搭建比较方便,如果想使用虚拟机可参考我另一篇文章 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 启动日志)
错误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 集群