Kubernetes搭建(单节点)

Kubernetes1.27搭建(单节点)

安装集群版本为1.27.2

安装kubernetes工具

这里使用的是centos系统,其他redhat等相同,根据自己的实际环境来操作

根据kubernetes官网,使用官方的指定的repo源,下载kubernetes工具,这里官网指定的配置源为google的镜像源。在国内无法访问(可以通过其他方式解决例如配置代理),也可以使用阿里云的kubernetes的镜像源或者自己找到rpm包做yum源(将依赖和要安装的rpm放在同一目录下使用rpm -Uvh *.rpm 也可),下载的kubernetes组件的版本正确即可。

[root@localhost ~]# vim /etc/yum.repos.d/kubernetes.repo

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
下载kubernetes组件,默认是最新版,所以这里需要指定版本。

[root@localhost ~]# yum install kubeadm-1.27.2 kubectl-1.27.2 kubelet-1.27.2 -y

  • #确保下载版本为最新版工具。

转发ipv4流量并让iptables看到桥接流量

所有节点都需要将sysctl所需的配置写入

[root@localhost ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
#然后使其生效
[root@localhost ~]# modprobe br_netfilter
[root@localhost ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

关闭交换分区,设置时间同步

为确保kubernetes性能,所有节点都需要关闭交换分区,注释掉交换分区。


[root@localhost ~]# swapoff -a
[root@localhost ~]# vim /etc/fstab

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=8c9ec778-e898-4be6-bda9-1600ceee752c /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

配置时间同步关闭防火墙
再部署kubernetes集群的时候需要进行时间同步,确保各节点时间的一致性,以确保集群运行中各种时间的顺序正确。例如,在使用kubelet定期检查容器运行状态时,如果时间不一致可能会导致容器内容出现错误。

systemctl stop firewalld
setenforce 0
#上面关闭防火墙,或者开放端口,保证网络连接。
 
[root@localhost ~]# vim /etc/chrony.conf
server (ntp服务器ip) iburst
allow all
local stratum 10
#添加上面配置
[root@localhost ~]# systemctl restart chronyd
[root@localhost ~]# chronyc sources
#上面配置主节点时间同步公网,允许其他节点同步,这里要保持联网多次同步直到出现*号代表同步成功。

[root@localhost ~]# vim /etc/chrony.conf
server 192.168.40.20 iburst
[root@localhost ~]# systemctl restart chronyd
[root@localhost ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.40.20                2   6    17    23    -20us[  -24us] +/-   65ms
#上面是其他从节点配置同步主节点

开启ipvs

不开启ipvs将会使用iptables,但是效率低,所以官网推荐开启ipvs。ipvs相比iptables将会有更高的服务可靠性和性能。如果不开启无需配置此步骤。

1,支持更多的协议:kubernetes默认的负载均衡方式时iptables,虽然简单易用,但只是支持TCP/UDP协议。而IPVS不仅支持TCP/UDP,还支持SCTP,TCP+SSL等多种协议。
2,与iptables只支持轮询方式不同,IPVS提供了更多钟负载均衡算法,包括轮询,加权轮询等,使得负载均衡更加精细化和灵活。
3,提高服务性能和可靠性:使用 IPVS 能够有效地提高服务的性能和可靠性。使用 IPVS 可以在各个节点上动态地将请求转发到可用的 Pod 上,避免单节点故障影响整个服务的问题。
4,降低延迟和网络带宽:使用 IPVS 可以减少 Kubernetes 集群中的网络带宽和延迟,因为请求只需要在节点之间进行转发,而不需要跨节点的通信。

这是在centos中开启ipvs的脚本,该脚本将会在系统启动时自动加载,并使用modprobe加载ipvs的必需模块,需要在每个节点中配置。

[root@localhost ~]# yum install ipset ipvsadm -y   #用rpm包安装亦可

[root@localhost ~]# vim /etc/sysconfig/modules/ipvs.modules
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

[root@localhost ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules
[root@localhost ~]# bash /etc/sysconfig/modules/ipvs.modules

自启动kubelet

[root@master ~]# systemctl enable kubelet
Created symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /usr/lib/systemd/system/kubelet.service.

安装底层容器

根据官方的说法,现在还想使用docker作为kubernetes底层容器,需要cri-dockerd来将docker engine与kubernetes集成,下面会说明。

Docker Engine
Docker Engine 是一款用于构建和运行容器化应用程序的软件。它具有以下特点:

1,简单易用:Docker Engine 提供了一个简单的命令行接口,可以方便地创建、启动、停止和删除容器。
2,轻量级:Docker Engine 容器非常轻量级,可以在几毫秒内启动和停止。
3,可移植性:Docker Engine 容器可以在不同的平台上运行,包括物理机、虚拟机和云环境。
4,可扩展性:Docker Engine 支持通过容器编排工具(如 Kubernetes、Docker Compose 等)进行自动化容器部署、管理和扩缩容等操作。
5,安全性:Docker Engine 提供了一系列安全措施,包括容器隔离、镜像签名和加密等,以确保容器的安全性和稳定性。

Docker Engine和Docker的区别

1,Docker Engine 是 Docker 的核心组件,是用于构建和运行容器化应用程序的基础平台。而普通的 Docker(也称为 Docker 客户端)则是用于与 Docker Engine 进行交互的命令行工具。
2,Docker Engine 包含了 Docker 客户端的所有功能,并且还提供了一系列 API 接口来简化容器管理、镜像管理和网络管理等操作。因此,Docker Engine 更加强大和灵活,可以被用作构建自动化容器化部署和持续集成/持续部署(CI/CD)的基础设施。
3,Docker Engine 可以安装在不同的操作系统上,包括 Linux、Windows 和 macOS 等,而普通的 Docker 则通常只支持运行在 Linux 操作系统上。

安装Docker

在线安装请看Docker安装(在线)

方法可以参照安装Harbor仓库,此处我们采用rpm包安装方式,安装完记得启动

systemctl enable docker --now

修改cgroup方式

/etc/docker/daemon.json 默认没有此文件,需要单独创建,在/etc/docker/daemon.json添加如下内容

cat > /etc/docker/daemon.json << EOF
{
        "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

# systemctl restart docker

为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"

安装cri-dockerd

先前说过Docker 本身是一个容器运行时(Container Runtime),它负责管理容器的生命周期,包括创建、启动、停止和销毁等操作。然而,Docker 运行时在设计上并不符合 Kubernetes 等容器编排工具的要求,因此需要使用 CRI(Container Runtime Interface)来与容器编排工具进行交互。

根据kubernetes官网给出的方法,使用源代码仓库中说明的方式进行部署。

在官方的仓库中获取最新版本的软件包,然后继续执行以下步骤。这里使用的时cri-dockerd0.3.3的版本,记得每个节点都要配置。https://github.com/Mirantis/cri-dockerd/tags

rpm包安装即可,需要修改一下cri-docker.service文件

vim /usr/lib/systemd/system/cri-docker.service
在service文件中添加
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.k8s.io/pause:3.9
#一般指定pause设定在kubelet的配置当中,kubelet会在创建pod前拉取pause镜像,并缓存它后续使用。
#将此参数放在kubelet中更加常见,但是在某些情况下也会将参数配置在cri-dockerd中,例如当使用自定义的cri运行时。

[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl enable cri-docker --now
Created symlink from /etc/systemd/system/multi-user.target.wants/cri-docker.service to /etc/systemd/system/cri-docker.service

指定kubeadm默认cri

当docker和cri-docker一起安装的时候,docker默认自带containerd的cri所以会导致kubeadm识别到两个cri,每次使用kubeadm都需要指定一下cri,所以干脆修改kubeadm配置文件,使其本身就使用其中一个cri。

找到10-kubeadm.conf配置文件,然后修改配置文件。

[root@master ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
Environment="KUBELET_EXTRA_ARGS=--container-runtime= unix:///run/cri-dockerd.sock"
#添加上面一行内容,sock文件路径根据实际环境设置。
[root@master ~]# systemctl daemon-reload
[root@master ~]# systemctl restart kubelet

获取kubernetes镜像(主节点)

根据官网的说法,使用kubeadm工具,获取部署kubernetes集群所需镜像。需要先配置自己的镜像仓库(也可以直接将镜像打包加载)!

[root@node2 images]# kubeadm config images list
W0427 10:30:29.946236   17852 images.go:80] could not find officially supported version of etcd for Kubernetes v1.27.2, falling back to the nearest etcd version (3.5.7-0)
registry.k8s.io/kube-apiserver:v1.27.2
registry.k8s.io/kube-controller-manager:v1.27.2
registry.k8s.io/kube-scheduler:v1.27.2
registry.k8s.io/kube-proxy:v1.27.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.7-0
registry.k8s.io/coredns/coredns:v1.10.1
#然后拉取镜像,这里需要指定cri,因为docker底层有containerd,现在还安装了cri
#当有多个cri的时候kubernetes要求指定其中一个cri,没指定cri报错的时候会告知cri路径。
[root@localhost ~]# kubeadm config images pull --cri-socket= unix:///run/cri-dockerd.sock

此处我选择用一台可以连外网的机器,配置阿里加速源,并指定本地Harbor仓库(不指定端口push时会被加上docker.io/)

[root@download ~]# vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://registry.cn-qingdao.aliyuncs.com"],
    "insecure-registries": ["http://harbor:80"]
}

[root@download ~]# docker login https://registry.cn-qingdao.aliyuncs.com

直接加载tar文件包的话也可以,还不用改标签

#!/bin/bash
for i in `ls *.tar`;do
	docker load -i $i
done

初始化yaml/yml文件(主节点)

# kubeadm config print init-defaults > init.yml
# vim init.yml

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.40.10		#改为自己IP
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/cri-dockerd.sock		#改为cri-docker的sock
  imagePullPolicy: IfNotPresent
  name: master 								#注意主机名
  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.k8s.io		#可以不改,将本地的镜像标签改为这个即可
kind: ClusterConfiguration
kubernetesVersion: 1.27.2				#版本号对应上
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16				#pod的IP分配
scheduler: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

然后执行初始化命令

kubeadm init --config=init.yml  | tee kubeadm-init.log
#如果出错了就重置,然后重新构建集群 :
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
#因为docker的containerd-cri会和cri-dockerd冲突,所以需要指定。
#如果已经修改了kubeadm配置文件请忽略指定cri的步骤
后续的join命令也要指定   --cri-socket=unix:///var/run/cri-dockerd.sock

在master节点上执行以下命令以使用kubectl命令

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

其余节点也可以拷贝过去执行

kubernetes命令行补全
(前提)安装了bash-completion-extras
执行 source 命令
source /usr/share/bash-completion/bash_completion
如果想让系统中的所有用户都能拥有命令补全的功能,则执行如下命令
kubectl completion bash | sudo tee /etc/bash_completion.d/kubectl > /dev/null
如果只需要当前用户拥有命令自动补全功能,则执行如下命令
此命令导入 bash 自动补全的命令

echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

安装网络插件(calico)

https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/tigera-operator.yaml
https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/custom-resources.yaml

下载下来再用kubectl create -f 依次创建
kubectl create -f tigera-operator.yaml
kubectl create -f custom-resources.yaml
# custom-resources文件的网络域需要与前面初始化的pod域相同
卡在了docker pull docker.io/calico/pod2daemon-flexvol:v3.25.1(最后也是将镜像直接放到服务器中)

注意,主节点和从节点并不会共享镜像,所以加入从节点时也要将镜像复制一份过去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值