如何安装kubernetes1.29.2

最近在学习kubernetes,安装教程找了一大堆。很多视频的安装教程所使用的命令都不相同,于是准备依照官方文档安装,但是初次学习,很多安装的细节官方文档也没有描述的很清楚,知识概念更是一大堆,探索了两天,终于装好了,记录下来以此给其他初学者学习

参考文献: https://www.youtube.com/watch?v=I9goyp8mWfs

一、前提要求

1.1.Ubuntu22.04

准备3台装好了Ubuntu22.04系统的主机(或虚拟机),每台机器的配置如下图,搭建集群最少要2台机器(1个控制节点,1个工作节点),我3台是学习使用。如果只有1台,也可以跟着做,前面大部分的步骤是每台机器都要做的,但是部署好集群后就不知道能不能用了。

1.2.代理节点

因为我使用的是官方镜像,所以要代理加速,就不花功夫切换国内镜像了,因为使用国内镜像的教程比较少,而且官方的中文文档命令有些和英文文档的不一样,有些中文文档的命令用不了。没有代理节点也可以往下看文章(安装的思路是很相同的,看看你是少了哪一步),切换国内镜像就去其他教程搜搜吧。

1.3.提供思路

这篇文章提供了安装k8s的思路,只要是linux系统都可以看。

1.4.版本注意

后面所提供的安装命令都是安装当前最新版的命令,现在最新版是v1.29.2,随着时间推移,后面的安装命令和版本可能不同,一切以官方文档为主

二、安装前准备

2.1 关闭防火墙

关闭ubuntu使用的ufw防火墙,否则后面部署节点间的通信可能失败

sudo systemctl stop ufw.service
sudo systemctl disable ufw.service

2.2.关闭selinux

Ubuntu好像默认不开启selinux,可以不做这步,Centos就要做了,否则后面部署节点间的通信可能失败

# 永久关闭
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 临时关闭,(一般选永久关闭)
setenforce 0

2.3.关闭swap交换分区

k8s官方要求关闭交换分区,以增强性能,不关闭可能部署时报错

# 永久关闭
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab

# 临时关闭,(一般选永久关闭)
sudo swapoff -a	

执行完后重启,使用free查看swap分区是否都为0
在这里插入图片描述

2.4.根据部署规划设置主机名

# <hostname>替换为当前主机名
hostnamectl set-hostname <hostname>

2.5.设置时区(每个节点时间同步)

sudo timedatectl set-timezone Asia/Shanghai

2.6.添加hosts规则(保证每个节点网络畅通)

# 在每台主机上添加hosts规则
cat << EOF | sudo tee -a /etc/hosts
192.168.1.7 k8s-master
192.168.1.5 k8s-slave1
192.168.1.6 k8s-slave2
EOF

三、开始安装

3.1.安装kubeadm,kubelet,kubectl

3.1.1 找到官方文档

