使用kubeadm来搭建k8s集群(Kubernetes v1.23.4)

本文详细介绍了如何使用kubeadm在Ubuntu上搭建Kubernetes集群,包括主机环境准备、kubeadm安装、集群初始化、节点加入、网络插件安装以及使用Sonobuoy验证集群。此外,还讨论了在安装过程中可能遇到的错误,如文件已存在、连接拒绝以及cgroup驱动不匹配等问题,提供了相应的解决方案。

使用kubeadm来搭建k8s集群

一、什么是kubeadm

官方提供了三种Kubernetes部署方式

  1. minikube
    Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。

  2. kubeadm
    Kubeadm是一个工具,提供kubeadm init和kubeadm join,用于快速部署Kubernetes集群。 使用Kubeadm自动化部署(kubeadm)集群。

  3. 二进制包
    从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群。

kubeadm是Kubernetes官方推出的快速部署Kubernetes集群工具,其思路是将Kubernetes相关服务容器化(Kubernetes静态Pod)以简化部署。

Kubeadm 是 Kubernetes 提供的一个工具,可帮助用户安装可用于生产的 Kubernetes 集群的最佳实践。

二、部署 Kubernetes 基础

Kubernetes 集群时使用了两种服务器类型

  • Master(主节点)

控制和管理一组工作节点(工作负载运行时)的节点。
主节点具有以下组件来帮助管理工作节点:

Kube-APIServer

主要实现是 kube-apiserver。 kube-apiserver 旨在水平扩展——也就是说,它通过部署更多实例来扩展。 s可以运行多个 kube-apiserver 实例并平衡这些实例之间的流量。

Kube-Controller-Manager

它为正在运行的集群运行一组控制器。

从逻辑上讲,每个控制器都是一个单独的进程,但为了降低复杂性,它们都被编译成一个二进制文件并在一个进程中运行。

其中一些控制器:

Node控制器:负责在节点宕机时进行通知和响应。
Job控制器:监视代表一次性任务的作业对象,然后创建 Pod 以运行这些任务以完成。
Endpoints控制器:填充 Endpoints 对象(即加入 Services & Pods)。
Service Account & Token 控制器:为新命名空间创建默认帐户和 API 访问令牌。
Etcd

是一个高可用键值存储,为 Kubernetes 提供后端数据库。

它存储和复制整个 Kubernetes集群状态。 它是用 Go 编写并使用 Raft 协议。

Kube Scheduler

监视没有分配节点的新创建的 Pod,并选择一个节点让它们运行。

调度决策考虑的因素包括:独个和集合资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰和截止日期等。

  • Node(工作节点)

维护运行的 pod 并提供 Kubernetes 运行环境。

可行配置的最低要求

内存:每台机器 2 GB 或更多 RAM。
CPU:2 个 CPU 或更多。

网络:集群中所有机器之间的完整网络连接(公共或专用网络都可以)。

其他:每个节点的唯一主机名、MAC 地址和 product_uuid。

交换分区:必须禁用才能使 kubelet 正常工作。

三、unutun21.04 Kubeadm安装部署kubernetes1.23.4

kubeadm官方参考: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/
官方参考: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/

1. 主机环境准备

主机名uuid系统配置ip备注
cka-k8s-mastera15f4d56-a113-f038-67ac-e3befa61f876ubuntu20.042C4G50G10.68.1.131
cka-k8s-node1bf924d56-8f19-8c8b-dfdb-660f0482b295ubuntu20.042C4G50G10.68.1.132
cka-k8s-node20f954d56-ea25-8f19-272e-ff1f46553d07ubuntu20.042C4G50G10.68.1.133

uuid

sudo cat /sys/class/dmi/id/product_uuid

2. 安装 kubeadm

官方参考:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

使用 使用Kubeadm创建群集,第一步 就是在您的主机上安装Kubeadm,所以我们先看如何安装kubeadm

