在Linux公网、云服务器搭建K8s集群

本文详细介绍了如何在公网环境的Linux CentOS7.x服务器上搭建Kubernetes集群,包括设置主机名、配置系统环境、安装Docker、使用kubeadm初始化集群、添加工作节点、安装Flannel网络插件以及解决公网节点间通信问题。此外,还提到了Rancher的安装,作为集群管理平台的选择。

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

前言

本文讲述在Linux公网、云服务器搭建K8s集群详细步骤,解决搭建过程中的问题。

脚本基本可以不修改直接使用。

准备工作

需要Linux CentOS 7.x 两台及以上,本文用的 7.6。

主机要求有2个核心及以上。

本文主要针对云服务器公网环境,比如服务器不在一个内网段需要通过公网互通,使用不同云服务商主机等。

云服务器记得提前在安全组中放开使用到的端口 [主节点 6443] [工作节点测试使用的 80]。

安装步骤多个节点可以并行操作,默认所有操作各节点都要执行,某些操作仅主/工作节点执行在标题中有标注(主/工)。

部署成功后可以尝试使用 Kubesphere 或 Rancher 容器管理平台进行管理。

安装步骤

设置主机名

单独为每个服务器设置主机名,格式为hostnamectl set-hostname hostname。一般主节点取名master,从节点取名node.

echo "设置主节点主机名" > /dev/null
hostnamectl set-hostname k8s-master
echo "设置从节点主机名" > /dev/null
hostnamectl set-hostname k8s-node1

配置系统环境

echo "停止、关闭防火墙" > /dev/null
systemctl stop firewalld
systemctl disable firewalld

echo "永久关闭SELinux" > /dev/null
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
echo  "临时关闭SELinux" > /dev/null
setenforce 0
echo "查看SELinux状态,显示为[SELinux status:                 disabled]视为设置成功" > /dev/null
sestatus

echo "永久关闭Swap" > /dev/null
sed -ri 's/.*swap.*/#&/' /etc/fstab
echo "临时关闭Swap" > /dev/null
swapoff -a

echo "安装、配置时间同步" > /dev/null
yum install ntpdate -y
ntpdate time.windows.com

echo "创建/etc/sysctl.d/k8s.conf配置文件,将桥接的 IPv4 流量传递到 iptables 的链" > /dev/null
cat > /etc/sysctl.d/k8s.conf << EOF 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1 
EOF

添加 hosts(主)

在主节点配置所有k8s服务器的host,并且host名字跟各服务器的主机名对应。这里配置的是公网IP。

# 追加host
cat >> /etc/hosts << EOF 
<主节点公网IP> k8s-master
<工作节点公网IP> k8s-node1
EOF

echo "使host配置生效" > /dev/null
/etc/init.d/network restart

Docker安装

echo "下载安装" > /dev/null
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce-18.06.1.ce-3.el7

echo "设置开机启动并启动" > /dev/null
systemctl enable docker && systemctl start docker
echo "查看Docker版本" > /dev/null
docker --version

设置Docker仓库地址,这个地址是Docker镜像上传/下载源。这个地址可以是自己搭建的私有仓库Harbor,也可以考虑用阿里云等第三方仓库。

echo "创建/etc/docker/daemon.json配置文件并指定镜像仓库" > /dev/null
cat > /etc/docker/daemon.json << EOF 
{
    "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"] 
}
EOF

echo "重启Docker使配置生效" > /dev/null
systemctl restart docker

K8s组件安装

添加yum源,并配置为阿里云源,国内下载更快。

echo "创建/etc/yum.repos.d/kubernetes.repo追加yum源配置" > /dev/null
cat > /etc/yum.repos.d/kubernetes.repo << EOF 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

echo "安装Kubeadm、Kubelet、Kubectl" > /dev/null
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
echo "设置开机启动" > /dev/null
systemctl enable kubelet

集群初始化(主)

通过kubeadm执行初始化,apiserver-advertise-address填主节点的公网IP。service-cidr是service网段。pod-network-cidr是Pod网段。

kubeadm init \
--apiserver-advertise-address=<公网IP> \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

执行完上面的初始化脚本后会卡在 etcd 初始化的位置,因为 etcd 绑定端口的时候使用外网 IP,而云服务器外网 IP 并不是本机的网卡,而是网关分配的一个供外部访问的 IP,从而导致初始化进程一直重试绑定,长时间卡住后失败。如下图示:

image-20210925173129489

解决办法是在卡住时,另启一个命令行窗口修改初始化生成的 etcd.yaml 中的配置成示例图一样,进程会自动重试并初始化成功。

vim /etc/kubernetes/manifests/etcd.yaml

image-20210925173830217

Kubectl设置。kubeadm初始化完成后,控制台会打印下面一模一样的指令,直接执行。

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脚本,复制到从节点执行。

image-20210925174037096

如果忘记了join脚本,可以在主节点执行以下命令重新生成。

kubeadm token create --print-join-command

安装容器网络插件(主)

容器网络插件CNI(Container Network Interface)这里使用的解决方案为Flannel。

需要插件的配置文件kube-flannel.yml,通过kubectl来应用配置,命令格式为kubectl apply -f加上本地路径或者链接。下面这个是我码云仓库里面的,可直接用。

kubectl apply -f https://gitee.com/www.freeclub.com/blog-images/raw/master/source/kube-flannel.yml

测试

等待集群Ready状态

查看集群节点,可以看到节点从NotReady到Ready的状态变更。等全部Ready再进行下一步测试。

kubectl get nodes

image-20210925223336700

以Nginx为例作测试(主)

创建一个Service和Deployment。

echo "部署 nginx (deployment,pod)" > /dev/null
kubectl create deployment nginx --image=nginx
echo "暴露 nginx 端口给集群外部访问 (service)" > /dev/null
kubectl expose deployment nginx --port=80 --type=NodePort

执行下面指令可获取pod和service信息,可以看到NodePort类型的service在宿主机暴露了随机端口30879供集群外部访问。

访问链接如:http://IP:30879,IP为工作节点外网IP。

echo "获取 service deployment 和 pod 信息" > /dev/null
kubectl get svc,deployment,pod

image-20210925214116399

删除测试的Nginx Service和Deployment

echo "删除nginx service" > /dev/null
kubectl delete service nginx
echo "删除nginx deployment" > /dev/null
kubectl delete deployment nginx

解决公网环境节点间无法互通问题

集群按上面步骤搭建好后,Pod 之间互相访问不了,StatefulSet 也无法通过 <podName.serviceName> 这种方式直接访问,但是通过 NodePort 暴露给外部访问确是可以访问到的目标服务的。

主节点执行 kubectl exec -it bash 进入 Pod 命令会连接超时最终失败,并打印出超时信息,显示使用的 IP 是工作节点的内网 IP,它们不在同一个局域网中自然是访问不通的。

echo "进入Pod" > /dev/null
kubectl exec -it pod/nginx-f89759699-4d4xk bash

image-20210925215709304

如果网络互通,进入 Pod 容器直接 ping 其他 Pod/Service 的 IP 或者 StatefuSet 虚拟 DNS 地址 [PodName].[ServiceName].[Namespace].svc.cluster.local 是可以通的。

解决办法:使用 iptables IP 重定向,如这种情况下让系统访问工作节点内网 IP 时转而访问工作节点的外网 IP。

iptables -t nat -A OUTPUT -d <内网 IP> -j DNAT --to-destination <外网 IP>

内、公网配置差异总结

  • 主节点配置host的时候IP都是填写公网IP
  • 主节点执行初始化时,脚本填写的是自己的公网IP
  • 公网环境主节点初始化期间可能需要在卡住的时候修改etcd配置
  • 需要解决集群节点不互通问题,不然内部访问不通,主节点无法通过命令kubectl exec进入容器

Rancher安装

Master 节点执行以下指令就行,官网有 快速开始 介绍。

Rancher 是一个容器管理平台,可以直接创建集群,也可以将原有集群添加进去交给它管理。通过UI界面创建集群中各个容器/组件非常方便。

安装好后通过 80/443 端口访问,云服务器记得开放这两个端口

sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 rancher/rancher

参考链接

iptables IP 重定向

Rancher 官网