(https://kubernetes.p2hp.com/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)
在这里插入图片描述

要使用kubernetes,必须先安装三个工具:
1.kubeadm:用来初始化集群的指令。
2.kubelet:在集群中的每个节点上用来启动 Pod 和容器等。
3.kubectl:用来与集群通信的命令行工具。

3.1.2 根据文档的内容操作安装好这三个工具

#1.更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

#2.下载 Google Cloud 公开签名秘钥:
# 这里有坑,官方文档要看英文版的命令,这里如果用中文版的命令,会下载不下来
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

#3.添加 Kubernetes apt 仓库:
# 这里有坑,官方文档要看英文版的命令,这里如果用中文版的命令,会下载不下来
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

#4.更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl
# sudo apt-mark hold是锁定其版本,之后使用apt update不会更新这几个软件包,因为k8s的版本依赖很强,可能组件之间的版本差距超过2个小版本都不能一起正常使用,所以要按照官方教程更新:
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

#kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。(官方说明,不懂什么意思,不管)

3.2 安装container-runtimes

3.2.1 找到官方文档

官方文档:https://kubernetes.p2hp.com/docs/setup/production-environment/container-runtimes.html
说明:container-runtimes是容器运行的工具,我使用containerd
在这里插入图片描述

3.2.2 安装containerd前的配置

依照官方文档:
https://kubernetes.p2hp.com/docs/setup/production-environment/container-runtimes.html

#转发 IPv4 并让 iptables 看到桥接流量
#通过运行 lsmod | grep br_netfilter 来验证 br_netfilter 模块#是否已加载。
#若要显式加载此模块,请运行 sudo modprobe br_netfilter。
#为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:
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

3.2.3 安装containerd(二进制安装)

3.2.3.1.官方文档

https://github.com/containerd/containerd/blob/main/docs/getting-started.md

wget https://github.com/containerd/containerd/releases/download/v1.7.13/containerd-1.7.13-linux-amd64.tar.gz
# 把解压出来的bin目录下的文件合并放到/usr/local/bin目录下
sudo tar Cxzvf /usr/local containerd-1.7.13-linux-amd64.tar.gz
#bin/
#bin/containerd-shim-runc-v2
#bin/containerd-shim
#bin/ctr
#bin/containerd-shim-runc-v1
#bin/containerd
#bin/containerd-stress
3.2.3.2.把containerd注册为服务,开机启动
#下载官网的containerd服务配置文件,注意,ubuntu的服务文件存放在/etc/systemd/system/下,其他系统不一定是
curl https://raw.githubusercontent.com/containerd/containerd/main/containerd.service | sudo tee /etc/systemd/system/containerd.service

# 重新加载守护进程(服务),让系统扫描到刚刚下载的服务文件
sudo systemctl daemon-reload
# 启动containerd服务
sudo systemctl enable --now containerd

官方文档要求二进制安装containerd时必须按照runcCNI plugins

3.2.4 安装runc(二进制安装)

下载网址:https://github.com/opencontainers/runc/releases

# 下载amd64格式的文件
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
# 安装
sudo install -m 755 runc.amd64 /usr/local/sbin/runc

3.2.5 安装CNI plugins(二进制安装)

下载网址:https://github.com/containernetworking/plugins/releases

# 下载amd64格式的文件
wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz

# 把它解压到/opt/cni/bin目录下
sudo mkdir -p /opt/cni/bin
sudo tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.4.0.tgz
#./
#./macvlan
#./static
#./vlan
#./portmap
#./host-local
#./vrf
#./bridge
#./tuning
#./firewall
#./host-device
#./sbr
#./loopback
#./dhcp
#./ptp
#./ipvlan
#./bandwidth

3.2.6 配置containerd

3.2.6.1.依据官方文档,containerd需要配置
# 若没有/etc/containerd文件夹首先要创建
sudo mkdir /etc/containerd
# 生成containerd的默认配置文件
containerd config default | sudo tee /etc/containerd/config.toml
3.2.6.2.修改containerd配置文件

修改config.toml中的SystemdCgroup字段为true,注意这个文件中有两个cgroup选项,我们要改的是[plugins.“io.containerd.grpc.v1.cri”.containerd.runtimes.runc.options]下的SystemdCgroup,如果改了另一个,后面就会启动失败。(又是一个坑)
containerd和kubelet中都使用到了Cgroup,但默认使用的Cgroup类型不同,所以这里要改为System类型,使它们用同一种Cgroup,不然后面部署会报错。

# 重新启动containerd服务
sudo systemctl restart containerd

4.部署集群(以下步骤仅控制节点需要操作)

4.1 使用kubeadm创建集群

这里集群的初始化参数我是跟着k8s教学视频配的,不是必须这么多字段,但kubernetes-versionnode-name应该是必要的

# 在初始化集群之前,提前拉去所需要的镜像
# 后面初始化集群的时候也会执行这一步,怕那个时候下载由于网络问题会导致一些错误
sudo kubeadm config images pull

# 查看三个组件的版本,要确保三个组件版本一致
kubeadm version
kubectl version
kubelet --version
# apiserver-advertise-address填k8s管理节点的ip
# kubernetes-version填当前安装的k8s版本
# node-name填管理节点的主机名,前面设置的
# service-cidr是后面如果要创建service使用的ip段
# pod-network-cidr是后面创建pod使用的ip段
sudo kubeadm init \
--apiserver-advertise-address=192.168.1.6 \
--kubernetes-version v1.29.2 \
--node-name k8s-master \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16

k8s集群初始化后的输出信息:

在这里插入图片描述

初始化k8s配置文件命令

# (普通用户)输入图片上方第一个红框的命令,如果不输入,后面用kubectl则连接不上集群
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# (root用户)可以输入第二个红框的命令,如果不输入,后面用kubectl则连接不上集群
export KUBECONFIG=/etc/kubernetes/admin.conf

如果不初始化k8s配置文件,后面使用kubectl会报错:E0310 23:11:27.728343 62691 memcache.go:265] couldn't get current server API group list: Get "http://localhost:8080/api?timeout=32s": dial tcp 127.0.0.1:8080: connect: connection refused The connection to the server localhost:8080 was refused - did you specify the right host or port?