0)准备工作
  • 兼容的Linux主机。Kubernetes项目为基于Debian和Red Hat的Linux发行版提供了通用说明,以及没有包管理器的那些发行版。
  • 每台机器2 GB或更多RAM(任何少留下您的应用程序的空间)。
  • 2个CPU或更多。
  • 群集中的所有机器(公共或专用网络很好)之间的完整网络连接。
  • 每个节点的唯一主机名,MAC地址和Product_uuid。有关详细信息,请参阅此处。
#ifconfig -a
ip link 
sudo cat /sys/class/dmi/id/product_uuid
  • 某些端口在您的机器上打开。有关详细信息,请参阅此处
    这些所需的端口需要打开,以便kubernetes组件彼此通信。您可以使用Telnet检查端口是否打开。例如:
telnet 127.0.0.1 6443
  • Swap 禁用。您必须禁用SWAP以便kubelet正常工作。
    临时关闭
swapoff -a

永久关闭

vi /etc/fstab

注释掉最后一行 /swap.img

free -h查看swap信息,确认交换分区是否关闭,都为0表示关闭

free -h

关闭selinux虚拟内存

setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disable/' /etc/selinux/config

禁用SELinux
#永久禁用SELinux
vim /etc/sysconfig/selinux
SELINUX=disabled

#临时 禁用SELinux,让容器可以读取主机文件系统
setenforce 0

1)安装kubeadm, kubelet and kubectl

您将在所有计算机上安装这些包:

  • kubeadm: the command to bootstrap the cluster.
  • kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.
  • kubectl: the command line util to talk to your cluster.
  1. 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
  1. 安装谷歌云gpg证书
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

