1、配置主机名
|
k8s集群角色 |
IP |
主机名 |
安装的组件 |
|
主节点 |
192.168.138.135 |
k8s-master-1 |
apiserver controller-managerscheduler etcd kube-proxy kubelet calico |
|
工作节点1 |
192.168.138.136 |
k8s-node-1 |
kubelet kube-proxy calico coredns |
|
工作节点2 |
192.168.138.137 |
k8s-node-2 |
kubelet kube-proxy calico coredns |
# 登录k8s-master-1节点,执行如下命令
hostnamectl set-hostname k8s-master-1 && bash
# 登录k8s-node-1节点,执行如下命令
hostnamectl set-hostname k8s-node-1 && bash
# 登录k8s-node-2节点,执行如下命令
hostnamectl set-hostname k8s-node-2 && bash
2、配置hosts文件
# 修改每台机器的/etc/hosts文件,增加如下三行:
192.168.138.135 k8s-master-1
192.168.138.136 k8s-node-1
192.168.138.137 k8s-node-2


3、配置k8s集群之间ssh免密登录(可选)
该步骤不是必须操作,对安装k8s无直接影响,主要是为了方便互相之间传递文件
#一路回车,不输入密码
ssh-keygen
把本地生成的密钥文件和私钥文件拷贝到远程主机,三台服务器同时执行如下命令
ssh-copy-id k8s-master-1
ssh-copy-id k8s-node-1
ssh-copy-id k8s-node-2
确认的时候需要输入yes,然后输入服务器密码,我这里三台服务器密码都是root

4、初始化k8s集群
在k8s-master-1上执行如下命令,生成初始的配置文件:
kubeadm config print init-defaults > kubeadm.yaml
然后修改这个文件内容,我将默认的配置文件都添加路注释,方便大家能读懂每一行配置所代表的含义,修改的点如下:

修改后的配置文件如下:
# ========== InitConfiguration 部分 ==========
# 该部分用于 kubeadm init 的初始化配置,定义集群引导和本地API端点等信息
apiVersion: kubeadm.k8s.io/v1beta3 # kubeadm API 版本,v1beta3 为当前稳定版本
bootstrapTokens: # 引导令牌列表,用于新节点加入集群时的身份验证
- groups: # 令牌所属的 RBAC 组,此处为系统默认的引导组
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef # 实际令牌字符串,格式为 <6字符>.<16字符>
ttl: 24h0m0s # 令牌有效期,24小时后过期
usages: # 令牌的用途
- signing # 可用于签名证书请求
- authentication # 可用于 API Server 身份认证
kind: InitConfiguration # 资源类型为初始化配置
localAPIEndpoint: # 本地 API Server 的监听地址和端口
advertiseAddress: 192.168.138.135 # 控制节点对外暴露的 IP 地址,需改为实际 Master 节点 IP
bindPort: 6443 # API Server 监听的端口,默认为 6443
nodeRegistration: # 当前节点的注册信息
criSocket: unix:///run/containerd/containerd.sock # 容器运行时 (containerd) 的 socket 路径
imagePullPolicy: IfNotPresent # 镜像拉取策略:若本地不存在则拉取,否则使用本地
name: k8s-master-1 # 节点名称,需与主机名一致
taints: null # 节点污点(Taints),设为空表示允许所有 Pod 调度(不添加默认污点)
---
# ========== ClusterConfiguration 部分 ==========
# 该部分定义集群全局配置,包括 API Server、证书、网络、镜像仓库等
apiServer: # API Server 配置
timeoutForControlPlane: 4m0s # 控制平面组件启动超时时间
apiVersion: kubeadm.k8s.io/v1beta3 # API 版本
certificatesDir: /etc/kubernetes/pki # 证书存放目录
clusterName: kubernetes # 集群名称
controllerManager: {} # 控制器管理器配置(使用默认)
dns: {} # DNS 配置(使用默认 CoreDNS)
etcd: # Etcd 配置
local: # 使用本地 etcd(而非外部)
dataDir: /var/lib/etcd # Etcd 数据存储目录
imageRepository: registry.aliyuncs.com/google_containers # 镜像仓库地址,改为阿里云镜像源
kind: ClusterConfiguration # 资源类型为集群配置
kubernetesVersion: 1.30.0 # Kubernetes 版本号
networking: # 网络相关配置
dnsDomain: cluster.local # 集群内部 DNS 域名后缀
serviceSubnet: 10.96.0.0/12 # Service 的 IP 地址池范围,/12 网段提供大量可用 IP
podSubnet: 10.244.0.0/16 # Pod 的 IP 地址池范围,/16 网段,需与 CNI 插件匹配
scheduler: {} # 调度器配置(使用默认)
---
# ========== KubeProxyConfiguration 部分 ==========
# 该部分配置 kube-proxy 组件,定义代理模式等
apiVersion: kubeproxy.config.k8s.io/v1alpha1 # kube-proxy 配置 API 版本
kind: KubeProxyConfiguration # 资源类型为 kube-proxy 配置
mode: ipvs # 代理模式使用 IPVS(性能优于 iptables)
---
# ========== KubeletConfiguration 部分 ==========
# 该部分配置 kubelet 组件,定义运行时驱动等
apiVersion: kubelet.config.k8s.io/v1beta1 # kubelet 配置 API 版本
kind: KubeletConfiguration # 资源类型为 kubelet 配置
cgroupDriver: systemd # cgroup 驱动使用 systemd(与容器运行时一致)
# 基于配置文件初始化k8s集群
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification

