02.Kubernetes 集群部署

news/2025/3/26 23:36:55

Kubernetes 集群部署

Kubernetes 相关端口

在这里插入图片描述

在这里插入图片描述

1. Kubernetes 集群组件运行模式

独立组件模式

  • 除 Add-ons 以外,各关键组件以二进制方式部署于节点上,并运行于守护进程;
  • 各 Add-ons 以 Pod 形式运行

静态 Pod 模式

  • 控制平面各组件以静态 Pod 对象运行于 Master 主机之上
  • kubelet 和 docker 以二进制部署,运行为守护进程
  • kube-proxy 等则以 Pod 形式运行
  • k8s.gcr.io

2. 安装工具

  • 原生安装工具 kubeadm
  • CNCF 认证的安装工具

3. 部署前提

使用 kubeadm 部署 Kubernetes 集群的前提条件

  • 支持 Kubernetes 运行的 Linux 主机,例如 Debian、RedHat 及其变体等
  • 每主机 2GB 以上的内存,以及 2 颗以上的 CPU
  • 各主机间能够通过网络正常通信,支持各节点位于不同的网络中
  • 独占的 hostname、MAC 地址以及 product_uuid,主机名能够正常解析
  • 放行由 Kubernetes 使用到的各端口,或直接禁用 iptables
  • 禁用各主机的上的 Swap 设备
  • 各主机时间同步

准备代理服务,以便接入 registry.k8s.io,或根据部署过程提示的方法获取相应的 Image

重要提示

  • kubeadm 不仅支持集群部署,还支持集群升级、卸载、更新数字证书等功能
  • 目前,kubeadm 为各节点默认生成的 SSL 证书的有效期限为1年,在到期之前需要更新这些证书

集群部署步骤

  • 验证各前提条件是否已然满足
  • 在各节点上安装容器运行时
  • 在各节点上安装 kubeadm、kubelet和 kubectl
  • 创建集群
    • 在控制平面的第一个节点上,使用 kubeadm init 命令拉起控制平面
      • 会生成 token 以认证后续加入的节点
    • (实验环境可选)将其它几个控制平面节点使用 kubeadm join 命令加入到控制平面集群中
      • 提示:需要先从第一个控制平面节点上拿到 CA 及 API Server 等相应的证书
    • 将各 worker 节点使用 kubeadm join 命令加入到集群中
    • 确认各节点状态正常转为 “Ready”

4. 部署具体步骤

官方文档:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

使用 kubeadm 快速部署一个 Kubernetes 集群

环境准备

四台 Ubuntu2204 虚拟机 2G 2CPU

IP地址hostname
10.0.0.100master1.munan.com
10.0.0.110node1.munan.com
10.0.0.120node2.munan.com
10.0.0.130node3.munan.com

验证每个节点的 MAC 地址和product_uuid是否唯一

ip a

cat /sys/class/dmi/id/product_uuid

免密登录打通

4.1 设置 hostname

# master1 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname master1.munan.com
[root@Ubuntu2204 ~]#hostname
master1.munan.com
[root@Ubuntu2204 ~]#bash
[root@master1 ~]#

# node1 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node1.munan.com
[root@Ubuntu2204 ~]#hostname
node1.munan.com
[root@Ubuntu2204 ~]#bash
[root@node1 ~]#

# node2 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node2.munan.com
[root@Ubuntu2204 ~]#hostname
node2.munan.com
[root@Ubuntu2204 ~]#bash
[root@node2 ~]#

# node3 节点
[root@Ubuntu2204 ~]#hostnamectl set-hostname node3.munan.com
[root@Ubuntu2204 ~]#hostname
node3.munan.com
[root@Ubuntu2204 ~]#bash
[root@node3 ~]#

4.2 设置时间同步

一个 master 节点和三个 node 节点都需要安装,并修改 /etc/chrony/chrony.conf 文件

apt -y install chrony

vim /etc/chrony/chrony.conf

注释 pool 开头的几行
 20 #pool ntp.ubuntu.com        iburst maxsources 4
 21 #pool 0.ubuntu.pool.ntp.org iburst maxsources 1
 22 #pool 1.ubuntu.pool.ntp.org iburst maxsources 1
 23 #pool 2.ubuntu.pool.ntp.org iburst maxsources 2
 24 server ntp.aliyun.com iburst
 25 server time1-5.cloud.tencent.com iburst

systemctl restart chrony.service

systemctl enable --now chrony.service

systemctl status chrony.service

chronyc sources -v

4.3 设置主机名称解析

一个 master 节点和三个 node 节点 都需要设置

vim /etc/hosts

10.0.0.100 master1.munan.com
10.0.0.110 node1.munan.com
10.0.0.120 node2.munan.com
10.0.0.130 node3.munan.com

4.4 禁用 swap

一个 master 节点和三个 node 节点 都需要禁用

swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

# 查看交换分区内存是否为 0
free -h
               total        used        free      shared  buff/cache   available
内存:      1.9Gi       296Mi       1.2Gi       1.0Mi       371Mi       1.4Gi
交换:         0B          0B          0B

4.5 禁用默认的防火墙服务

一个 master 节点和三个 node 节点 都需要禁用

ufw disable
ufw status

4.6 内核参数调整

一个 master 节点和三个 node 节点 都需要配置

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay

modprobe br_netfilter

lsmod | grep br_netfilter

bash -c 'echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.d/k8s.conf'

把 cri-containerd 的包上传

一个 master 节点和三个 node 节点 都需要上传

