【2024】k8s集群 图文详细 部署安装使用(两万字)
方渐鸿 2024-10-11 16:37:01 阅读 54
目录💻
一、前言二、下载依赖配置环境1、配置系统环境1.1、配置桥接网络1.1.1、parallels desktop配置1.1.2、VMware配置
1.2、配置root用户登陆
2、环境配置安装下载2.1、安装ipset和ipvsadm2.2、关闭SWAP分区
3、配置Containerd容器3.1、下载安装Containerd3.2、创建&修改配置文件3.3、启动Containerd&开机自启
4、添加K8S集群组件4.1、修改下载源4.2、安装组件
5、克隆服务器5.1、通过parallels desktop克隆5.2、通过VMware克隆
6、主机配置6.1、设置静态ip6.2、修改主机名6.3、主机名解析ip6.4、时间同步6.5、配置内核转发、网桥过滤配置
三、部署集群1、配置部署k8s集群1.1、集群初始化1.2、准备kubectl配置文件1.2、添加从节点
2、安装k8s网络插件Calico2.1、执行安装tigera-operator2.2、配置custom-resources2.3、错误解达。
四、测试使用1、安装可视化Web工具:Kuboard v31.1、使用kubectl安装(master01节点执行)1.1.2、常见错误
1.2、web配置
2、部署Nginx服务2.1、使用Kuboard部署2.2、使用yaml方式创建
一、前言
因为我只有一台服务器,我使用的是,所有我采用的是通过安装虚拟机的方式实现集群搭建,先把需要的配置环境拉取下来,然后再通过虚拟机的克隆的方式直接把配置克隆到新的服务器上,减少重复下载。
通过在ubuntu服务器上安装VMware和在MAC上安装parallels desktop都有部署成功,安装虚拟机的实体机配置内存需要够,并且需要可以连接🛜,因为需要下载一些配置依赖,因为是安装k8s集群需要安装三台ubuntu容器。当然如果是有多台服务器的话直接把安装命令都执行一遍就行
下面是我使用的配置:
信息 | 配置 |
---|---|
节点主机 | Ubuntu20.4 / 22.4 |
K8S版本 | 1.28.1 |
配置 | 三台集群(内存:2G、磁盘:30G) |
SSH连接工具 | WindTerm / Tabby |
宿主机 | Ubuntu24.4 / M2 |
虚拟机工具 | VMWaer / parallels desktop |
ubuntu镜像(注意看后缀arm是 苹果的Apple M,Intel 的用amd): https://pan.baidu.com/s/16f1lzIqFOHlsyfzVV3lv9A?pwd=5p8a 提取码: 5p8a
WindTerm(ssh连接工具下载地址):https://github.com/kingToolbox/WindTerm/releases
二、下载依赖配置环境
1、配置系统环境
1.1、配置桥接网络
因为我们实际开发中肯定是把k8s部署在服务器上的嘛,所以需要把虚拟机内服务器的网络改为同物理机在同一网段的。所以需要在 “桥接网络”选项下的列表中选择虚拟机将要桥接的物理适配器。否则同一局域网的其他物理机都没法范围到这些虚拟机的ip
1.1.1、parallels desktop配置
右击对应的虚拟机,点击配置,选择硬件中的网络,修改源为桥接网络中的默认适配器,如果有多个网络,则直接选择你想要用于外部连接的那个网络就行
通过ifconfig命令查看ip是否改为了外表局域网同一网段了
1.1.2、VMware配置
先点击网络适配器
选择第一个,然后保存退出
再右击每个主机服务器,点击设置(Settings)
选择网络,选择桥接网络,点击确认保存,然后就可以到对应的主机查看IP了
1.2、配置root用户登陆
在创建虚拟机的时候需要先添加ssh连接,但我们创建后,是不能直接用root用户直接登陆的,虽然可以通过<code>sudo su转为root,但每次都要转,也麻烦,可以通过修改配置,让直接通过root用户进行ssh登陆。
首先通过ssh工具连接上虚拟机,账号密码就是我们创建的时候设置的那个账号,然后通过sudo su
切换为root管理员用户
修改/etc/ssh/sshd_config文件配置
修改下面ssh的配置文件的,34行左右的位置(右下角可以看行数),把标注的三行的注释打开,并且把第34行改为 yes
<code>vim /etc/ssh/sshd_config
·
重制root用户的密码
把root用户的密码改为自己需要的
<code>sudo passwd root
重启ssh服务
service ssh restart
其他
如果是没有安装ssh命令,可以通过
<code>#更新软件包
sudo apt update
#安装ssh
sudo apt install openssh-server
#安装ifconfig命令包(刚创建的虚拟机可能会没有)
sudo apt install net-tools
2、环境配置安装下载
下面的步骤,如果是使用的下面的WindTerm的截图代表是集群的每个容器都需要执行的,如果是使用的上面的tabby的截图代表是只有master节点需要执行就行。
因为他们的配置一样,我免得都下载一遍,所以我直接一个下载好,然后通过克隆的方式直接克隆到其他的节点去,这样也避免出现一些不一样的东西
2.1、安装ipset和ipvsadm
它们在 Kubernetes (k8s) 中用于网络管理和负载均衡。
首先执行安装
apt-get install ipset ipvsadm
执行的时候需要你输入y
确认,确认就行
然后执行配置 ipvsadm 模块,用于开机自启动的,可以使用<code>vi /etc/modules-load.d/ipvs.conf查看是否配置成功
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
因为本次也需要启动,所以需要在配置一个脚本用于本次启动的
配置脚本文件
<code>cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
执行刚刚创建的脚本
sh ipvs.sh
通过下面的命令查看是否配置成功
lsmod | grep ip_vs
如下图,就表示加载成功了
2.2、关闭SWAP分区
直接通过修改<code>/etc/fstab文件,永久关闭SWAP分区,避免重启时打开
永久关闭
vim /etc/fstab
打开后,把最后一行/swap.img
开头的注释调就行
修改swap需要重启才能使得配置文件生效,因为现在就需要用,可以直接重启,也可以先临时关闭掉
临时关闭
<code>swapoff -a
查看是否关闭成功
free -m
变0了表示关闭了
3、配置Containerd容器
Containerd 在 Kubernetes 中扮演了容器运行时的角色,负责创建、管理和运行容器,提供了一个标准的容器运行时环境和安全特性。
3.1、下载安装Containerd
下载Containerd,因为是在github上所以如果没有外网可能会下载不成功,我上面的百度网盘有放下载好的(注意看后缀arm是 苹果的Apple M,Intel 的用amd),直接导入到服务器里面去就行,如果自己下载也是,别下载错了
<code>wget https://github.com/containerd/containerd/releases/download/v1.7.5/cri-containerd-1.7.5-linux-amd64.tar.gz
安装 Containerd
解压后会自动安装到指定位置去
#解压文件
tar xf cri-containerd-1.7.5-linux-amd64.tar.gz -C /
#查看安装
containerd --version
3.2、创建&修改配置文件
创建配置文件
mkdir /etc/containerd
#生成默认的配置文件
containerd config default > /etc/containerd/config.toml
#查看是否生成成功
ls /etc/containerd
修改配置文件
<code>vim /etc/containerd/config.toml
修改第65行sanbox_image的值改为registry.aliyuncs.com/google_containers/pause:3.9
,改为阿里的镜像地址和版本号。(镜像地址也可以不修改,只需要修改版本号也行,需要和后面–>8.1、集群初始化介绍的kubeadm-config.yaml
文件的一致就行)
需要137行的<code>false改为true
修改好后保存退出
3.3、启动Containerd&开机自启
执行开机启动,并且现在就启动
<code>systemctl enable --now containerd
验证是否启动成功
systemctl status containerd
4、添加K8S集群组件
4.1、修改下载源
添加阿里的软件源
<code>echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
验证是否添加成功
ls /etc/apt/sources.list.d
更新软件源
apt-get update
这个时候会失败,因为没有公钥,缺少 GPG 的key导致的
把公钥添加到服务器
上面图片箭头的<code>B53DC80D13EDEF05就是你的公钥,需要添加自己的
apt-key adv --recv-keys --keyserver keyserver.ubuntu.com B53DC80D13EDEF05
导入之后就会更新成功
apt-get update
4.2、安装组件
下面三个是k8s必要的组件,
<code>kubeadm:创建、升级和管理 Kubernetes 集群kubelet
:管理节点上的容器生命周期kubectl
:管理和调试 Kubernetes 应用程序
执行安装
安装的时候需要y,y就行
apt-get install kubeadm=1.28.1-00 kubelet=1.28.1-00 kubectl=1.28.1-00
上面是我安装的版本,如果想安装其他版本可以用下面的命令查看,如果不加版本号,会下载最新的
查看版本
apt-cache madison kubeadm
apt-cache madison kubelet
apt-cache madison kubectl
查看是否安装成功
<code>kubeadm version
kubelet --version
kubectl version
锁定版本
安装好后需要需要锁定版本,避免自动更新造成的一些问题
apt-mark hold kubeadm kubelet kubectl
5、克隆服务器
因为我们是要建立k8s集群嘛,所以需要有三台服务器用做搭建集群,
如果是本身有多台服务器的,并且前面的命令都在全部服务器执行过了的,就可以跳过这一步。
克隆服务器在VMware和parallels desktop执行都比较简单
5.1、通过parallels desktop克隆
先把服务器关闭
右击你刚刚下载的好配置依赖的容器,点击克隆
定义名称,点击确认
重复两次克隆两台从服务器出来
5.2、通过VMware克隆
克隆
先关闭虚拟机,然后右击点击
然后一路next确认
然后等待克隆完成,启动
6、主机配置
6.1、设置静态ip
复制配置文件
避免配置错了无法恢复。可能有些版本的配置文件不是叫<code>00-installer-config.yaml这个名字,反正修改/etc/netplan
下的那个文件就行
cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
修改配置文件
vim /etc/netplan/00-installer-config.yaml
配置文件(三台虚拟机服务器都需要配置本虚拟机的ip)
需要修改下面文件的addresses: [192.168.5.55/24]
和via: 192.168.5.1
,!!!注意不要有多余空格
addresses需要把ip改为本服务器的via:网段改为自己的,网段通过route -n
命令查看
安装的arm架构的
<code># This is the network config written by 'subiquity'
network:
version: 2
ethernets:
enp0s5:
dhcp4: no
addresses: [192.168.5.55/24]
routes:
- to: default
via: 192.168.5.1
nameservers:
addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
安装的amd架构的
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses:
- 192.168.3.170/24
routes:
- to: default
via: 192.168.3.1
nameservers:
addresses: [119.29.29.29,114.114.114.114,8.8.8.8]
配置生效
netplan apply
配置好之后可以ping一下局域网的其他物理机的网络,看是否可以ping通
6.2、修改主机名
三台服务器分别执行
master01执行
<code>hostnamectl set-hostname master01
worker01执行
hostnamectl set-hostname worker01
worker02执行
hostnamectl set-hostname worker02
然后exit
退出当前用户,在重新登陆一下就可以了,可以看名字都一句以及已经改为了对应的名字
6.3、主机名解析ip
全部都需要执行(!!!!这个要改为自己集群的主机ip)
<code>cat >> /etc/hosts << EOF
192.168.5.53 mater01
192.168.5.54 worker01
192.168.5.55 worker02
EOF
通过WindTerm的频道功能,可以实现同频道中,只要一个页面输入,其他的都会同步输入
再执行查看是否写入
<code>cat /etc/hosts
6.4、时间同步
更改时区为上海时区
<code>timedatectl set-timezone Asia/Shanghai
安装ntpdate
ntpdate是一个用于同步系统时钟与NTP服务器的工具
apt-get install ntpdate
通过ntpdate命令同步时间
ntpdate time1.aliyun.com
通过定时任务去实现定时同步
crontab -e
中间会让你选择输入2
:
把下面这行加入进去
<code>0 */1 * * * ntpdate time1.aliyun.com
6.5、配置内核转发、网桥过滤配置
配置依赖模块到 /etc/modules-load.d/k8s.conf,用于实现开启自动加载
overlay: 这是 OverlayFS 的内核模块,用于支持 Docker 和 Kubernetes 等容器化技术。
br_netfilter: 这是 Linux 内核中的网桥过滤器模块,用于支持 Kubernetes 的网络功能。
<code>cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
配置完成之后,本次启动这两个配置,因为配置上配置后期开机启动的,当下也需要先启动
modprobe overlay
modprobe br_netfilter
2. 查看是否启动成功
<code>lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"
转发配置到k8s.conf文件中
<code>cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
加载内核参数:
sysctl --system
然后在查看是否加载成功
sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
和net.ipv4.ip_forward_update_priority = 1
都变为1了表示加载成功
三、部署集群
1、配置部署k8s集群
1.1、集群初始化
下面的只需要<code>master节点的主机执行,其他的两个从机不用执行
创建kubeadm-config配置文件
把配置文件打印到本地,用于编辑
kubeadm config print init-defaults > kubeadm-config.yaml
修改文件
修改拉下来的配置文件
<code>vim kubeadm-config.yaml
修改advertiseAddress
的ip为mater01节点的ip
修改name
为mater01节点的主机名
修改imageRepository
仓库地址为阿里云的镜像仓库registry.aliyuncs.com/google_containers
。因为前面/etc/containerd/config.toml
文件修改了,如果前面的文件镜像仓库地址没修改,这个地方也可以不修改
修改kubernetesVersion
版本号,前面下载的是什么版本就写什么版本
dnsDomain
表示DNS域名,可以不修改,但一个局域网内只能有一个相同的,如果有两个k8s集群用的一样的DNS名字就会冲突,一般推荐修改为公司的域名
在networking
中的 serviceSubnet 后面添加
podSubnet: 10.244.0.0/16
在最后面在添加下面的配置
---
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
红色的是修改,绿色的是添加
重启服务
修改完,分别重启containerd 和 kubelet
<code>systemctl restart containerd
systemctl restart kubelet
下载镜像
下载k8s所需要的镜像到主节点
--image-repository
:指定镜像仓库--kubernetes-version
:版本号,改为你的k8s版本
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version v1.28.1
执行初始化
<code>kubeadm init --config kubeadm-config.yaml
出现下面的,就表示初始化成功了
1.2、准备kubectl配置文件
添加配置文件
把上面输出的内容在<code>master节点执行一遍
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看节点
kubectl get nodes
1.2、添加从节点
复制刚刚自己初始化的地址,到从节点执行,也就是另外两个worker02节点
(!!!这个是我的,需要复制自己的)
复制token
<code>kubeadm join 192.168.5.53:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:55917a9c22cb444e83ce19517b8b9f1856401cf3ca11df4e661978fd9eed222e
查看
在到主节点进行查看
<code>kubectl get nodes
在查看,就可以看到刚刚加入的worker节点了
2、安装k8s网络插件Calico
k8s常用的网络插件主要有
Flannel:Flannel是Kubernetes官方推荐的网络插件之一。它提供了一种基于UDP的网络通信方式,支持多租户和多网段。Calico:Calico是另一个流行的K8S网络插件。它提供了一种基于BGP的网络通信方式,支持多租户和多网段。Weave:Weave是一种基于 Overlay 网络的K8S网络插件。它提供了一种简单易用的方式来管理集群中的网络通信。Cilium:Cilium是一种基于 Linux 内核的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。OpenVSwitch:OpenVSwitch是一种基于开源的K8S网络插件。它提供了一种高性能的网络通信方式,支持多租户和多网段。
2.1、执行安装tigera-operator
下载
我这安装的是3.26.1,如果需要安装其他版本,直接改版本号就行,其他目录都是一样的
<code>kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/tigera-operator.yaml
查看是否安装成功<code>tigera-operator
kubectl get ns
查看pod状态
如果是Runing
状态就代表成功了,如果不是就代表有问题
kubectl get pods -n tigera-operator
2.2、配置custom-resources
custom-resources.yaml 是一个用于配置 Kubernetes 的自定义资源定义(CRD)文件
先拉取下来
<code>wget https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/custom-resources.yaml
修改配置
修改配置网段,这个网段是前面初始化时设置的podSubnet
的网段 cidr: 10.244.0.0/16
vim custom-resources.yaml
拉取镜像
因为一些原因,选择不能下载,需要通过一些大佬弄的映射加速仓库去拉。
!!!全部节点都要拉取。
如果下面的地址不行,可以到里面去找最新的
https://github.com/DaoCloud/public-image-mirror/issues/2328
<code>ctr image pull docker.1panel.live/calico/cni:v3.26.1
ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.26.1
ctr image pull docker.1panel.live/calico/node:v3.26.1
ctr image pull docker.1panel.live/calico/kube-controllers:v3.26.1
ctr image pull docker.1panel.live/calico/typha:v3.26.1
ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.26.1
ctr image pull docker.1panel.live/calico/csi:v3.26.1
查看是否下次完成
<code>ctr image list
要确保全部都是application/vnd.docker.distribution.manifest.list.v2+json
没有出现 Init:ErrImagePull
应用配置
下载完成之后执行下面命令,应用配置
<code>kubectl create -f custom-resources.yaml
查看命名空间
kubectl get ns
看到calico-system
代表ok了
查看pod
<code>kubectl get pods -n calico-system
大概等个几分钟,都是 Runing
,代表成功
再查看节点信息,就会发现状态已经变成 Ready 状态
<code>kubectl get nodes
到这一步,说明就是全部安装完成了
2.3、错误解达。
如果哪个节点有问题
执行下面命令直接删除掉k8s相关的东西,然后重新安装三个组件,在去重新通过链接加入就行。
<code>#重置 Kubernetes 集群,它会删除所有与 Kubernetes 相关的配置文件、数据和组件。
sudo kubeadm reset
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/*
rm -rf /root/.kube
rm -rf /etc/kubernetes/*
ipvsadm -C
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
四、测试使用
1、安装可视化Web工具:Kuboard v3
1.1、使用kubectl安装(master01节点执行)
发生错误可以查看kuboard官网
https://press.demo.kuboard.cn/install/v3/install-in-k8s.html
下载配置文件
wget https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
执行创建
kubectl apply -f vim kuboard-v3-swr.yaml
如果镜像拉取不下来可以修改下镜像仓库地址改为我的阿里云的进行仓库地址
vim kuboard-v3-swr.yaml
# 地址:
registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard-agent
registry.cn-hangzhou.aliyuncs.com/zhengfp_images/etcd-host:3.4.16-1
registry.cn-hangzhou.aliyuncs.com/zhengfp_images/kuboard:v3
registry.cn-hangzhou.aliyuncs.com/zhengfp_images/questdb:6.0.4
分别把地址放入下面对应的地方
继续执行部署
<code>kubectl apply -f vim kuboard-v3-swr.yaml
查看部署
kubectl get pods -n kuboard
都是Running
即可
web测试
在浏览器打开链接<code>http://节点IP:30080
输入初始用户名和密码,并登录
用户名: admin
密码: Kuboard123
1.1.2、常见错误
通过<code>kubectl get pods -n kuboard查看pod,看哪个pod不成功
查看对应的错误
powershell kubectl logs kuboard-v3-7979bc788f-hln74 -n kuboard
desc = "transport: Error while dialing dial tcp: missing address"
错误表明 Kuboard 无法连接到 etcd。
<code>kuboard-v3-xxxxx 的容器出现 CrashLoopBackOff
的状态,可能的原因有
需要执行
前面两个错误都是执行下面的命令
kubectl label nodes mater01 k8s.kuboard.cn/role=etcd
1.2、web配置
刚进去会有一个错误的集群,删除掉,点击添加集群
输入集群名称和描述
复制kubeConfig
在master01节点执行<code>cat ~/.kube/config命令,把全部内容复制到kubeConfig框内,点击确认
如图显示,代表成功
2、部署Nginx服务
2.1、使用Kuboard部署
在首页点击集群,选择命名空间
填写信息
左边选择,名称空间>常用操作>创建工作负载,然后再填写基本信息
填写容器信息
阿里云镜像地址
<code>registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest
如果镜像拉取不下来可以看我【docker镜像加速服务搭建】这篇文章,自己搭建一个加速服务
填写好之后点击上面的保存>应用>确认>
查看
5.访问对应的节点进行测试
2.2、使用yaml方式创建
创建yaml
<code>vim nginx-deployment.yaml
编写配置
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxweb # 部署的名称
spec:
replicas: 2 # 设置副本数量为2
selector:
matchLabels:
app: nginxweb1 # 用于选择匹配的Pod标签
template:
metadata:
labels:
app: nginxweb1 # Pod的标签
spec:
containers:
- name: nginxwebc # 容器名称
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
ports:
- containerPort: 80 # 容器内部监听的端口
---
apiVersion: v1
kind: Service
metadata:
name: nginxweb-service # 服务的名称
spec:
externalTrafficPolicy: Cluster # 外部流量策略设置为集群
selector:
app: nginxweb1 # 用于选择匹配的Pod标签
ports:
- protocol: TCP # 使用TCP协议
port: 80 # 服务暴露的端口
targetPort: 80 # Pod中容器的端口
nodePort: 30080 # 在每个Node上分配的端口,用于外部访问
type: NodePort # 服务类型,使用NodePort
应用配置
kubectl apply -f nginx-deployment.yaml
检查是否成功
查看pod
kubectl get pods
查看service
service 可以查看到对应pod的名称还有端口映射
kubectl get service
查看访问ip
curl http://10.244.5.3
curl http://10.244.30.69
通过对应的节点IP进行测试
⌨️码字不易,觉得可以的话可以一键三连一下!!!
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。