Kubeadm 部署 Kubernetes
一、环境说明
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 节点主机名配置
hostnamectl set-hostname k8s-master --static
k8s-node1 节点主机名配置
hostnamectl set-hostname k8s-node1 --static
k8s-node2 节点主机名配置
hostnamectl set-hostname k8s-node2 --static
2、hosts 配置
配置本地域名解析,在三台节点都执行以下命令:
cat >>/etc/hosts <<EOF
192.168.13.210 k8s-master
192.168.13.211 k8s-node2
192.168.13.212 k8s-node1
EOF
3、防火墙配置
禁用防火墙,在三台节点都执行以下命令:
# 停止防火墙服务
systemctl stop firewalld.service
# 禁用防火墙开机自启动
systemctl disable firewalld.service
4、SELinux 配置
禁用 SELinux(安全增强的 Linux 内核模块),在三台节点都执行以下命令:
# 临时关闭selinux
setenforce 0
# 永久禁用selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
5、关闭 swap 分区
关闭 swap 交换分区,在三台节点都执行以下命令:
# 关闭所有已经启用的交换空间(swap)
swapoff -a
# 停止挂载 swap 交换空间
sed -i '/swap/s/^/#/g' /etc/fstab
6、修改内核参数
修改内核参数,在三台节点都执行以下命令:
# 在 /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、安装依赖
安装基础依赖,在三台节点都执行以下命令:
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 内核模块,在三台节点都执行以下命令:
# 配置在系统启动时加载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 内核模块,在三台节点都执行以下命令:
# 创建 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,在三台节点都执行以下命令:
# 添加 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包
# 下载 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,在三台节点都执行以下命令:
# 配置 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 节点初始化集群,参数如下:
# 初始化集群
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 作为容器运行时。
初始化成功后,会出现以下信息,接下来按照以下信息操作即可:
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 节点根据不同用户配置集群,普通用户配置如下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root 用户配置如下:
export KUBECONFIG=/etc/kubernetes/admin.conf
3、网络配置 - flannel
配置集群网络,在 k8s-master 节点配置网络,这里使用的网络组件为 flannel 。
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
kubeadm join 192.168.13.210:6443 --token thurv8.47648ymwn035lymx \
--discovery-token-ca-cert-hash sha256:9fed63c05d4f8fb503f00efef5179d444465fd208ccd48a7b803ee3c414f48fc
加入成功后会出现以下信息
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 不小心清空了,可以通过如下命令获取或者重新申请
# 如果 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 节点,查看所有节点信息进行验证
kubectl get nodes
三个节点 STATUS 为 Ready,说明集群搭建成功,这个过程略慢。
6、配置 tab 补全命令(可选)
安装bash-completion
yum install bash-completion -y
执行bash_completion
source /usr/share/bash-completion/bash_completion
配置开机加载
cat >> .bashrc << EOF
source <(kubectl completion bash)
source <(kubeadm completion bash)
EOF
source .bashrc
到此就可以用 tab
键补全 kubectl
和 kubeadm
命令了。