CentOS 7.9 安装如何 k8s

本文介绍在CentOS系统上安装Kubernetes集群的详细步骤。首先说明了安装前的准备事项,包括机器配置、网络要求等;接着阐述了Docker的安装、配置过程;然后讲解了kubelet、kubeadm、kubectl的安装,以及master节点初始化、网络插件calico安装和子节点加入集群的操作;最后进行了k8s集群测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🐶安装前准备事项


  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 最好保证服务都是同一网络环境下(我自己这边使用的云服务的网络安全组)
  • 没有标注为需要那台机器执行为全部机器执行或者任意机器执行

🐕安装docker


🐕‍🦺删除docker


yum remove docker

🐕‍🦺安装yum工具


sudo yum install -y yum-utils

🐕‍🦺设置docker镜像源


sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

🐕‍🦺安装指定版本docker


sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io-1.4.6

🐕‍🦺设置开启自启


systemctl enable docker --now

🐕‍🦺阿里云镜像加速


sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://soxxp5r5.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

🐕准备环境


每个机器ip互通
每台机器有自己的hostname 不能使用losthost

hostNameIP
k8s-master192.168.0.71
k8s-node1192.168.0.138
k8s-node2192.168.0.154
# 根据规划设置主机名
hostnamectl set-hostname <hostname>

其他机器跟着一样设置即可
在这里插入图片描述

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
# 永久禁用
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭swap  临时
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab  
# 将桥接的IPv4流量传递到iptables的链 这个是k8s官网的步骤
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
sysctl --system  # 生效

🐕安装kubelet、kubeadm、kubectl


#配置k8s的yum源地址
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
#安装 kubelet,kubeadm,kubectl
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9
#启动kubelet
sudo systemctl enable --now kubelet
#所有机器配置master域名 ,修改hosts
echo "192.168.0.71  k8s-master" >> /etc/hosts
cat >> /etc/hosts << EOF
192.168.0.138   k8s-node1
192.168.0.154   k8s-node2
EOF

🐕‍🦺初始化master节点


以下步骤在master执行即可 一定要注意网段不能重复
我这边服务网段就是192.168.0.0/16,所以-pod-network-cidr=172.31.0.0/16使用这个网段,后面用网络插件是calico,默认网段是192.168.0.0/16,需修改其对应配置文件

kubeadm init \
--apiserver-advertise-address=192.168.0.71 \
--control-plane-endpoint=k8s-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=172.31.0.0/16

参数详解

  1. apiserver-advertise-address=192.168.0.71
    作用:指定 Kubernetes API 服务器对外暴露的 IP 地址。此 IP 必须是当前节点的有效 IP,其他节点和组件(如 kubelet、kube-proxy)将通过此 IP 与 API 服务器通信。
  • 典型场景:
    节点有多个网卡时,需明确指定监听的 IP。
    避免默认绑定到 127.0.0.1 或无效地址。
    2. --control-plane-endpoint=k8s-master
    作用:指定控制平面的统一入口地址(DNS 名称或 IP),用于高可用(HA)集群或单节点负载均衡。单节点模式下,此参数通常指向当前节点的主机名或 IP。
  • 注意事项:
    若使用主机名(如 k8s-master),需确保该名称能被解析为正确的 IP(通过 DNS 或 /etc/hosts)。
    高可用集群中,此地址应指向负载均衡器(如 HAProxy、Nginx)的虚拟 IP。
  1. image-repository=registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images
    作用:指定拉取 Kubernetes 核心组件镜像的仓库地址。默认仓库 k8s.gcr.io 在国内访问受限,此参数使用阿里云镜像仓库加速下载。
  • 典型场景:
    解决国内网络无法拉取官方镜像的问题。
    使用私有镜像仓库时替换为私有地址。
  1. kubernetes-version=v1.20.9
    作用:明确指定安装的 Kubernetes 版本。若不指定,kubeadm 会尝试安装最新版本。
    注意事项:
    需确保镜像仓库中存在该版本的镜像(如阿里云仓库是否同步了 v1.20.9)。
    版本号需与后续组件(如 kubelet、kubectl)一致。
  2. service-cidr=10.96.0.0/16
    作用:定义 Kubernetes Service 的虚拟 IP 地址范围(CIDR)。默认值为 10.96.0.0/12,此处缩小范围为 10.96.0.0/16。
  • 注意事项:
    需确保此 CIDR 与物理网络、Pod 网络无冲突。
    Service CIDR 用于分配 ClusterIP(如 10.96.0.1 为 kube-dns 的 ClusterIP)。
  1. pod-network-cidr=172.31.0.0/16
    作用:定义 Pod 网络的 IP 地址范围(CIDR)。此值需与后续安装的网络插件(如 Calico、Flannel)配置一致。
  • 典型场景:
    Flannel 默认使用 10.244.0.0/16,若此处设为 172.31.0.0/16,需确保网络插件的配置与此匹配。
    避免与物理网络(如 192.168.0.0/24)或 Service CIDR 重叠。

