Ubuntu22.04部署kubernetes保姆教程

1. 集群规划

本文基于 vmware 安装的三台 ubuntu 22.04 虚拟机,准备安装以下内容:
kubernetes 1.28.15
containerd 1.7.27
calico 3.27.3

小版本不一致没什么影响,只要确保使用到的命令中版本号一致即可

三台虚拟机网络为NAT模式,分别设置固定IP及对应主机名:
192.168.168.150/24 k8s-master
192.168.168.151/24 node-01
192.168.168.152/24 node-02

2. 环境准备(三节点都需要执行)

  • 为了方便,本文默认三个节点都使用root账户进行操作。
  • curl等一些常用软件安装过程忽略,请提前准备好。

2.1. 设置主机名和静态IP

在第一台虚拟机执行以下命令,修改主机名

hostnamectl set-hostname k8s-master

配置固定ip,首先使用命令ip a或者ipconfig先查看网络情况,记下网段和网关配置

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:1e:e9:2c brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.168.150/24 brd 192.168.168.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever

如果不带GUI桌面,编辑/etc/netplan/01-network-manager-all.yaml添加以下内容

network:
  version: 2
  ethernets:
    ens33:  # 替换为你的网卡名
      dhcp4: no
      addresses: [192.168.168.150/24]  # 静态IP/子网掩码
      routes:
        - to: default
          via: 192.168.168.2          # 网关

如果是带GUI桌面的ubuntu22,该文件只配置renderer: NetworkManager表示使用网络管理器进行管理,而不是手动设置。因此直接在设置中找到网络,通过UI界面进行设置,截图示例如下
通过UI设置网络

按照以上步骤,在第二台和第三台依次配置以下固定ip和主机名
192.168.168.151/24 node-01
192.168.168.152/24 node-02

配置完成以后,检查一下网络连接情况,看是否可以正常联网

2.2. 关闭防火墙

查看防火墙状态

ufw status

如果是开启状态,关闭防火墙

ufw disable

2.3. 关闭交换分区

临时关闭

swapoff -a

永久关闭

sed -i '/swap/d' /etc/fstab

也可以直接编辑 /etc/fstab 文件,注释到有 swap 那一行

2.4. 设置时区

timedatectl set-timezone Asia/Shanghai

2.5. 设置/etc/hosts

增加以下三行

192.168.168.150 k8s-master
192.168.168.151 node-01
192.168.168.152 node-02

3. 环境准备脚本

为了简化环境准备操作,编写了一个shell脚本(不含修改静态ip部分)

#!/bin/bash

# Ubuntu 20.04 环境初始化脚本

echo "=============================="
echo " Ubuntu 20.04 环境初始化脚本 "
echo "=============================="

# 0. 基本功能检查
echo "步骤 0: 基本功能检查"

# 检查是否支持 overlay
if lsmod | grep -q overlay; then
    echo "  ✓ overlay 模块已加载"
else
    echo "  ⚠ 警告: overlay 模块未加载,Docker等可能无法正常工作"
fi

# 检查是否支持 iptables(强制要求)
if command -v iptables &> /dev/null; then
    echo "  ✓ iptables 已安装"
else
    echo "  ✗ 错误: 系统未安装 iptables,这是强制要求"
    exit 1
fi

# 检查 cgroup 版本是否为 v1(强制要求)
if [ -d "/sys/fs/cgroup/systemd" ]; then
    echo "  ✓ cgroup v1 已启用"
else
    echo "  ✗ 错误: 系统未使用 cgroup v1,这是强制要求"
    exit 1
fi

# 1. 修改 hostname
echo ""
echo "步骤 1: 修改 hostname"
read -p "请输入新的主机名 (必填): " new_hostname
if [ -z "$new_hostname" ]; then
    echo "  ✗ 错误: 主机名不能为空"
    exit 1
fi

current_hostname=$(hostname)
if [ "$current_hostname" != "$new_hostname" ]; then
    hostnamectl set-hostname "$new_hostname"
    echo "  ✓ 主机名已从 '$current_hostname' 修改为 '$new_hostname'"
else
    echo "  ✓ 主机名已经是 '$new_hostname'"
fi

# 2. 检查并修改时区
echo ""
echo "步骤 2: 检查并修改时区"
read -p "请输入时区 (默认: Asia/Shanghai): " timezone
timezone=${timezone:-"Asia/Shanghai"}

current_timezone=$(timedatectl show -p Timezone --value)
if [ "$current_timezone" != "$timezone" ]; then
    timedatectl set-timezone "$timezone"
    echo "  ✓ 时区已从 '$current_timezone' 修改为 '$timezone'"
else
    echo "  ✓ 时区已经是 '$timezone'"
fi

# 3. 检查并关闭 swap 交换空间
echo ""
echo "步骤 3: 检查并关闭 swap 交换空间"
if swapon --show | grep -q .; then
    echo "  发现启用的 swap 分区,正在关闭..."
    swapoff -a
    echo "  ✓ swap 已临时关闭"
    
    # 永久关闭 swap
    if [ -f /etc/fstab ]; then
        cp /etc/fstab /etc/fstab.bak
        grep -v "swap" /etc/fstab > /tmp/fstab_new && mv /tmp/fstab_new /etc/fstab
        echo "  ✓ swap 已在 /etc/fstab 中注释,永久关闭"
    fi
else
    echo "  ✓ swap 已经关闭"
fi