cri-containerd-cni-1.7.13-linux-amd64.tar.gz 

tar -xvf cri-containerd-cni-1.7.13-linux-amd64.tar.gz -C /

containerd -v

mkdir /etc/containerd

containerd config default | sudo tee /etc/containerd/config.toml

vim /etc/containerd/config.toml

sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" 
SystemdCgroup = true

systemctl enable --now containerd

4.7 安装kubelet、kubeadm和kubectl

一个 master 节点和三个 node 节点 都需要安装和配置

apt-get update && apt-get install -y apt-transport-https

curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key |    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" |    tee /etc/apt/sources.list.d/kubernetes.list

apt-get update

apt-get install -y kubelet kubeadm kubectl

4.8 初始化第一个主节点

sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.15 --cri-socket unix:///run/containerd/containerd.sock


[root@master1 ~]#sudo kubeadm init \
--apiserver-advertise-address=10.0.0.100 \ # 修改为主节点 IP
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///run/containerd/containerd.sock

把这一段生成的复制下来

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.0.100:6443 --token kr1pgl.ymatmfkihnklyhf6 \
	--discovery-token-ca-cert-hash sha256:af3f0be0229b6ab564eb778442f6488b3db586adc8e656db8a7be479fb2b266f 

# master1 节点
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# node1 node2 node3 节点
kubeadm join 10.0.0.100:6443 --token kr1pgl.ymatmfkihnklyhf6 \
	--discovery-token-ca-cert-hash sha256:af3f0be0229b6ab564eb778442f6488b3db586adc8e656db8a7be479fb2b266f 

[root@master1 ~]#kubectl get nodes
NAME                STATUS   ROLES           AGE    VERSION
master1.munan.com   Ready    control-plane   5m1s   v1.28.15
node1.munan.com     Ready    <none>          28s    v1.28.15
node2.munan.com     Ready    <none>          6s     v1.28.15
node3.munan.com     Ready    <none>          2s     v1.28.15

故障处理

apt-get install -y kubelet kubeadm kubectl
E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1605(unattended-upgr)持有
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

解决方法:等待一段时间,直到unattended-upgr进程完成其任务并释放锁
ps aux | grep apt

Ready 2s v1.28.15






故障处理

```bash
apt-get install -y kubelet kubeadm kubectl
E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1605(unattended-upgr)持有
N: 请注意,直接移除锁文件不一定是合适的解决方案,且可能损坏您的系统。
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?

解决方法:等待一段时间,直到unattended-upgr进程完成其任务并释放锁
ps aux | grep apt

http://www.niftyadmin.cn/n/5889999.html

相关文章

15 | 定义简洁架构 Store 层的数据类型

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…

火语言RPA--PDF页数统计

【组件功能】&#xff1a;统计PDF文档总页数 配置预览 配置说明 PDF文件路径 支持T或# 默认FLOW输入项 待统计页数的PDF文件的完整路径。 PDF文件密码 支持T或# 打开PDF文件的密码。 示例 PDF页数统计示例 描述 统计pdf文档E:\test\test.pdf有多少页。 配置 输出结果…

java后端开发day31--集合进阶(一)-----Collection集合List集合数据结构1

&#xff08;以下内容全部来自上述课程&#xff09; 1.集合体系结构 List系列集合&#xff1a;添加的元素是有序、可重复、有索引。 Set系列集合&#xff1a;添加的元素是无序、不重复、无索引。 2.Collection集合 Collection是单列集合的祖宗接口&#xff08;不可直接创建…

基于开源AI大模型与用户数据分析的S2B2C商城小程序运营策略研究

摘要&#xff1a; 随着互联网技术的飞速发展&#xff0c;数字化转型已成为企业提升竞争力的重要手段。在新媒体平台的运营过程中&#xff0c;用户数据成为企业决策的关键依据。本文旨在探讨如何运用开源AI大模型、AI智能名片以及S2B2C商城小程序等新兴技术&#xff0c;结合深入…

动态调试环境配置(Android Studio + IDA Pro)

1. 调试环境架构设计 1.1 混合调试体系构建 graph TDA[目标设备] --> B{调试通道}B -->|Java层| C[Android Studio]B -->|Native层| D[IDA Pro]C --> E[联合调试控制台]D --> E 1.2 设备调试模式配置 bash 复制 # 开启内核调试支持 adb shell "echo …

k8s面经

最近面了几场&#xff0c;k8s技能几乎成了运维的必备品了。 容器一直pending可能的原因调度问题。容器的调度策略&#xff0c;比如标签选择、容忍度或者亲和度&#xff0c;导致没有合适的节点可供调度 资源问题&#xff0c;比如宿主机的CPU内存磁盘不足&#xff0c;或者要挂载…

信息学奥赛c++语言:整数去重

题目描述 给定含有n个整数的序列&#xff0c;要求对这个序列进行去重操作。所谓去重&#xff0c;是指对这个序列中每个重复出现的数&#xff0c;只保留该数第一次出现的位置&#xff0c;删除其余位置。 输入 输入包含两行&#xff1a;第一行包含一个正整数n&#xff08;1 ≤…

《计算机图形学》第一课笔记-----opengl开发环境搭建

前言&#xff1a; 目的是为了学习计算机图形学这本书&#xff0c;在一个2维的平面上活灵活现的显示一个3维物体是很酷的一件事&#xff0c;打算先从啃下这本书作为开始。 正文 之前是准备使用vscode搭建的&#xff0c;但是阅读了一些教程后感觉太繁琐了&#xff0c;我的核心目标…