其他工作节点加入本集群命令,建议在后面设置好CNI插件后执行在工作节点输入):

# 图片上方第二个红框的命令(别输入我图片里的,你们自己的电脑运行后返回的命令)
sudo kubeadm join 192.168.1.7:6443 --token 1u3pcs.jxlj38sufviqou2n \
        --discovery-token-ca-cert-hash sha256:8b12e4d413c35f59255a65cb9875cd0d3bcd2310613f38161e9794cea99d5e22

# 创建好集群后查看所有命名空间里的pod
kubectl get pods -A
# 查看当前控制节点的状态
kubectl get nodes

在这里插入图片描述

4.2 创建CNI Plugin

初始化集群后,我们会发现集群一直是NotReady状态,或者集群处于Ready状态,但是coredns一直没有running,这里也是我想了很久没想通。后来发现要安装CNI Plugin,因为官方文档只是提了一下要安装CNI Plugin,粗略带过了,导致我在网上找了很久才找到原因。k8s官方是不管网络连接的,网络是由CNI接口规范管的。只要是实现了这个接口都可以被称为CNI插件,就像Java的接口和类一样,接口只是规范,类才是真正用代码实现了接口。网上可以搜到很多CNI插件,比较之后发现Calico性能安全等等方面都比较好,我就使用它了。
如果不安装CNI插件,查看日志就会发现报错:Container runtime network not ready" networkReady="NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized"

常见的CNI插件:https://developer.aliyun.com/article/1245323

4.2.1 安装Calico

官方文档:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart

# 安装Tigera Calico operator和custom resource definitions.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml
# 获取自定义资源配置文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml

要把下载的custom-resources.yaml中的cidr=192.168.0.0/16换成之前创建集群时–pod-network-cidr指定的网段,这两个网段必须一样。注意,calico默认是使用192.168.0.0/16网段,如果 192.168.0.0/16 已在网络中使用,则必须选择其他容器网络 CIDR,替换上述命令中的 192.168.0.0/16。

# 通过创建必要的自定义资源来安装 Calico
kubectl create -f custom-resources.yaml

# 之后查看pods状态,-w是持续查看,刷新显示更改的状态
kubectl get pods -A -w

等到所有pod都处在运行状态,k8s集群就装好了
在这里插入图片描述

PS:1.如果kubeadm的token过期了,可以用kubeadm token create --print-join-command自动帮你生成添加节点命令。
2.如果控制节点中kubectl get node查看其他加入的节点ROLES为空,可以用下面命令把它标记为工作节点:
kubectl label node 节点名字 node-role.kubernetes.io/worker=worker

如何卸载k8s集群https://blog.csdn.net/qq_51065948/article/details/136752776

整理资料很费时间,如果对你有所帮助,请给个赞呗 o w o

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卍逝去&夜的星空卍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值