centos安装k8s集群
1、准备三台虚拟机(要保证uuid不一样,如果是克隆的会因为uuid一样而引发报错)
系统:Linux、centos 7.9 、3 台可以联网
k8s 版本:1.23.1
docker 版本:20.10.16
注意: 如果是虚拟机网关不要设置 192.168.1.2,虚拟机 IP 不要设置 192.168.1.x,安装 kube-flannel 会报错,下面部分错误是其他版本报的错误,有些信息和上面指定版本不同
我这里IP分别设置为:
HOSTNAME | IP ADDRESS |
---|---|
k8s-master | 192.168.1.110 |
k8s-node1 | 192.168.1.111 |
k8s-node2 | 192.168.1.112 |
设置主机名 HostName,三台服务器分别设置为 k8s-master、k8s-node1、k8s-node2
注意 这里的 hostname 只能包含 -
或 .
这两种特殊符号,否则后面集群初始化会出现问题
# 192.168.1.110 上执行
hostnamectl set-hostname k8s-master
# 192.168.1.111 上执行
hostnamectl set-hostname k8s-node1
# 192.168.1.112 上执行
hostnamectl set-hostname k8s-node2
给三台机器都添加内网 ip 映射关系
cat <<EOF >> /etc/hosts
192.168.1.110 k8s-master
192.168.1.111 k8s-node1
192.168.1.112 k8s-node2
EOF
分别测试能否 ping 通
ping k8s-master
ping k8s-node1
ping k8s-node2
2、基础环境准备(以下操作默认三台机器都执行)
-
关闭SELinux
Linux 中关闭 SELinux 的方法(一般云服务器都已经关闭)
-
临时关闭:输入命令 setenforce 0,重启系统后还会开启。
-
永久关闭:输入命令 vim /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabled,然后保存退出。
# 也可以使用 sed 命令快捷替换 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
-
-
禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。三台虚拟机需做同样操作:
如果报错则先下载 iptables.service
yum install iptables-services -y
# 1 关闭firewalld服务 systemctl stop firewalld systemctl disable firewalld # 2 关闭iptables服务 systemctl stop iptables systemctl disable iptables
-
关闭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 命令重启
如果修改 swap 重启服务器报错,参考 https://blog.csdn.net/weixin_45492179/article/details/102709752,注释掉 /etc/fstab 文件 UUID 即可
-
同步网络时间
集群中的时间必须要精确一致,我们可以直接使用
chronyd
服务从网络同步时间,三台服务器需做同样的操作#下载chrony工具 yum install chrony
同步时间、开机自启、查看时间
systemctl start chronyd systemctl enable chronyd date
-
修改linux的内核参数
我们需要修改linux的内核参数,添加网桥过滤和地址转发功能,编辑
/etc/sysctl.d/kubernetes.conf
文件,添加如下配置:net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
添加后进行以下操作:
# 重新加载配置 sysctl -p # 加载网桥过滤模块 modprobe br_netfilter # 查看网桥过滤模块是否加载成功 lsmod | grep br_netfilter
同样是在三台服务器都进行操作,成功信息如下:
-
配置 ipvs 功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的 相比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
# 安装ipset和ipvsadm yum install ipset ipvsadmin -y # 添加需要加载的模块写入脚本文件 cat <<EOF > /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # 为脚本文件添加执行权限 chmod +x /etc/sysconfig/modules/ipvs.modules # 执行脚本文件 /bin/bash /etc/sysconfig/modules/ipvs.modules # 查看对应的模块是否加载成功 lsmod | grep -e ip_vs -e nf_conntrack_ipv4
完成以上配置后重启服务器
reboot
-
添加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
-
3、安装k8s组件、docker
-
安装k8s组件
若安装指定版本 docker 可运行
yum list kubelet --showduplicates | tail -n 10
查看版本号
若安装指定版本 k8s 组件可运行yum list docker-ce --showduplicates | sort -r
查看版本号,(注意:不要选择过高版本,我安装的 1.23.1,1.24.0 会报错)yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1
- Kubectl: Kubectl 管理 Kubernetes 集群命令行工具
- kubeadm:Kubeadm 是一个快捷搭建 kubernetes(k8s) 的安装工具, 它提供了 kubeadm init 以及 kubeadm join 这两个命令来快速创建 kubernetes 集群
- kubelet:kubelet 是在每个 Node 节点上运行的主要 “节点代理”。
-
指定版本安装docker()
#如果存在历史版本先删除历史版本 yum remove docker-ce docker-ce-cli containerd.io #删除资源 rm -rf /var/lib/docker # docker默认的工作路径 rm -rf /var/lib/containerd yum install docker-ce-20.10.16
-
启动并设置开机启动
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://o0cjppoy.mirror.aliyuncs.com"] } EOF systemctl daemon-reload && systemctl restart docker # 重启完之后可使用 docker info 查看是否修改成功
4、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.1.110 \
--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
常见错误可参考:https://blog.csdn.net/IT_Java_Roy/article/details/104631745
初始化成功,记得把 kubeadm join xxx 保存起来,忘记了重新获取:
kubeadm token create --print-join-command
默认 24h 过期
kubeadm token create --print-join-command --ttl=0
永不过期
kubeadm token list
查看是否有存活的 token
5、授权节点访问控制集群
初始化成功可以看到提示信息,配置成功可以使用 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 节点
6、node工作节点加入集群
把工作节点加入集群(只在工作节点执行),kubeadm master 节点初始化集群保存的 kubeadm join
# 上面master初始化成功后直接复制过来
kubeadm join 192.168.1.110:6443 --token xxxx.xxxxxxvo7dvwgklu \
--discovery-token-ca-cert-hash sha256:c1d9d1ea69baf12ac030a8fdb30a977d93aebdc6990264450b9f4d703df4d067
master节点查看集群节点信息
kubectl get nodes
注意: 如果 node 节点加入集群报错,使用 journalctl -xefu kubelet 查看日志,再次执行 kubeadm join 命令前使用 kubeadm reset 重置
7、安装网络插件
节点加入集群成功,使用 kubectl get nodes 查看节点信息,发现都是 NotReady,需要在主节点安装网络插件 Flannel 或 Calicos
-
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
安装完成等几分钟所有节点状态从 NotReady 变为 Ready
查看所有系统的 pod,保证每个都是运行状态,如果还有失败的,排查错误
更多 kubectl 命令可参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
kubeadm reset报错 参考处理方案: https://blog.csdn.net/weixin_38146924/article/details/117519139