使用kubeadm 在本地搭建一个k8s集群

目标

  1. 搭建一个包含3个节点的 k8s 集群
  2. 部署几个基础服务,包括 nginx、mysql

操作环境准备

  1. 安装 VirtualBox
  2. 创建 3 个虚拟机实例,使用的镜像为 ubuntun-server(使用桥接网络模式)
  1. (可选)配置 SSH 免密登录虚拟机

  2. 检查宿主机和三个虚拟机的IP地址,如下:

主机名称 IP 备注
host 192.168.1.8 宿主机 WSL,通过SSH登录操作虚拟机
usvc2 192.168.1.9 后面在该节点初始化控制面
usvc3 192.168.1.10 工作节点
usvc4 192.168.1.11 工作节点

部署 k8s 集群

配置节点环境(重要)

3 个 ubuntu-server 节点都需要进行配置。

参考 kubernetes 文档中的安装和配置先决条件,主要操作就是:

  • 启用 ipv4 数据包转发
  • 安装容器运行时
  • 检查和配置容器运行时使用的 cgroup 驱动

启用 ipv4 数据包转发,在我的操作环境下,因为缺少必要的内核模块,完整配置过程如下:

bash 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system

安装 docker engine 过程参考 Install Docker Engine on Ubuntu

在我的操作环境中,安装了最新的 docker engine, 里面已经包含了 containerd 作为具体 CRI,但是需要修改配置文件以启用 CRI 插件。另外,由于较新的 kubernetes 版本的 kubelet 都默认使用了 systemd 作为 cgroup 驱动,所以为了保持一致,同样需要修改 containerd 的配置文件以使用 systemd 作为 cgroup 驱动。

bash 复制代码
# 因为默认的config.toml包含的内容不全,所以这里删除后重新生成。
sudo rm /etc/containerd/config.toml
containerd config default > config.toml 
sudo mv config.toml /etc/containerd/

查看并修改 /etc/containerd/config.toml。因为新生成的配置文件已经开启了 cri, 所以这里要修改的点只有两个。

yaml 复制代码
[plugins."io.containerd.grpc.v1.cri"]
    device_ownership_from_security_context = false
    disable_apparmor = false
    disable_cgroup = false
    disable_hugetlb_controller = true
    disable_proc_mount = false
    disable_tcp_service = true
    drain_exec_sync_io_timeout = "0s"
    enable_selinux = false
    enable_tls_streaming = false
    enable_unprivileged_icmp = false
    enable_unprivileged_ports = false
    ignore_deprecation_warnings = []
    ignore_image_defined_volumes = false
    max_concurrent_downloads = 3
    max_container_log_line_size = 16384
    netns_mounts_under_state_dir = false
    restrict_oom_score_adj = false
    sandbox_image = "registry.k8s.io/pause:3.6" # 这里改为"registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9",注意版本号要和kubelet使用的pause镜像版本一致.
    selinux_category_range = 1024
    stats_collect_period = 10
    stream_idle_timeout = "4h0m0s"
    stream_server_address = "127.0.0.1"
    stream_server_port = "0"
    systemd_cgroup = false
    tolerate_missing_hugetlb_controller = true
    unset_seccomp_profile = ""
yaml 复制代码
 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = false # 这里改成true,表示使用 systemd 作为 cgroup 驱动

修改后重启 containerd:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl restart containerd

安装kubeadm

参考安装kubeadm

我这里使用的 kubernetes 版本是 v1.29,按照官方的教程操作下来比较顺利。

初始化控制平面节点

查看kubeadm 的默认初始化配置,并写入到文件:

bash 复制代码
kubeadm config print init-defaults > init-defaults.yaml

这里需要对生成的配置文件进行部分修改,然后用修改后的文件执行初始化操作。

yaml 复制代码
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.1.9 # 这里改成控制平面节点的IP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  name: node
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers # 这里改成国内镜像地址
kind: ClusterConfiguration
kubernetesVersion: 1.29.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 # 这里添加该配置,方便后面直接安装 Pod 网络插件 Flannel 
scheduler: {}

执行命令,初始化控制平面:

bash 复制代码
sudo kubeadm init --config init-defaults.yaml

不出意外执行成功!

这里按照提示拷贝配置文件即可。

安装 Pod 网络插件

参考

其实就是执行如下的命令:

bash 复制代码
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

安装存储插件

也可以选择其它的存储插件,这个部署比较简单。

参考

加入工作节点

经过前面的操作,k8s集群的控制平面节点已经初始化完成,并且安装了网络和存储插件,接下来就需要向集群添加两个工作节点了。

参考

按照官方教程操作比较简单,完成后回到控制平面节点,执行 kubectl get nodes 就可以看到集群内存在3个节点了。

部署应用

部署 nginx

TBD

部署 mysql

TBD

相关推荐
终端行者2 小时前
k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库
阿里云·容器·kubernetes
2401_878961726 小时前
九、k8s:ingress
linux·容器·kubernetes
木二7 小时前
附039.Kubernetes_v1.32.2高可用部署架构二
kubernetes·ingress·kubernetes dashboard·longhorn
行者Sun19899 小时前
【K8s】专题十六(2):Kubernetes 包管理工具之 Helm 使用
云原生·容器·kubernetes·helm
格桑阿sir9 小时前
Kubernetes控制平面组件:API Server RBAC授权机制 详解
kubernetes·云计算·rbac·授权·authorization·apiserver·鉴权机制
格桑阿sir9 小时前
Kubernetes控制平面组件:APIServer 基于 X509 证书的认证机制
kubernetes·ssl/tls·kubeadm·x509·csr·认证机制·apiserver
banban1 天前
Kubernetes集群资源管理 - YAML
kubernetes
土豆沒加1 天前
ubuntu22.04使用minikube安装k8s
云原生·容器·kubernetes
猫吃了源码1 天前
KubeKey一键安装部署k8s集群和KubeSphere详细教程
云原生·容器·kubernetes
你可以叫我仔哥呀1 天前
k8s学习记录:环境搭建(基于Kubeadmin)
学习·容器·kubernetes