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(最后也是将镜像直接放到服务器中)
注意,主节点和从节点并不会共享镜像,所以加入从节点时也要将镜像复制一份过去