或 [国内使用](k8s 配置 阿里源
阿里官网: https://developer.aliyun.com/mirror/kubernetes)

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - 
  1. 添加apt 仓库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

或国内使用

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
  1. 使用apt 安装 kubelet, kubeadm and kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Ubuntu 的 apt-mark unhold 与 apt-mark hold 的用途是什么?
阻止自动更新(apt upgrade时忽略)。所以更新的时候先unhold,更新完再hold。

安装完成后
#查看kubelet版本

root@cka-k8s-master:~# kubelet --version
Kubernetes v1.23.4

查看kubeadm版本

kubeadm version

启动kubelet并设置开机启动服务

#重新加载配置文件
systemctl daemon-reload

#启动kubelet
systemctl start kubelet

#查看kubelet启动状态
systemctl status kubelet
#没启动成功,报错先不管,后面的kubeadm init会拉起

#设置开机自启动
systemctl enable kubelet

#查看kubelet开机启动状态 enabled:开启, disabled:关闭
systemctl is-enabled kubelet

#查看日志
journalctl -xefu kubelet

3. 使用kubeadm创建一个集群(Cluster)

使用Kubeadm,您可以创建一个最小的可行性Kubernetes集群,符合最佳实践。实际上,您可以使用Kubeadm设置一个通过Kubernetes一致性测试的群集。Kubeadm还支持其他集群生命周期功能,例如bootstrap tokens 和群集升级。

在master节点执行kubeadm初始化命令

注意:执行 kubeadm init 前,参考前面,要先把kubelet 启动起来。

初始化主节点, 使用IP
要在不使用 DNS的情况下引导集群,请运行:

sudo kubeadm init  --apiserver-advertise-address=10.68.148.131  --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.23.4 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12


参数说明
–apiserver-advertise-address=10.68.148.131 为Master的IP
–pod-network-cidr : 用于设置 Pod 网络CIDR。使用了非默认的CIDR,一定要和宿主机的局域网的CIDR不一样。这里建议使用默认 10.244.0.0/16
–image-repository registry.aliyuncs.com/google_containers 指定镜像仓库,如果不指定默认是k8s.gcr.io,国内需要翻墙才能下载镜像
–service-cidr 10.96.0.0/12 服务的虚拟IP将从这个子网中分配。
–kubernetes-version=v1.23.4 注意 这里版本号,和你kubelet --version 这个保持一致。

k8s集群初始化时的service网段,pod网段,网络插件的网段,以及真实服务器的网段,都不能相同,如果相同就会出各种各样奇怪的问题,而且这些问题在集群做好之后是不方便改的,改会导致更多的问题,所以,就在搭建前将其规划好。

注意:pod-network-cidr 是容器内网络,容器内通信用的。如果 192.168.13.0/16 已在网络中使用,必须选择不同的 pod 网络 CIDR,替换上述命令中的 10.244.0.0/16。

使用如下的命令,可以看到组件所要求的镜像

kubeadm config images list

这个init的过程很慢,因为要拉取7个镜像,且在拉取的过程中控制台没有任何输出,容易造成程序已僵死的错觉。

使用docker images查看,init 命令下载好的镜像。

最终执行成功,结果如下:
在这里插入图片描述根据init命令后,上图结果提示:
配置 kubectl 工具

  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
kubectl get cs

同时,根据上图,输出结果,记录 kubeadm init 输出的 kubeadm join 命令。 你需要此命令将节点加入集群。

kubeadm join 10.64.148.131:6443 --token vfmavp.k54qr9mt0zguwr4s \
        --discovery-token-ca-cert-hash sha256:e60a525f8c72d50d95ee82e826db931d43f3d445c67a9017c0590c2fc60b86ff

令牌用于控制平面节点和加入节点之间的相互身份验证。 这里包含的令牌是密钥。确保它的安全, 因为拥有此令牌的任何人都可以将经过身份验证的节点添加到你的集群中。 可以使用 kubeadm token 命令列出,创建和删除这些令牌。

因为init 要下载docker镜像,所以我们还是要提前按照docker环境,参考下面章节:

安装docker环境
方式一,推荐,亲测可用!
  1. 安装
    参考https://www.runoob.com/docker/ubuntu-docker-install.html

Docker 的旧版本被称为 docker,docker.io 或 docker-engine 。如果已安装,请卸载它们:

sudo apt-get remove docker docker-engine docker.io containerd runc

使用官方安装脚本自动安装
安装命令如下:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

亲测,可用!

也可以使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

亲测,可用!

  1. 查看docker状态
systemctl status docker
  1. 如果没有启动,就手动启动
systemctl start docker
  1. 设置开机自启
systemctl enable docker
方式二

安装docker

安装依赖

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-commo

安装gpg证书

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

写入软件源信息

sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新并安装Docker-ce

sudo apt-get -y update
apt install -y docker-ce

安装docker-compose

apt install -y docker-compose

将docker设置为开机自启

systemctl enable docker

4. 安装 Pod 网络附加组件

官方: https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
官方支持的CNI网络组件:https://kubernetes.io/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model

你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。

注意你的 Pod 网络不得与任何主机网络重叠: 如果有重叠,你很可能会遇到问题。 (如果你发现网络插件的首选 Pod 网络与某些主机网络之间存在冲突, 则应考虑使用一个合适的 CIDR 块来代替, 然后在执行 kubeadm init 时使用 --pod-network-cidr 参数并在你的网络插件的 YAML 中替换它)。

默认情况下,kubeadm 将集群设置为使用和强制使用 RBAC(基于角色的访问控制)。 确保你的 Pod 网络插件支持 RBAC,以及用于部署它的 manifests 也是如此。

安装calico网络

calico官网参考:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart

k8s集群里面,pod都是分布在不同的主机上面,为了实现这些pod的跨主机访问,必须要安装CNI网络插件,这里选择calico网络。

步骤1: 在master上下载配置calico网络的yaml。
官方文档
直接在下载找最新版本 找到安装说明下载 calico.yaml
https://docs.projectcalico.org/

这里主要改calico.yaml里面 CALICO_IPV4POOL_CIDR

  • name: CALICO_IPV4POOL_CIDR
    value: “10.44.0.0/16”
    这里的value 必须是你kubeadm.yaml 里面定义的 service 地址池。

使用以下命令安装Calico

wget https://docs.projectcalico.org/v3.20/manifests/calico.yaml --no-check-certificate

kubectl apply -f calico.yaml

kubectl get nodes

使用以下命令确认所有Pod正在运行

kubectl get pod --all-namespaces

移除master的污点

kubectl taint nodes --all node-role.kubernetes.io/master-

使用以下命令确认集群中现在有一个节点

kubectl get node -o wide

配备Calico的单主机Kubernetes集群完成。

5. 加入节点

首先节点上需要和master一样,你安装docker、kubeadm ,关闭swap等操作。

然后运行前面 master节点Kubeadm Init输出的join命令。例如:

kubeadm join 10.68.148.131:6443 --token vfmavp.k54qr9mt0zguwr4s \
        --discovery-token-ca-cert-hash sha256:e60a525f8c72d50d95ee82e826db931d43f3d445c67a9017c0590c2fc60b86ff
Kubeadm Init超过24小时,新建token 加入

默认token的有效期为24小时,当过期之后,该token就不可用了。

  1. 重新生成新的token
    ,在master节点上执行
root@cka-k8s-master:~#  kubeadm token create
eo5b7v.nugh5lgxbitpitjs
  1. 查看token
kubeadm token list
  1. 获取ca证书sha256编码hash值
    注意:在master上执行
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
  1. 组装加入节点命令
kubeadm join 10.65.148.131:6443 --token eo5b7v.nugh5lgxbitpitjs         --discovery-token-ca-cert-hash sha256:e60a525f8c72d50d95ee82e826db931d43f3d445c67a9017c0590c2fc60b86ff
  1. 在master再次查看
kubectl get nodes

在这里插入图片描述

6. 使用 Sonobuoy验证您的群集是否正确运行

官网参考: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node

Verify that your cluster is running properly with Sonobuoy

Sonobuoy 允许用户以易于访问和非破坏性的方式运行一组测试,从而对当前 Kubernetes 集群状态进行评估。Sonobuoy 可生成有关集群性能详细信息的报告。Sonobuoy 支持 3 个 Kubernetes 小版本,分别是当前发布版本和此前的两个小版本。SonobuoyScanner 是一款基于浏览器的工具,使用该工具,用户只需点击数下即可完成对 Kubernetes 集群的测试。当然,其 CLI 版本有更丰富的测试功能。

地址:https://sonobuoy.io/
https://github.com/vmware-tanzu/sonobuoy

Sonobuoy是一种诊断工具,可以运行Kubernetes一致性测试。它由一个CLI组成,该CLI启动一个pod来管理集群中的测试运行,并让您随后检索结果。它是一个简单的即用型解决方案,是用于运行一致性测试的标准工具。

四、使用K8S运行第一个容器

前面教程我们已经将K8S搭建起来了。但是,没有将实际使用中需要在K8S上部署我们的容器。

  • kubelet:运行在cluster所有节点上,负责启动pod和容器
    *kubeadm:用于初始化cluster的一个工具
    *kubectl:kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件;

现在我们来说一下如何使用K8S创建我们的第一个容器。

kubectl get nodes
kubectl get pods  #查看我们自己创建的容器运行状态
kubectl get pods --all-namespaces #查看k8S所有容器的状态
kubectl run my-nginx --image=nginx

–image 指定要运行的容器镜像

检查应用是否真正部署起来

root@cka-k8s-master:~# kubectl get pods
NAME       READY   STATUS    RESTARTS   AGE
my-nginx   1/1     Running   0          7m22s
root@cka-k8s-master:~#

查看nginx 是否拉取成功,在那个节点

kubectl get pod -o wide 

暴露nginx 端口

kubectl expose pod my-nginx --type=NodePort  --port=80 
  • ClusterIP:通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。 这也是默认的 ServiceType
  • NodePort: 通过每个节点上的 IP 和静态端口(NodePort)暴露服务。 NodePort 服务会路由到自动创建的 ClusterIP 服务。 通过请求 <节点 IP>:<节点端口>,你可以从集群的外部访问一个 NodePort 服务。
    https://kubernetes.io/zh/docs/concepts/services-networking/service/#type-nodeport

列出服务, 并访问

kubectl get services

使用节点ip加暴露出来的端口,即可访问。
nodeip:31258

发现访问不了nginx 问题定位

查看nginx 是否拉取成功,在那个节点

kubectl get pod -o wide 

检查你暴露的端口对不对,官方参考 https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#expose

发现自己搞错了,可以删除pod、service,重新查看调整,你的命令
Delete pods and services with same names my-nginx

kubectl delete pod,service my-nginx

k8s命令中的资源缩写

resource,Possible resources include (case insensitive):

pod (po), service (svc), replicationcontroller (rc), deployment (deploy), replicaset (rs)

五、安装过程遇到问题整理

1. 报错 [ERROR FileAvailable–etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists

行 kubeadm reset重置,再次初始化

2. 报错 dial tcp 127.0.0.1:10248: connect: connection refused

kubeadm init,初始化Kubernetes集群,报错
[kubelet-check] It seems like the kubelet isn’t running or healthy.
[kubelet-check] The HTTP call equal to ‘curl -sSL http://localhost:10248/healthz’ failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.

在这里插入图片描述向右移动方向键,查看第四行详情,可得
在这里插入图片描述 to run Kubelet: misconfiguration: kubelet cgroup driver: “systemd” is different from docker cgroup driver: “cgroupfs”

报错原因
其实根据上面的错误信息可知,
1)kubelet 使用的 cgroup driver 是 systemd 的,
2)而 docker 使用的 cgroup driver 是 cgroupfs 的
两者不同,导致上述错误。解决办法应该是使二者的 cgroup driver 相同。

