公司动态
7、搭建k8s集群
1、配置主机名k8s集群角色IP主机名安装的组件主节点192.168.138.135k8s-master-1apiservercontroller-managerscheduleretcdkube-proxykubeletcalico工作节点1192.168.138.136k8s-node-1kubeletkube-proxycalicocoredns工作节点2192.168.138.137k8s-node-2kubeletkube-proxycalicocoredns# 登录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 bash2、配置hosts文件# 修改每台机器的/etc/hosts文件增加如下三行 192.168.138.135 k8s-master-1 192.168.138.136 k8s-node-1 192.168.138.137 k8s-node-23、配置k8s集群之间ssh免密登录(可选)该步骤不是必须操作对安装k8s无直接影响主要是为了方便互相之间传递文件#一路回车不输入密码 ssh-keygen把本地生成的密钥文件和私钥文件拷贝到远程主机三台服务器同时执行如下命令ssh-copy-id k8s-master-1 ssh-copy-id k8s-node-1 ssh-copy-id k8s-node-2确认的时候需要输入yes然后输入服务器密码我这里三台服务器密码都是root4、初始化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 --configkubeadm.yaml --ignore-preflight-errorsSystemVerification配置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 nodes5、扩容k8s集群-添加k8s-node-1、k8s-node-2节点首先在k8s-master-1节点上执行如下命令kubeadm token create --print-join-command然后将这个命令执行的结果复制一下登录k8s-node-1节点并在该节点上执行如下命令命令中添加一个忽略检查的参数--ignore-preflight-errorsSystemVerification注意在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-errorsSystemVerification然后将上面的命令在k8s-node-2上也执行一遍命令执行完之后登录k8s-master-1节点然后执行命令查看集群节点这时候你会看到k8s-node-1和k8s-node-2节点已经加入了集群kubectl get nodes6、安装k8s网络组件-CalicoCalico是一个开源的网络和安全解决方案它为容器、虚拟机、主机、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细粒度流量策略支持基础网络策略非常强大支持 L3L7 策略API 感知可做 DNS、HTTP 层控制可观测性弱无内置监控中等可结合 Prometheus但功能有限一般提供简单的监控和诊断工具强eBPF 提供深度流量、性能指标和分布式追踪后端存储支持 etcd、Consul、ZooKeeper 等默认使用 etcd 或 Kubernetes API无特殊依赖使用 Kubernetes API 或内置 gossip使用 Kubernetes APICRD 存储状态部署复杂度简单中等需配置 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-system7、验证k8s创建pod是否可以正常访问网络kubectl run test-net --imagebusybox -it --rm --restartNever -- sh ping www.baidu.com8、验证coredns是否正常nslookup kubernetes.default.svc.cluster.local #如果能正常解析说明dns正常此时整个k8s集群网络一点问题都没有了可以正常使用了