配置kubectl的配置文件config,相当于对kubectl进行授权,这样kubectl命令可以使用这个证书
对k8s集群进行管理
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#查看node节点状态
kubectl get nodes

5、扩容k8s集群-添加k8s-node-1、k8s-node-2节点
首先在k8s-master-1节点上执行如下命令:
kubeadm token create --print-join-command

然后将这个命令执行的结果复制一下,登录k8s-node-1节点,并在该节点上执行如下命令,命令中添加一个忽略检查的参数:--ignore-preflight-errors=SystemVerification,注意在k8s-node-1上执行的命令一定是要你自己的主节点虚拟机上执行kubeadm token create --print-join-command后的结果,不要直接复制我这里的命令,因为你的机器ip和token跟我的集群不一样,用你自己生成的即可。
kubeadm join 192.168.138.135:6443 --token 8a7tdx.d1rkly3em6d6570l --discovery-token-ca-cert-hash sha256:90b5538d1f0d9d3c511db6d143e1a3252603be535d3b7a5c4be14e62db823c2f --ignore-preflight-errors=SystemVerification

然后将上面的命令在k8s-node-2上也执行一遍

命令执行完之后,登录k8s-master-1节点,然后执行命令查看集群节点,这时候你会看到k8s-node-1和k8s-node-2节点已经加入了集群
kubectl get nodes

