k8s集群搭建(version1.34.1)

1-基础环境搭建(都要做)

1.1-修改主机IP地址

IP分配:

MASTER_IP="192.168.132.100"
NODE1_IP="192.168.132.101"
NODE2_IP="192.168.132.102"

进入master或node中修改对应的IP,修改示例如下:(ping8.8.8.8不通请检查网关)

sudo tee /etc/netplan/01-network-manager-all.yaml <<'EOF'
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    ens33:                      # 请替换为你的实际网卡名
      dhcp4: no                 # 关闭 DHCP
      addresses:
        - 192.168.132.100/24    # 固定 IP 地址
      gateway4: 192.168.132.2   # 网关(根据你的网络设置修改)
      nameservers:
        addresses: [8.8.8.8, 223.5.5.5]  # DNS
EOF

应用配置:

sudo netplan apply

1.2-添加IP到/etc/hosts文件

tee -a /etc/hosts << EOF
192.168.132.100 k8s-master
192.168.132.101 k8s-node1
192.168.132.102 k8s-node2
EOF
cat /etc/hosts

1.3-修改主机名(可选)

在 master 上设置主机名

hostnamectl set-hostname k8s-master
exec bash

在 node1 上设置主机名

hostnamectl set-hostname k8s-node1
exec bash

在 node2 上设置主机名

hostnamectl set-hostname k8s-node2
exec bash

1.4-系统基础调优

基础工具

apt-get update
apt-get install -y apt-transport-https ca-certificates curl gpg lsb-release \
  chrony conntrack ipset ipvsadm socat ebtables ethtool

关闭 swap(立即 + 开机不启用)
 

swapoff -a
sed -ri '/\sswap\s/s/^/#/' /etc/fstab

内核转发与桥接

tee /etc/modules-load.d/k8s.conf >/dev/null <<EOM
overlay
br_netfilter
EOM
modprobe overlay || true
modprobe br_netfilter || true

tee /etc/sysctl.d/99-k8s.conf >/dev/null <<EOM
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
EOM
sysctl --system

可选:ipvs 常用模块(开机自动加载)

tee /etc/modules-load.d/ipvs.conf >/dev/null <<EOM
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOM
modprobe ip_vs || true
modprobe ip_vs_rr || true
modprobe ip_vs_wrr || true
modprobe ip_vs_sh || true
modprobe nf_conntrack || true

iptables -F
systemctl disable NetworkManager

1.5-添加环境变量(重要)

添加环境变量便于文件识别,防止后面创建集群时无法正常构架网络

sudo tee -a /etc/profile > /dev/null <<'EOF'

# ===== Kubernetes Environment Variables =====
export POD_CIDR=10.244.0.0/16
export SERVICE_CIDR=10.96.0.0/12
export MASTER_IP=192.168.132.100
export K8S_VERSION=1.34.1
# ===== End of Kubernetes Environment Variables =====
EOF

2-安装 containerd并配置国内镜像与 SystemdCgroup(都要做)

# 创建存放软件源密钥的目录并设置权限;
install -m 0755 -d /etc/apt/keyrings
# 从阿里云镜像下载 Docker 的 GPG 密钥并配置权限;
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# 自动识别系统版本,添加阿里云的 Docker 软件源到系统配置中,用于后续安装 Docker 相关组件。
. /etc/os-release
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
  https://mirrors.aliyun.com/docker-ce/linux/ubuntu ${UBUNTU_CODENAME} stable" \
 | tee /etc/apt/sources.list.d/docker.list >/dev/null
# 生成默认配置
mkdir -p /etc/containerd /etc/containerd/certs.d
containerd config default | tee /etc/containerd/config.toml >/dev/null

# 开启 SystemdCgroup,并设置 pause 镜像(与 K8s 1.34 对齐)
sed -ri 's#SystemdCgroup = false#SystemdCgroup = true#' /etc/containerd/config.toml
sed -ri 's#sandbox_image = ".*"#sandbox_image = "registry.k8s.io/pause:3.10"#' /etc/containerd/config.toml