注:这里只是告诉你有这个命令,不是让你执行. 清除 kubeadm init kubeadm reset -f

  • 出现Your Kubernetes control-plane has initialized successfully!即为成功,但是需要记录master执行完成后的日志
    在这里插入图片描述
#配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#提前保存令牌
kubeadm join k8s-master:6443 --token afb6st.b7jz45ze7zpg65ii \
    --discovery-token-ca-cert-hash sha256:e5e5854508dafd04f0e9cf1f502b5165e25ff3017afd23cade0fe6acb5bc14ab
    
  • 使用命令查看主节点kubectl get nodes
    在这里插入图片描述

🐕‍🦺安装网络插件calico


# 下载配置文件
curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O
  • 我们前面不是说了calico的默认网段是192.168.0.0/16么,我不需要修改,如果你不是那就要需要修改它
  • 使用命令cat calico.yaml |gerp 192.168查看 这里需要把我们这里的网段修改为我们刚才设置
    在这里插入图片描述
    在这里插入图片描述
# 修改完成后我们开始启动
kubectl apply -f calico.yaml
#查看状态,等待就绪
watch kubectl get pod -n kube-system -o wide

耐心等待所有的完成即可
在这里插入图片描述
在这里插入图片描述

🐕‍🦺work 加入集群(子节点执行)



#使用刚才master打印的令牌命令加入
kubeadm join k8s-master:6443 --token afb6st.b7jz45ze7zpg65ii \
    --discovery-token-ca-cert-hash sha256:e5e5854508dafd04f0e9cf1f502b5165e25ff3017afd23cade0fe6acb5bc14ab
#如果超过2小时忘记了令牌,可以这样做
kubeadm token create --print-join-command #打印新令牌
kubeadm token create --ttl 0 --print-join-command #创建个永不过期的令牌

#如果出现重新执行 kubeadm join的需要,先重置一下 
kubeadm reset

在这里插入图片描述

主节点执行即可kubectl get nodes这样就是已经安装完成了

🐕k8s集群测试


#创建一个nginx镜像
kubectl create deployment mynginx --image=nginx

查看nginx运行在哪个节点kubectl get pods,svc -o wide

在这里插入图片描述

任意节点访问curl http://172.31.169.129
在这里插入图片描述
这里可以看到可以访问成功

🐕问题排错

当执行 kubectl get nodes 遇到 502 Bad Gateway 错误

当执行 kubectl get nodes 遇到 502 Bad Gateway 错误(伴随 Nginx 响应)时,表明 kubectl 无法正确连接到 Kubernetes API 服务器,可能由于 API 服务器未正常运行、代理配置错误或网络问题导致。


