RHEL8系统安装Kubernetes(k8s)集群

kubernetes,简称K8s,中间的8表示kubernetes中间的8个字符“ubernete”,也有说是kubernetes的谐音。
K8s是一个开源的、可移槙的容器编排平台,用于管理云平台中多个主机上的容器化的应用,其目标是让部署容器化的应用简单并且高效,K8s提供了应用部署,规划,更新,维护的机制。

一、部署说明

以下部署环境为3台VMware Workstation虚拟机,3台虚拟机连接模式为NAT,均可连接Internet。

主机名 操作系统 IP地址 备注
k8s-master RHEL 8 192.168.18.188 要求CPU不少于2个
k8s-node1 RHEL 8 192.168.18.100
k8s-node2 RHEL 8 192.168.18.200

注意:以下骤1到6应该同时应用于master、node1和node2

二、部署过程

步骤1 禁用交换内存
因为内存交换会导致不稳定和性能下降,因此,Kubernetes要求在主机系统上禁用交换内存以获得最佳性能。执行以下命令禁用交换内存swap:

[root@master ~]# swapoff -a

同时编辑/etc/fstab,将swap所在行注释掉,确保重启系统后仍然有效。

[root@master ~]# vim /etc/fstab 
……此处省略文件原有内容……
#/dev/mapper/rhel-swap   none                    swap    defaults        0 0

步骤2 禁用SELinux
建议禁用SELinux,以允许容器可以读取主机文件系统。

修改/etc/selinux/config文件,将SELINUX设置为permissive或者disabled,确保重启系统后仍然有效。

[root@master ~]# setenforce 0
[root@master ~]# vim /etc/selinux/config 
……此处省略文件原有内容……
SELINUX=permissive
……此处省略文件原有内容……

步骤3 配置主机名称与IP地址的映射关系
编辑/etc/hosts配置文件。

[root@master ~]# vim /etc/hosts
……此处省略文件原有内容……
192.168.18.188 k8s-master
192.168.18.100 k8s-node1
192.168.18.200 k8s-node2

步骤4 配置firewalld防火墙
为了在master和各node之间进行通信,需要配置防火墙并允许一些相关的端口和服务。

在master上,允许6443,2379-2380,10250-10252端口,执行命令如下:

[root@master ~]# firewall-cmd --permanent --add-port={6443,2379-2380,10250-10252}/tcp
[root@master ~]# firewall-cmd --reload

在各node上,允许10250和30000-32767端口,执行命令如下:

[root@node1 ~]# firewall-cmd --permanent --add-port={10250,30000-32767}/tcp
[root@node1 ~]# firewall-cmd --reload

步骤5 安装容器运行时
Kubernetes需要容器运行时(Container Runtime Interface,CRI)的支持,官方支持的CRI包括Docker、Containerd和CRI-O等,但自Kubernetes1.24版本开始就抛弃了docker,这里以安装部署Containerd为例,具体操作过程如下:

可提前从https://github.com/containerd/containerd/releases下载最新版本。

#下载containerd压缩包
[root@node2 ~]# wget https://github.com/containerd/containerd/releases/download/v1.6.8/cri-containerd-1.6.8-linux-amd64.tar.gz

#解压压缩包
[root@node2 ~]# tar xzvf cri-containerd-1.6.8-linux-amd64.tar.gz -C /

#创建配置文件目录
[root@node2 ~]# mkdir -p /etc/containerd 

#生成默认配置文件
[root@node2 ~]# containerd config default > /etc/containerd/config.toml

#由于国内很难访问k8s.gcr.io,故这里使用阿里云镜像仓库
[root@node2 ~]# sed -i 's/k8s.gcr.io/registry.cn-beijing.aliyuncs.com\/abcdocker/' /etc/containerd/config.toml

# 配置systemd作为容器的cgroup driver
[root@node2 ~]# sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/' /etc/containerd/config.toml

