一、环境说明

1、简介

本文使用 CentOS 7.9 系统采用 1 个 master 加 2 个 node 的方式部署 k8s 1.27版本。仅作学习使用,不建议用于生产环境。

2、配置

节点 IP 地址 操作系统 配置
k8s-master 192.168.13.210 CentOS 7.9 2 核 2G 40G
k8s-node1 192.168.13.211 CentOS 7.9 2 核 2G 40G
k8s-node2 192.168.13.212 CentOS 7.9 2 核 2G 40G

二、集群搭建

1、主机名配置

k8s-master 节点主机名配置

1
hostnamectl set-hostname k8s-master --static

k8s-node1 节点主机名配置

1
hostnamectl set-hostname k8s-node1 --static

k8s-node2 节点主机名配置

1
hostnamectl set-hostname k8s-node2 --static

2、hosts 配置

配置本地域名解析,在三台节点都执行以下命令:

1
2
3
4
5
cat >>/etc/hosts <<EOF
192.168.13.210 k8s-master
192.168.13.211 k8s-node2
192.168.13.212 k8s-node1
EOF

3、防火墙配置

禁用防火墙,在三台节点都执行以下命令:

1
2
3
4
# 停止防火墙服务
systemctl stop firewalld.service
# 禁用防火墙开机自启动
systemctl disable firewalld.service

4、SELinux 配置

禁用 SELinux(安全增强的 Linux 内核模块),在三台节点都执行以下命令:

1
2
3
4
# 临时关闭selinux
setenforce 0
# 永久禁用selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

5、关闭 swap 分区

关闭 swap 交换分区,在三台节点都执行以下命令:

1
2
3
4
# 关闭所有已经启用的交换空间(swap)
swapoff -a
# 停止挂载 swap 交换空间
sed -i '/swap/s/^/#/g' /etc/fstab

6、修改内核参数

修改内核参数,在三台节点都执行以下命令:

1
2
3
4
5
6
7
8
9
# 在 /etc/sysctl.d/ 创建 k8s.conf 文件,并添加参数
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 重新加载 /etc/sysctl.d 目录下的所有配置文件,以应用新的参数设置。
sysctl --system

这些参数的含义如下:

  • net.bridge.bridge-nf-call-ip6tables = 1:启用 IPv6 数据包的网络地址转换(NAT)功能。
  • net.bridge.bridge-nf-call-iptables = 1:启用 IPv4 数据包的网络地址转换(NAT)功能。
  • net.ipv4.ip_forward = 1:启用 IP 转发功能,允许将网络流量从一个网络接口转发到另一个网络接口。

7、安装依赖

安装基础依赖,在三台节点都执行以下命令:

1
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git yum-utils device-mapper-persistent-data lvm2 psmisc net-tools

8、加载IPVS内核模块

加载 IPVS 内核模块,在三台节点都执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 配置在系统启动时加载IPVS相关内核模块
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
nf_conntrack_ipv4
EOF

# 立即启动 systemd-modules-load.service 服务
systemctl enable --now systemd-modules-load.service

# 验证内核模块是否启用,输出相关内容则代表启用成功
lsmod |egrep "ip_vs|nf_conntrack_ipv4"

9、加载 overlay 模块和 br_netfilter 模块

加载 overlay 内核模块和 br_netfilter 内核模块,在三台节点都执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
# 创建 containerd.conf 文件
cat >>/etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF

# 加载 overlay 模块和 br_netfilter 模块
modprobe overlay
modprobe br_netfilter

# 验证内核模块是否启用,输出相关内容则代表启用成功
lsmod | egrep 'overlay|br_netfilter'

10、安装容器环境

安装容器环境,可以使用 cri-docker 或 containerd.io ,这里安装安装 docker,在三台节点都执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 添加 repo 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 安装 docker
yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

#修改docker的Cgroup Driver为systemd,并配置镜像加速
cat > /etc/docker/daemon.json << EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
]
}
EOF

# 启动并开机自启动 docker
systemctl daemon-reload
systemctl start docker
systemctl enable docker

11、安装 cri-dockerd

Mirantis/cri-dockerd (github.com) 下载最新版rpm包

1
2
3
4
5
6
# 下载 cri-dockerd rpm包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm

# 启动并开机自启动 cri-dockerd
systemctl daemon-reload && systemctl enable cri-docker.socket
systemctl start cri-docker.socket cri-docker

12、安装 kubelet kubeadm kubectl