# 配置 registry mirrors(DaoCloud 国内加速,也可换成你自己的阿里云专属加速器)
mkdir -p /etc/containerd/certs.d/registry.k8s.io
tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml >/dev/null <<EOM
server = "https://registry.k8s.io"
[host."https://k8s.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOM

mkdir -p /etc/containerd/certs.d/docker.io
tee /etc/containerd/certs.d/docker.io/hosts.toml >/dev/null <<EOM
server = "https://docker.io"
[host."https://docker.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOM

mkdir -p /etc/containerd/certs.d/quay.io
tee /etc/containerd/certs.d/quay.io/hosts.toml >/dev/null <<EOM
server = "https://quay.io"
[host."https://quay.m.daocloud.io"]
  capabilities = ["pull", "resolve"]
EOM

# 配置 crictl 连接 containerd
tee /etc/crictl.yaml >/dev/null <<EOM
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint:   unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOM

systemctl enable --now containerd
systemctl restart containerd

3-安装 kubeadm / kubelet / kubectl(都要做)

install -m 0755 -d /etc/apt/keyrings
# 建议使用 1.34 的 Release.key(key 对各小版本通用,使用对应版本路径最稳妥)
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 任选其一:TUNA
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/kubernetes/core:/stable:/v1.34/deb/ /' \
  | tee /etc/apt/sources.list.d/kubernetes.list >/dev/null

# 若想切换 USTC,请改为:
# echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.ustc.edu.cn/kubernetes/core:/stable:/v1.34/deb/ /' \
#   | tee /etc/apt/sources.list.d/kubernetes.list >/dev/null

apt-get update
apt-get install -y kubelet kubeadm kubectl

apt-mark hold kubelet kubeadm kubectl
systemctl enable kubelet

4-上传文章顶部的tar文件到机器上(都要做)

下载本章顶部的文件calico.rar的windows,先解压获得两个tar文件(后面用到)

4.1-上传本地k8s_ubuntu_20.04_images.tar到~/

# 在每台机器(master/node)执行
ctr -n k8s.io images import /root/k8s_ubuntu_20.04_images.tar
crictl images | grep -E 'kube-|etcd|pause|coredns' || true

ctr -n k8s.io images tag registry.k8s.io/pause:3.10 registry.k8s.io/pause:3.10.1
ctr -n k8s.io images tag registry.k8s.io/etcd:3.6.4-0 registry.k8s.io/etcd:3.6.5-0

4.2-上传本地calico.tar到~/calico_v3.30.3

mkdir -p ~/calico_v3.30.3 && cd ~/calico_v3.30.3

上传calico.tar

tar zxvf calico.tar

images=(
calico/node:v3.30.3
calico/cni:v3.30.3
calico/typha:v3.30.3
calico/kube-controllers:v3.30.3
calico/pod2daemon-flexvol:v3.30.3
calico/node-driver-registrar:v3.30.3
calico/csi:v3.30.3
calico/apiserver:v3.30.3
)

#for img in "${images[@]}"; do
#  docker pull quay.io/$img
#  docker save -o $(basename $img).tar quay.io/$img
#done

for f in *.tar; do
  ctr -n k8s.io images import "$f"
done

# 可选:统一打 tag,防止 YAML 里引用 docker.io 前缀时不匹配
for img in "${images[@]}"; do
  ctr -n k8s.io images tag quay.io/$img docker.io/$img
done

5-k8s集群创建(仅在master执行)

5.1-离线安装

镜像名说明
registry.k8s.io/pause:3.10.1Pod 沙箱容器镜像
registry.k8s.io/etcd:3.6.4-0etcd 数据库
registry.k8s.io/kube-apiserver:v1.34.1控制平面 API 服务
registry.k8s.io/kube-controller-manager:v1.34.1控制器管理
registry.k8s.io/kube-scheduler:v1.34.1调度器
registry.k8s.io/coredns/coredns:v1.12.1DNS 服务

imageRepository: registry.k8s.io
(表示使用本地的k8s镜像,但是未识别的镜像会通过registry.k8s.io拉取)

需要将镜像tag为官网标识的镜像名,用于init集群时避免识别不到

imageRepository: registry.aliyuncs.com/google_containers(表示拉取阿里云的镜像来构建k8s)

tee /root/kubeadm-config.yaml <<EOF
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: "${K8S_VERSION}"
clusterName: kubernetes
imageRepository: registry.k8s.io
networking:
  podSubnet: "${POD_CIDR}"
  serviceSubnet: "${SERVICE_CIDR}"
controllerManager: {}
scheduler: {}
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: "${MASTER_IP}"
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock
EOF

5.3-集群安装

# 预拉镜像(可跳过,kubeadm init 会自动拉)
# kubeadm config images pull --config=/root/kubeadm-config.yaml

# 初始化
kubeadm init --config=/root/kubeadm-config.yaml

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复制到node节点上,让node节点加入集群(忘记保存可以运行生成新的加入命令)

sudo kubeadm token create --print-join-command

kubeadm join 192.168.132.100:6443 --token 8petkc.vsj6w4dc0axyysuz --discovery-token-ca-cert-hash sha256:75b112811d6c99e5d69a2289abd1f7652c020caff63493504e40ae81b13a303f

6-安装 Calico 网络(只在 master 执行

6.1-拉取文件

方法一:直接通过官方yaml文件安装(不推荐)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml

方法二:使用 Tigera Operator 来部署和管理(推荐)

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/tigera-operator.yaml

tee > /root/custom-resources.yaml << "EOF"
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
  name: default
spec:
  cni:
    type: Calico
  calicoNetwork:
    ipPools:
    - blockSize: 26
      cidr: 10.244.0.0/16
      encapsulation: VXLAN
      natOutgoing: Enabled
      nodeSelector: all()
    nodeAddressAutodetectionV4:
      firstFound: true
---
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:
  name: default
EOF

kubectl apply -f /root/tigera-operator.yaml  # 上面执行成功可以跳过
kubectl apply -f /root/custom-resources.yaml

kubectl get pods -A

查询日志
# 查询日志
kubectl logs -n calico-system calico-node-fqhf2
ctr -n k8s.io images list |grep calico
kubectl delete pod -n tigera-operator --all --force --grace-period=0
kubectl delete pod -n calico-system --all --force --grace-period=0
kubectl get pods -A
强制删除(Terminating状态可以使用强制删除清理)
kubectl delete pod <pod-name> -n <namespace> --grace-period=0 --force

7-本章总结

到这里我们已经完成了基础的k8s集群搭建,现在来回顾下我们遇到的问题(都是累)

遇到的问题及解决方法:

  • 使用了临时环境变量,导致重启后无法识别,导致calico无法正常运行
# 临时环境变量
: "${POD_CIDR:=10.244.0.0/16}" 
: "${SERVICE_CIDR:=10.96.0.0/12}" 
: "${MASTER_IP:=192.168.132.100}" 
: "${K8S_VERSION:=1.34.1}"

应当添加到/etc/profile系统环境文件中使其完全生效

  • 修改静态IP时:/etc/netplan/01-network-manager-all.yaml
    • 要检查网关,通过编辑--->虚拟网络编辑器--->点击VMnet8--->NAT设置--->网关查询
  • calico插件无法正常拉取镜像,需要先将镜像拉去下来,通过ctr导入,详细请解读文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值