记录一次失败的本地K8S集群安装记录

如何在ubuntu上从头开始搭建k8s集群?

在Ubuntu上从头开始搭建Kubernetes(K8s)集群需要进行几个步骤,包括安装必要的软件、配置集群节点、初始化主节点和添加工作节点。以下是详细的步骤:

1. 准备工作

确保所有节点都运行相同版本的Ubuntu,推荐使用Ubuntu 20.04或更新版本。并且确保所有节点都有互联网连接。

2. 更新系统和安装必要的软件

在所有节点上更新系统并安装必要的软件包:

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https ca-certificates curl

3. 禁用交换分区

Kubernetes要求禁用交换分区。可以通过编辑/etc/fstab文件来永久禁用交换分区:

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

Notes: 交换分区是什么,以及为什么要禁用交换分区,见下面QA章节

4. 安装Docker

Kubernetes需要容器运行时,这里使用Docker:

sudo apt-get install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

简单验证,docker是否安装成功

docker --version
sudo systemctl status docker

Notes: 更多docker验证,见下面QA章节

5. 安装Kubeadm、Kubelet和Kubectl

添加Kubernetes的APT源,并安装kubeadm、kubelet和kubectl:

sudo su -c "echo 'deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main' > /etc/apt/sources.list.d/kubernetes.list"
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

注意这里使用的是阿里云的APT源。

6. 初始化主节点

在主节点上运行以下命令来初始化Kubernetes集群:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

执行完上述命令后,会输出一段kubeadm join命令,稍后需要在工作节点上使用。

Notes: 关于--pod-network-cidr=10.244.0.0/16参数的解释,见下面QA章节

!!!!卡在这里出错了,没办法继续进行!!!!
出错信息:

[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.

之后再搞吧。

7. 配置kubectl

将Kubernetes配置文件复制到普通用户目录下,以便使用kubectl命令:

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

8. 部署网络插件

为了让Pods能够相互通信,需要部署一个网络插件。这里使用Flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

9. 添加工作节点

在每个工作节点上运行第6步输出的kubeadm join命令,例如:

sudo kubeadm join <master-node-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

10. 验证集群状态

在主节点上验证集群状态:

kubectl get nodes

所有节点应该都显示为Ready状态。

11. 测试集群

创建一个简单的Pod来验证集群是否正常工作:

kubectl run nginx --image=nginx --port=80
kubectl get pods

如果Pod状态为Running,则表示集群搭建成功。

通过以上步骤,您已经在Ubuntu上成功搭建了一个Kubernetes集群。如果有任何问题,请随时提出!

QA

交换分区是什么?

交换分区(Swap Partition)是一种用于虚拟内存的硬盘分区,它可以帮助操作系统管理内存资源。当物理内存(RAM)不足时,操作系统会将不常用的数据从内存转移到交换分区,从而释放更多的物理内存供当前活跃的应用程序使用。

交换分区的作用

  1. 扩展内存容量:当系统的物理内存用尽时,交换分区可以提供额外的虚拟内存,避免系统因内存不足而崩溃。
  2. 内存管理:操作系统可以将不常用的内存页写入交换分区,从而腾出物理内存用于更紧急的任务。
  3. 系统稳定性:通过使用交换分区,系统可以在内存资源紧张时继续运行,提供一定的缓冲时间以释放或分配内存。

交换分区的工作原理

当操作系统检测到物理内存不足时,它会将不活跃的内存页移到交换分区。这些内存页被存储在硬盘上,硬盘访问速度相对于RAM较慢,所以频繁使用交换分区会导致性能下降。当这些内存页再次需要时,操作系统会将它们从交换分区移回到物理内存中。

在Linux中查看和管理交换分区

  1. 查看交换分区:可以使用以下命令查看系统的交换分区状态:
swapon --show
  1. 禁用交换分区:在Kubernetes集群中,要求禁用交换分区。可以使用以下命令暂时禁用交换分区:
sudo swapoff -a
  1. 永久禁用交换分区:编辑/etc/fstab文件,注释掉有关交换分区的行,以防止系统重启后再次启用交换分区:
sudo nano /etc/fstab
# 找到包含 "swap" 的行,并在前面添加 # 注释掉它,例如:
# /swapfile swap swap defaults 0 0

保存并退出后,交换分区将在系统重启后保持禁用状态。

为什么Kubernetes要求禁用交换分区

Kubernetes设计的假设是节点上的内存资源是有限的,并且它会精确地调度和管理Pod及其容器的资源。如果启用了交换分区,当物理内存不足时,系统可能会将一些内存页移到交换分区,这可能会导致性能不稳定,甚至在极端情况下导致节点崩溃。为确保Kubernetes集群的稳定性和性能,一般要求禁用交换分区。

如何验证docker是否安装成功

1. 检查Docker版本

首先,检查Docker的版本以确保它已正确安装:

docker --version

正常输出示例:

Docker version 20.10.12, build e91ed57

2. 检查Docker服务状态

验证Docker服务是否已启动并正在运行:

sudo systemctl status docker

正常输出示例(部分):

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-05-17 12:34:56 UTC; 10min ago
       Docs: https://docs.docker.com
   Main PID: 1234 (dockerd)
      Tasks: 8
     Memory: 25.3M
     CGroup: /system.slice/docker.service
             └─1234 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

3. 运行测试容器

通过运行一个简单的测试容器来验证Docker是否正常工作,例如运行hello-world镜像:

sudo docker run hello-world

正常输出示例:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:...
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

4. 检查运行中的容器

验证刚刚运行的hello-world容器的状态:

sudo docker ps -a

正常输出示例:

CONTAINER ID   IMAGE         COMMAND    CREATED          STATUS                      PORTS     NAMES
c4a93b8a8d23   hello-world   "/hello"   5 seconds ago    Exited (0) 3 seconds ago              amazing_bhaskara

5. 检查Docker信息

获取Docker的详细信息,包括系统信息和配置:

sudo docker info

正常输出示例(部分):

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
Server Version: 20.10.12
Storage Driver: overlay2
...

--pod-network-cidr=10.244.0.0/16参数的解释

在命令 sudo kubeadm init --pod-network-cidr=10.244.0.0/16 中,--pod-network-cidr 参数指定了Kubernetes集群中Pod网络的CIDR(Classless Inter-Domain Routing,无类别域间路由)。具体来说,10.244.0.0/16 是为集群中的Pods分配的IP地址范围。

解释 10.244.0.0/16 的含义

  • 10.244.0.0:这是IP地址范围的起始地址。
  • /16:表示子网掩码,这里的子网掩码是255.255.0.0,意味着这个网络范围内有2^16 = 65536个IP地址。

为什么需要指定 --pod-network-cidr

在Kubernetes集群中,每个Pod需要一个唯一的IP地址,这些IP地址不能与集群节点的IP地址冲突。--pod-network-cidr 参数用于定义Pod IP地址的范围,以便网络插件(如Flannel、Calico等)根据这个范围配置网络。

选择适当的 --pod-network-cidr

不同的网络插件可能有不同的默认IP范围要求:

  • Flannel:通常使用 10.244.0.0/16 作为默认值。
  • Calico:通常使用 192.168.0.0/16 作为默认值,但也可以根据需要调整。
  • Weave:通常使用 10.32.0.0/12 作为默认值。

在这里插入图片描述

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑风风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值