# 启动和查看conainerd服务状坊
[root@node2 ~]# systemctl enable containerd
[root@node2 ~]# systemctl start containerd
[root@node2 ~]# systemctl status containerd

# 查看客户端和服务器端版本
[root@server ~]# ctr version
Client:
  Version:  v1.6.8
  Revision: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
  Go version: go1.17.13

Server:
  Version:  v1.6.8
  Revision: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
  UUID: 50123b11-f3ca-421c-ad0b-918c0a1f0745

步骤6 安装Kubernetes包
完成上述准备工作之后,现在就可以开始安装Kubernetes软件包,包括kubelet、kubeadm 和kubectl。

若RHEL8未注册,则需要利用RHEL8安装ISO镜像文件创建好本地软件仓库,否则在安装Kubernetes软件包时会提示以下错误:

问题 1: 无法为该任务安装最佳候选
  - 没有东西可提供 socat(kubelet-1.25.2-0.x86_64 需要)
  - 没有东西可提供 conntrack(kubelet-1.25.2-0.x86_64 需要)
 问题 2: 软件包 kubeadm-1.25.2-0.x86_64 需要 kubelet >= 1.19.0,但没有提供者可以被安装

RHEL8本地软件仓库配置文件如下:

[root@server ~]# vim /etc/yum.repos.d/local.repo 
[AppStream-local]
name= local Appstream
baseurl=file:///media/rhel8iso/AppStream
enabled=1
gpgcheck=0
[BaseOS-local]
name= local BaseOS
baseurl=file:///media/rhel8iso/BaseOS
enabled=1
gpgcheck=0

接下来还要配置Kubernetes的yum源配置文件(这里使用国内阿里源),命令如下:

[root@master ~]# vim /etc/yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl

保存配置文件,然后就可以指定使用Kubernetes软件仓库安装并启动k8s了,安装完成后启动kubelet服务,执行命令如下:

注:node主机上无须安装kubectl,只要安装kubelet和kubeadm即可。

[root@master ~]# dnf clean all
[root@master ~]# dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@master ~]# systemctl start kubelet
[root@master ~]# systemctl enable kubelet