当执行 kubectl get nodes 遇到 502 Bad Gateway 错误(伴随 Nginx 响应)时,表明 kubectl 无法正确连接到 Kubernetes API 服务器,可能由于 API 服务器未正常运行、代理配置错误或网络问题导致。以下是详细的排查和解决方案:


1. 检查 API 服务器状态

首先确认 kube-apiserver 是否正常运行:

# 查看 kube-apiserver Pod 状态
kubectl get pods -n kube-system | grep kube-apiserver

# 查看 kube-apiserver 容器日志(如果使用 Docker)
docker ps | grep kube-apiserver
docker logs <kube-apiserver-container-id>
  • 可能的现象
    • kube-apiserver Pod 处于 CrashLoopBackOff 状态。
    • 日志中显示绑定 IP 错误、证书问题或端口冲突(如 listen tcp 192.168.0.71:6443: bind: cannot assign requested address)。

2. 检查 control-plane-endpoint 解析

如果初始化时指定了 --control-plane-endpoint=k8s-master,需确保该域名或 IP 能被正确解析:

# 检查域名解析
ping k8s-master
nslookup k8s-master

# 检查本地 hosts 文件
cat /etc/hosts
  • 修复方法
    • 如果 k8s-master 是域名且未配置 DNS,需在 /etc/hosts 中添加解析:
      echo "192.168.0.71 k8s-master" >> /etc/hosts
      
    • 如果使用负载均衡器(如 Nginx、HAProxy),确认其配置正确且后端指向有效的 API 服务器实例。

3. 验证 API 服务器证书

API 服务器的证书必须包含 control-plane-endpoint 的域名或 IP:

# 查看 kube-apiserver 证书 SAN(Subject Alternative Names)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep -A1 "Subject Alternative Name"
  • 预期输出
    DNS:k8s-master, DNS:kubernetes, DNS:kubernetes.default, IP Address:192.168.0.71, ...
    
  • 修复方法
    • 若证书未包含 k8s-master,需重新生成证书并更新集群配置:
      kubeadm init phase certs apiserver --config=kubeadm-config.yaml
      systemctl restart kubelet
      

4. 检查代理或负载均衡器配置

如果使用了反向代理(如 Nginx)暴露 API 服务器,检查代理配置:

  • Nginx 配置示例
    stream {
      upstream kubernetes {
        server 192.168.0.71:6443;  # 确保指向正确的 API 服务器地址和端口
      }
      server {
        listen 6443;
        proxy_pass kubernetes;
      }
    }
    
  • 验证步骤
    • 直接访问 API 服务器 IP 和端口(绕过代理):
      curl -k https://192.168.0.71:6443/version
      
      如果返回 Kubernetes 版本信息,说明代理配置错误;否则继续排查 API 服务器问题。

5. 检查网络连通性和防火墙

确保 API 服务器的端口(默认为 6443)可被访问:

# 检查本地端口监听
ss -tulnp | grep 6443

# 检查防火墙规则(假设使用 firewalld)
firewall-cmd --list-ports | grep 6443
  • 修复方法
    • 开放端口:
      firewall-cmd --add-port=6443/tcp --permanent
      firewall-cmd --reload
      
    • 如果使用云服务器,确保安全组允许 6443 端口入站流量。

6. 重置并重新初始化集群

如果问题仍存在,彻底清理后重新初始化:

kubeadm reset -f
rm -rf /etc/kubernetes/ /var/lib/etcd/
systemctl restart docker kubelet
kubeadm init --config=kubeadm-config.yaml  # 使用之前的配置

7. 验证 kubectl 配置

确保 kubectl 使用的配置文件正确:

# 检查配置文件路径
echo $KUBECONFIG

# 验证配置
kubectl config view
  • 修复方法
    • 复制管理员配置文件:
      mkdir -p $HOME/.kube
      cp /etc/kubernetes/admin.conf $HOME/.kube/config
      chown $(id -u):$(id -g) $HOME/.kube/config
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值