6、安装k8s网络组件-Calico
Calico是一个开源的网络和安全解决方案,它为容器、虚拟机、主机、k8s提供了高效、可扩展和安全的网络连接和策略管理。
Calico在K8s中的功能:
1)支持网络隔离和多租户场景;
2)为pod提供独立的IP地址;
3)支持跨主机的容器通信,pod可以通过IP地址直接互相访问;
4)提供网络安全策略,支持网络流量控制和访问授权,实现网络安全隔离。
Calico优点:
1、网络性能高:Calico使用Linux内核中的路由和过滤技术,避免了NAT,因此可以提供更好的网
络性能和更低的延迟。
2、高可用性:Calico的组件可以配置为高可用模式,从而保证集群的稳定性和可用性。
3、安全:Calico可以提供高级的安全策略和访问控制,以保护Kubernetes集群中的容器和服务。
4、灵活性:Calico的网络架构非常灵活,可以适应不同的应用场景和需求,支持不同的拓扑结构和部署模式。
5、社区活跃:Calico是一个开源项目,拥有庞大的社区支持和活跃的开发者社区,可以获得及时的技术支持和更新。
在k8s集群,常见的网络插件对比分析:
| 对比维度 | Flannel | Calico | Weave Net | Cilium |
|---|---|---|---|---|
| 技术基础 | VXLAN(为主),也支持 host-gw、UDP 等 | BGP(核心),同时支持 IPIP、VXLAN | 虚拟路由 + Overlay 网络(VXLAN 等) | eBPF(核心),支持 L3/L4/L7 网络与安全 |
| 核心特点 | 轻量、简单,依赖 iptables 实现 NAT | 高性能、高扩展性,纯三层路由,无 NAT 开销 | 简单易用,快速部署,支持多云环境 | 网络与安全深度集成,高性能,可观测性强 |
| 适用集群规模 | 小规模(推荐) | 大规模(推荐) | 小规模(推荐) | 大规模(推荐) |
| 性能 | 一般(Overlay 封装开销) | 高(基于 BGP 路由,接近物理性能) | 中等(Overlay 网络) | 高(eBPF 加速,可绕过 iptables/ipvs) |
| 网络安全策略 | 基本无(仅支持简单的网络隔离) | 丰富(支持 NetworkPolicy,细粒度流量策略) | 支持基础网络策略 | 非常强大(支持 L3~L7 策略,API 感知,可做 DNS、HTTP 层控制) |
| 可观测性 | 弱(无内置监控) | 中等(可结合 Prometheus,但功能有限) | 一般(提供简单的监控和诊断工具) | 强(eBPF 提供深度流量、性能指标和分布式追踪) |
| 后端存储 | 支持 etcd、Consul、ZooKeeper 等 | 默认使用 etcd 或 Kubernetes API | 无特殊依赖(使用 Kubernetes API 或内置 gossip) | 使用 Kubernetes API(CRD 存储状态) |
| 部署复杂度 | 简单 | 中等(需配置 BGP 或 IPIP) | 简单 | 较高(需内核版本支持 eBPF) |
| 典型使用场景 | 开发测试、小型生产集群 | 大型生产集群、要求高性能和策略控制的场景 | 多云混合部署、快速搭建 | 对安全合规、可观测性要求高的场景(如金融、云原生安全) |
对于小规模的Kubernetes集群,Flannel和Weave Net比较适合,而对于大规模的集群,Calico、
Cilium则是一个更好的选择。
# 在k8s-master-1节点执行
wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# 查看pod网段
kubectl -n kube-system get cm kubeadm-config -o yaml | grep podSubnet
# Calico 的 IP 池需要改成这个网段
vim calico.yaml
# 修改成(去掉注释符 #,并修改 IP 段):
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# 在k8s-master-1、k8s-node-1、k8s-node-2上执行如下命令
mkdir -p /etc/containerd/certs.d/docker.io
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry-1.docker.io"
[host."https://docker.m.daocloud.io"]
capabilities = ["pull", "resolve"]
EOF
# 修改/etc/containerd/config.toml中的config_path=/etc/containerd/certs.d
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
systemctl restart containerd
# 然后在k8s-master-1节点执行命令
kubectl apply -f calico.yaml
# 如果报错就执行命令查看报错信息,calico-node-gb4c7根据你自己的calicoid来修改
kubectl describe pod calico-node-gb4c7 -n kube-system
# 等待几分钟,执行命令查看集群状态,如果为Ready就表示启动成功k8s集群正常运行了
kubectl get nodes
kubectl get pod -n kube-system




7、验证k8s创建pod是否可以正常访问网络
kubectl run test-net --image=busybox -it --rm --restart=Never -- sh
ping www.baidu.com

8、验证coredns是否正常
nslookup kubernetes.default.svc.cluster.local
#如果能正常解析说明dns正常,此时整个k8s集群网络一点问题都没有了,可以正常使用了



2万+

被折叠的 条评论
为什么被折叠?