<think>首先,用户的问题是:“我想配置阿里云节点 请问如何配置阿里云ECS实例或Kubernetes节点”。这涉及到配置阿里云的ECS实例或Kubernetes节点。我需要基于提供的引用信息来回答。 回顾引用内容: - [^1]: 关于Kubernetes的介绍和在阿里云服务器搭建单节点集群。 - [^2]: 关于ECS实例的配置选型和变配。 - [^3]: 关于阿里云容器服务ACK的介绍。 - [^4]: 关于在ECS上搭建Kubernetes集群的脚本和步骤。 - [^5]: 关于ECS搭建K8s高可用集群的注意事项,如VPC和HaVip。 用户的问题焦点在配置阿里云节点,特别是ECS实例或Kubernetes节点。所以,我应该结合这些引用,提供清晰的步骤。 根据系统级指令: - 所有行内数学表达式用$...$,但这个问题可能不涉及数学,所以可能不需要。 - 独立公式用$$...$$,但同样可能不适用。 - LaTeX语法正确:确保如果有数学部分,正确使用。 - 使用中文回答。 - 生成相关问题:在回答末尾添加相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 回答结构: - 帮助用户逐步解决问题。 - 保证真实可靠,基于引用。 用户上一次的问题或上下文:用户提到了“用户上一次的问题和你的回答”,但在这个查询中,没有提供之前的对话历史。所以,我只能基于当前查询和引用。 步骤规划: 1. **理解问题**:用户想配置阿里云节点,可能是ECS实例或作为Kubernetes节点的一部分。 2. **关键点**: - 配置ECS实例:引用[2]提到ECS实例的配置选型和变配。 - 配置Kubernetes节点:引用[1]、[4]、[5]涉及搭建Kubernetes集群。 - 引用[3]介绍ACK服务,可能简化过程。 3. **结构化回答**: - 先介绍配置ECS实例。 - 然后介绍如何将ECS实例配置为Kubernetes节点。 - 提供具体步骤、脚本或建议。 4. **引用内容**: - 引用[4]提供脚本:[https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh](https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh) - 引用[5]提到VPC和HaVip注意事项。 - 引用[1]和[3]提供背景。 5. **步骤细化**: - **配置ECS实例**: - 登录阿里云控制台。 - 创建ECS实例:选择实例类型、镜像、存储等。 - 引用[2]:配置可修改,支持变配。 - 设置网络:VPC、安全组等。引用[5]强调VPC不支持广播,需HaVip。 - **配置Kubernetes节点**: - 使用kubeadm或其他工具安装Kubernetes。 - 引用[4]:使用脚本安装,例如设置变量。 - 对于单节点或多节点集群。 - 考虑高可用性:引用[5]提到HaVip。 6. **添加引用标识**:在相关部分末尾添加,如[^2]。 7. **生成相关问题**:在末尾添加2-3个相关问题。 8. **语言**:全程中文。 最终回答结构: - 引言:简要说明配置步骤。 - 步骤1:配置ECS实例。 - 步骤2:配置为Kubernetes节点。 - 注意事项。 - 相关问题。</think>### 配置阿里云ECS实例或Kubernetes节点指南 配置阿里云节点涉及两个主要部分:一是配置ECS(弹性计算服务)实例作为基础计算资源;二是将ECS实例部署为Kubernetes节点(如使用kubeadm工具或阿里云ACK服务)。以下是基于阿里云官方文档和实际经验的详细步骤。我将以**阿里云Linux系统**为例,逐步指导您完成配置。操作前,请确保已拥有阿里云账号并开通ECS和VPC服务。 --- ### 步骤1: 配置阿里云ECS实例 ECS实例是阿里云的基础计算单元,配置过程包括创建实例、选择配置和设置网络。以下是核心步骤: 1. **登录阿里云控制台并创建ECS实例**: - 访问[阿里云ECS控制台](https://ecs.console.aliyun.com),点击“创建实例”。 - **选择实例类型**: 根据需求选择实例规格(如通用型g7或计算型c7)。阿里云提供推荐配置组合(如2核4GB),但您可自定义CPU、内存和存储[^2]。 - **选择镜像**: 推荐使用“Alibaba Cloud Linux 3”镜像(兼容CentOS),它已优化用于云环境。 - **配置网络**: - 创建或选择VPC(专有网络)和vSwitch(子网)。注意:阿里云VPC不支持广播和组播,需使用HaVip(高可用虚拟IP)绑定ECS实例以实现高可用[^5]。 - 设置安全组:开放必要端口(如SSH的22端口、Kubernetes的6443端口)。 - **设置存储**: 添加系统盘(默认40GB SSD)和数据盘(可选)。完成后,点击“确认订单”并支付。 2. **实例变配与优化**: - ECS实例支持在线变配:如果资源不足或过剩,可在控制台“实例详情”中选择“变配”调整CPU、内存或存储[^2]。 - 登录实例:使用SSH连接ECS(如`ssh root@<公网IP>`),更新系统:`yum update -y`。 - 关键配置:禁用SELinux(`setenforce 0`)和关闭防火墙(`systemctl stop firewalld`),以避免Kubernetes安装冲突[^4]。 > **注意事项**: 创建ECS实例时,建议选择按量付费模式以降低成本。变配操作可能导致实例重启,请提前备份数据[^2]。引用[^5]强调VPC网络需绑定HaVip以确保IP可达性,否则动态IP可能不可用。 --- ### 步骤2: 配置Kubernetes节点 将ECS实例部署为Kubernetes节点时,您可以选择手动安装(使用kubeadm)或使用阿里云ACK服务(托管Kubernetes)。以下分两种方案说明: #### 方案1: 手动安装Kubernetes节点(适用于自定义集群) 此方案使用kubeadm工具,适合学习或小规模部署。基于引用[^4]的脚本优化步骤: 1. **准备环境**: - 在ECS实例上安装Docker(Kubernetes容器运行时): ```bash yum install -y docker systemctl start docker && systemctl enable docker ``` - 添加Kubernetes仓库并安装kubeadm、kubelet和kubectl: ```bash cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=0 EOF yum install -y kubeadm kubelet kubectl systemctl enable kubelet ``` 2. **初始化主节点(Master Node)**: - 使用kubeadm初始化集群(替换`<node-ip>`为ECS内网IP): ```bash kubeadm init --apiserver-advertise-address=<node-ip> --pod-network-cidr=10.244.0.0/16 ``` - 初始化成功后,保存输出的`kubeadm join`命令(用于添加工作节点)。 3. **添加工作节点(Worker Node)**: - 在其他ECS实例上重复步骤1,然后运行保存的`kubeadm join`命令加入集群。 - 验证节点状态:在Master节点运行`kubectl get nodes`,应显示所有节点为`Ready`状态。 > **脚本参考**: 引用[^4]提供了自动化脚本([kubeadm_install_k8s.sh](https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh)),您可下载并修改变量(如`INSTALL_CLUSTER="false"`和`k8s_join_ip`)以简化安装。 #### 方案2: 使用阿里云ACK服务(推荐生产环境) ACK(阿里云容器服务Kubernetes版)是托管服务,自动管理节点生命周期,减少运维负担[^3]。 1. **创建ACK集群**: - 登录[ACK控制台](https://cs.console.aliyun.com),点击“创建集群”。 - **选择集群类型**: 如“标准托管集群”(支持高可用)。 - **配置节点池**: - 添加已有ECS实例:选择步骤1创建的ECS作为节点。 - 或自动创建新节点:设置实例规格、数量(如2台ECS)。 - **网络设置**: 绑定VPC和HaVip(确保节点间通信可靠)[^5]。 - 完成创建:ACK会自动安装Kubernetes组件,您可在控制台管理节点。 2. **验证节点**: - 在ACK控制台查看节点状态,或使用kubectl:`kubectl get nodes -o wide`。 > **优势**: ACK提供一键式部署,支持自动修复和升级。引用[^3]强调ACK是全球首批通过Kubernetes认证的服务,适合企业级应用。 --- ### 关键注意事项 1. **网络配置**: 阿里云VPC需绑定HaVip(高可用虚拟IP)以防止IP不可达问题[^5]。在ECS安全组中开放Kubernetes端口(如6443、10250)。 2. **成本优化**: ECS按需变配可节省资源[^2];ACK集群按节点收费,建议开发环境用单节点,生产环境用多节点高可用。 3. **常见问题**: - **节点无法加入集群**: 检查VPC路由表和HaVip绑定[^5]。 - **安装失败**: 确保禁用SELinux和防火墙[^4]。 - 更多坑点参考[阿里云ECS搭建Kubernetes集群踩坑记](https://github.com/ygqygq2/kubernetes/blob/master/kubeadm/kubeadm_install_k8s.sh)[^4]。 > **总结**: 配置阿里云节点时,先创建ECS实例并优化网络,再选择手动(kubeadm)或托管(ACK)方式部署Kubernetes。对于新手,推荐ACK以减少复杂度;对于自定义需求,手动安装更灵活。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我有八千部下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值