步骤7 创建Kubernetes集群(该步聚在master上完成
在初始化K8S前,还要启动overlay和br_netfilter两个关键内核模块,启用这两个关键内核模块的过程如下:

(1)创建模块配置文件,并添加以下两行内容:

[root@master ~]# vim /etc/modules-load.d/k8s.conf
overlay
br_netfilter

(2)加载模块

使用modprobe命令加载两个模块,执行命令如下:

[root@master ~]# modprobe overlay
[root@master ~]# modprobe br_netfilter

(3)创建关于网桥的sysctl配置文件,并添加如下三行内容:

[root@master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-ip6tables=1

(4)确认应用

完成上述配置后,执行以下命令确认和应用配置:

[root@master ~]# sysctl --system
……此处省略部分输出信息……
* Applying /etc/sysctl.d/k8s.conf ...
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
* Applying /etc/sysctl.conf ...

完成上述步骤后,就可以初始化K8S集群了,执行命令如下所示,初始化master中的控制面板,该过程可能需要稍候片刻:

[root@master ~]# kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16
[init] Using Kubernetes version: v1.25.3
[preflight] Running pre-flight checks
……此处省略部分输出信息……
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.18.188:6443 --token kkaisz.m9gpjxu8khwhd2bl \
	--discovery-token-ca-cert-hash sha256:a36bf24fcacf41bd4d1a2980e4a293e3804ec25cde1cad20ca71d2b20ae2483d 

Tips:如果提示以下错误,请执行【kubeadm reset】命令,然后重启系统后再执行上述初始化k8s的命令即可。

……此处省略前面的部分输出……
[kubelet-check] Initial timeout of 40s passed.
[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 [::1]:10248: connect: connection refused.
……此处省略其它相似的错误输出……

成功初始化控制面板后,还需要按提示执行3条额外命令才能开始使用集群,按图中提示,按顺序执行以下3条命令:

[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config

在上图输出信息的最后面,还提示了在各个node主机上加入集群的命令,后面需要用到,这里暂且不提。

步骤8 安装Calico Pod网络插件
接下来建议安装容器网络接口Calico,它是一个开源项目,用于提供容器网络和安全性。安装Calico后,节点状态才会变为Ready状态,集群内的DNS服务才能正常运行,容器才可以开始相互通信。

Calico提供与现有Kubernetes工作负载的可扩展性、高性能和互操作性,它可以部署在本地和流行的云技术上,例如Google Cloud、AWS和Azure。

master主机上,执行以下命令安装Calico:

[root@master ~]# kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
namespace/tigera-operator created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
……此处省略后续输出信息……
[root@master ~]# kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
installation.operator.tigera.io/default created
apiserver.operator.tigera.io/default created

然后执行以下命令确认pod 是否已启动,确认每个pod都是“READY”并且具有“RUNNING”状态,如下图第3列所示:

[root@master ~]# watch kubectl get pods -n calico-system
Every 2.0s: kubectl get pods -n calico-system                                                                            k8s-master: Wed Oct 19 18:52:24 2022

NAME                                       READY   STATUS              RESTARTS   AGE
calico-kube-controllers-85666c5b94-x4m56   0/1     ContainerCreating   0          70s
calico-node-2bm59                          0/1     Init:1/2            0          71s
calico-typha-6c467fc4d6-v6kt4              1/1     Running             0          71s
csi-node-driver-h595r                      0/2     ContainerCreating   0          70s

还可以执行以下命令验证集群中master节点的可用性:

[root@master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   44m   v1.25.2

以上输出确认master主机节点已准备就绪。最后还可以执行以下命令检查pod命名空间:

[root@master ~]# kubectl get pods --all-namespaces
NAMESPACE     NAME                                 READY   STATUS    RESTARTS      AGE
kube-system   coredns-c676cc86f-m7kml              1/1     Running   0             38m
kube-system   coredns-c676cc86f-pscdt              1/1     Running   0             38m
kube-system   etcd-k8s-master                      1/1     Running   0             38m
kube-system   kube-apiserver-k8s-master            1/1     Running   0             38m
kube-system   kube-controller-manager-k8s-master   1/1     Running   1 (38m ago)   38m
kube-system   kube-proxy-627sc                     1/1     Running   0             38m
kube-system   kube-scheduler-k8s-master            1/1     Running   0             38m

步骤9 将node主机节点添加到集群(此步操作在各node主机上完成)

确保所有node主机均已按照上述步骤1到步骤 6进行配置,然后执行在第7步部署集群时输出信息中的提示命令将node主机加入集群的命令。

当添加多个node主机到集群时,需要在提示命令中指定--cri-socket参数 ,否则会出现以下错误提示:

Found multiple CRI endpoints on the host. Please define which one do you wish to use by setting the 'criSocket' field in the kubeadm configuration file: unix:///var/run/containerd/containerd.sock, unix:///var/run/crio/crio.sock
[root@node2 ~]# kubeadm join 192.168.18.188:6443 --token kkaisz.m9gpjxu8khwhd2bl --discovery-token-ca-cert-hash sha256:a36bf24fcacf41bd4d1a2980e4a293e3804ec25cde1cad20ca71d2b20ae2483d --cri-socket unix:///var/run/containerd/containerd.sock
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
……此处省略部分输出信息……
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

步骤10 查验集群节点

返回到master主机,再次查验集群中的节点,若所有node主机均出现在集群中的节点列表中,则k8s集群部署成功。

[root@master /]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   15m   v1.25.2
k8s-node1    Ready              98s   v1.25.2
k8s-node2    Ready              11m   v1.25.2

你可能感兴趣的:(RHEL,Linux运维,CentOS,Linux运维,kubernetes,docker,java)