可以通过

docker info

查看其中的 Cgroup Driver: 显示的是 systemd 或者 cgroupfs。k8s 默认就是cgroupfs。

根据报错后续的提示,可使用 journalctl -xeu kubelet 或者 journalctl -xeu kubelet -l 查看详细错误信息,如果看得不全,可以直接用方向键左右调整错误信息。

这是cgroup驱动问题。默认情况下Kubernetes cgroup驱动程序设置为system,但docker设置为systemd。我们需要更改Docker cgroup驱动,通过创建配置文件/etc/docker/daemon.json并添加以下行:
vi /etc/docker/daemon.json

{“exec-opts”: [“native.cgroupdriver=systemd”]}

cgroup drive 区别 k8s 的是 systemd docker 是cgroupfs 有什么区别

Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU、内存、block I/O和网络带宽。Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性。

systemd是系统自带的cgroup管理器, 系统初始化就存在的, 和cgroups联系紧密,为每一个进程分配cgroups, 用它管理就行了. 如果设置成cgroupfs就存在2个cgroup控制管理器, 实验证明在资源有压力的情况下,会存在不稳定的情况.

cgroupfs是docker自带的。
cgroupfs是cgroup为给用户提供的操作接口而开发的虚拟文件系统类型,它和sysfs,proc类似,并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。可以向用户展示cgroup的hierarchy(等级制度),通知kernel用户对cgroup改动。
对cgroup的查询和修改都只能通过cgroupfs文件系统来进行。

cgroups 的全称是 Linux Control Groups,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO 等)

都是正确的,主要是docker和kubelet一定要统一

kubernetes为什么要修改使用systemd?

Kubernetes 现在推荐使用 systemd 来代替 cgroupfs
因为systemd是Kubernetes自带的cgroup管理器,负责为每个进程分配cgroups
但docker的cgroup driver默认是cgroupfs,这样就同时运行有两个cgroup控制管理器
当资源有压力的情况时,有可能出现不稳定的情况。

修改docker的cgroup driver为systemd
vi /etc/docker/daemon.json

增加

"exec-opts": ["native.cgroupdriver=systemd"]

demo:

{
"graph": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"]
}

修改完成后重启docker服务

systemctl restart docker
systemctl status docker
docker info
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西京刀客

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

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

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

打赏作者

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

抵扣说明:

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

余额充值