7、搭建k8s集群

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集群,常见的网络插件对比分析:

对比维度FlannelCalicoWeave NetCilium
技术基础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集群网络一点问题都没有了,可以正常使用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值