# 4. 检查并关闭防火墙
echo ""
echo "步骤 4: 检查并关闭防火墙"
if command -v ufw &> /dev/null; then
    if ufw status | grep -q "Status: active"; then
        ufw disable
        echo "  ✓ ufw 防火墙已关闭"
    else
        echo "  ✓ ufw 防火墙未启用"
    fi
elif command -v iptables &> /dev/null; then
    if iptables -L | grep -q "Chain INPUT"; then
        echo "  发现 iptables 规则,正在清除..."
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
        iptables -P OUTPUT ACCEPT
        iptables -F
        echo "  ✓ iptables 规则已清除"
    else
        echo "  ✓ iptables 无活动规则"
    fi
else
    echo "  ✓ 未检测到活动的防火墙服务"
fi

echo ""
echo "=============================="
echo " 环境初始化完成!             "
echo "=============================="

4. 安装k8s集群

4.1. 安装容器运行时环境(三节点都需要执行)

下载安装包(可能需要一点魔法):

curl -L -O https://github.com/containerd/containerd/releases/download/v1.7.27/cri-containerd-cni-1.7.27-linux-amd64.tar.gz

解压安装并设置容器运行时开机自启动

tar -xzf cri-containerd-cni-1.7.27-linux-amd64.tar.gz -C /
systemctl enable --now containerd

以上步骤可能存在网络或者其他问题,可自行搜索containerd的安装教程进行尝试,后续配置是一致的

接下来配置containerd容器运行时,首先生成默认配置

containerd config default > /etc/containerd/config.toml

编辑/etc/containerd/config.toml文件,改的以下内容:

...

#大约67行,配置沙箱pause镜像为阿里云
[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"



#大约139行,配置systemd作为Cgroup管理器(与k8s保持一致)
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true



#大约170行,添加国内镜像仓库
   [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
        endpoint = [
          "https://proxy.1panel.live",
          "https://docker.1panel.top",
          "https://docker.m.daocloud.io",
          "https://docker.1ms.run",
          "https://docker.ketches.cn"
        ]

此时使用crictl工具查看镜像等操作会报运行时配置错误(k8s1.24开始不支持docker),执行以下命令指定运行时endpoint为containerd即可

tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

重启containerd服务

systemctl restart containerd.service

4.2. 安装kubectl、kubeadm、kubelet(三节点都需要执行)

设置apt源

apt-get update && apt-get install -y apt-transport-https  ca-certificates curl gnupg lsb-release

curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/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.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list

apt-get update

通过apt-cache madison kubelet命令,查看支持的k8s版本,我这里选择最新的1.28.15版本

   kubelet | 1.28.15-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.14-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.13-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.12-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.11-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.10-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.9-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.8-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.7-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.6-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.5-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.4-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.3-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.2-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.1-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages
   kubelet | 1.28.0-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb  Packages

安装相应工具,并锁定版本防止意外升级

apt install -y kubelet kubeadm kubectl
systemctl enable kubelet
apt-mark hold kubeadm kubelet kubectl

以上命令默认安装当前apt源的最新版本,也可以使用以下命令安装指定版本
apt install kubelet=1.28.2-1.1 kubeadm=1.28.2-1.1 kubectl=1.28.2-1.1

4.3. 安装master节点(仅master节点执行)

查看并确认kubeadm默认配置的k8s镜像清单

kubeadm config images list

输出

registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.15-0
registry.k8s.io/coredns/coredns:v1.10.1

确认无误,通过阿里云拉取相关镜像,注意版本号与你选择的一致。

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

使用kubeadm工具初始化master节点,注意替换你自己的--apiserver-advertise-address

kubeadm init \
  --apiserver-advertise-address=192.168.168.150 \
  --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 \
  --ignore-preflight-errors=all \
  --cri-socket /run/containerd/containerd.sock

成功安装会输出以下提示,照着操作才能正常使用kubectl工具

Your Kubernetes control-plane has initialized successfully!

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

注意!!!

  1. 可以把root用户的export命令写入 /root/.bashrc 文件中,否则每次登录都需要执行才能使用kubectl工具
  2. 如果出现错误,可以使用 journalctl -xeu kubelet 命令查看问题

以上步骤完成后,即可使用kubectl工具查看集群信息

kubectl get node

此时会发现k8s-master节点状态为 NotReady,等Calico网络插件安装完成,节点注册上来,状态就会正常

4.4. 安装calico网络插件(仅master节点执行)

下载calico插件部署配置(可能需要魔法)

curl -L -O https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml

执行安装

kubectl apply -f calico.yaml

执行以上步骤后,由于没有节点可以调度,calico相关pod状态处于Pending状态。等节点注册上来就好了。

4.5. 注册节点

在master节点,执行以下命令获取注册节点的命令

kubeadm token create --print-join-command

示例:(不要直接使用以下命令,请执行上述命令生成)

kubeadm join 192.168.168.150:6443 \
 --token 693a14.qscb38iemcyw3gkb \
 --discovery-token-ca-cert-hash sha256:0f6d7c738f931127ef83ce1594e8366a540fc439fea9720faba0ca37c1aeb5fa

在两个node节点,执行上面生成的命令,将节点注册到master节点

至此,不出意外的话整个集群已经安装好了。可以在master节点使用kubectl get nodes查看节点状态。

小tips

通常手动输入kubectl xxx等命令比较麻烦,因此可以将以下内容贴到~/.bashrc或者其包含的文件中

alias kg='kubectl get'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgd='kubectl get deploy'
alias kgn='kubectl get nodes'
alias k='kubectl'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias kdel='kubectl delete'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值