kubelet kubeadm kubectl 介绍

  • kubeadm :官方社区推出的一个用于快速部署 kubernetes 集群的工具。
  • kubectl :Kubernetes 集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署。
  • kubelet :运行在所有节点上,用来启动 Pod 和容器等。

安装 kubelet kubeadm kubectl,在三台节点都执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 配置 repo 源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

# 生成缓存
yum makecache

# 如果指定版本可以使用以下命令进行可用版本查看
yum list kubelet --showduplicates
# 安装指定版本示例
yum -y install kubectl-1.27.1 kubelet-1.27.1 kubeadm-1.27.1

# 安装最新版 kubelet kubeadm kubectl
yum install -y kubelet kubeadm kubectl

# 修改 kubectl 的 cgroup driver使用 systemd
cat > /etc/sysconfig/kubelet << EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF

启动并开机自启动 kubelet
systemctl enable kubelet
systemctl start kubelet

三、集群搭建

1、初始化集群

在 k8s-master 节点初始化集群,参数如下:

1
2
3
4
5
6
7
8
# 初始化集群
kubeadm init --kubernetes-version=1.27.3 \
--apiserver-advertise-address=192.168.13.210 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=172.16.0.0/16
--service-cidr=10.96.0.0/12 \
--ignore-preflight-errors=all \
--cri-socket unix:///var/run/cri-dockerd.sock
  • --kubernetes-version : 用于指定 kubernetes 版本号。
  • --apiserver-advertise-address : 用于指定 Master 节点 IP 地址。
  • --image-repository : 由于kubeadm 默认从官网k8s.grc.io下载所需镜像,国内无法访问,因此需要通过–image-repository指定阿里云镜像仓库地址。
  • --pod-network-cidr : 指定 pod的网段,网段可以自定义,不冲突即可。
  • --service-cidr=10.96.0.0/12: 指定服务网络的 CIDR。这个 CIDR 范围将用于分配给 Kubernetes 服务的 IP 地址。
  • --ignore-preflight-errors=all: 忽略预检错误。这个选项将忽略在运行 kubeadm init 前的预检过程中出现的所有错误。
  • --cri-socket unix:///var/run/cri-dockerd.sock: 指定容器运行时的套接字文件路径。这里表示使用 Docker 作为容器运行时。

初始化成功后,会出现以下信息,接下来按照以下信息操作即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.13.210:6443 --token thurv8.47648ymwn035lymx \
--discovery-token-ca-cert-hash sha256:9fed63c05d4f8fb503f00efef5179d444465fd208ccd48a7b803ee3c414f48fc

2、初始化配置

在 k8s-master 节点根据不同用户配置集群,普通用户配置如下:

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

root 用户配置如下:

1
export KUBECONFIG=/etc/kubernetes/admin.conf

3、网络配置 - flannel

配置集群网络,在 k8s-master 节点配置网络,这里使用的网络组件为 flannel 。

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

4、node节点加入集群

在 2 个 k8s-node 节点分别加入集群操作,加入集群命令在第一步初始化集群生成。如果需要cri-socket添加 --cri-socket unix:///var/run/cri-dockerd.sock

1
2
kubeadm join 192.168.13.210:6443 --token thurv8.47648ymwn035lymx \
--discovery-token-ca-cert-hash sha256:9fed63c05d4f8fb503f00efef5179d444465fd208ccd48a7b803ee3c414f48fc

加入成功后会出现以下信息

1
2
3
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.

如果初始化的 token 不小心清空了,可以通过如下命令获取或者重新申请

1
2
3
4
5
6
7
8
9
# 如果 token 已经过期,就重新申请
kubeadm token create

# token 没有过期可以通过如下命令获取
kubeadm token list

# 获取 --discovery-token-ca-cert-hash 值,得到值后需要在前面拼接上 sha256:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'

5、验证集群状态

在 k8s-master 节点,查看所有节点信息进行验证

1
kubectl get nodes

三个节点 STATUS 为 Ready,说明集群搭建成功,这个过程略慢。

6、配置 tab 补全命令(可选)

安装bash-completion

1
yum install bash-completion -y

执行bash_completion

1
source /usr/share/bash-completion/bash_completion

配置开机加载

1
2
3
4
5
6
cat >> .bashrc << EOF
source <(kubectl completion bash)
source <(kubeadm completion bash)
EOF

source .bashrc

到此就可以用 tab 键补全 kubectlkubeadm 命令了。