K8s-kubeadmin 1.28 安装指南

一、K8s 集群部署环境准备

1.1 环境架构(IP 已调整)

IP 地址主机名操作系统Kubelet 版本节点用途
172.16.0.100master01CentOS 7.9.2009v1.28.2管理节点(Control Plane)
172.16.0.10node01CentOS 7.9.2009v1.28.2工作节点(Worker Node)
172.16.0.11node02CentOS 7.9.2009v1.28.2工作节点(Worker Node)

1.2 配置主机名与主机映射(所有节点执行)

1.2.1 设置主机名

根据节点角色执行对应命令,确保主机名与架构一致:

  • master01 节点:hostnamectl set-hostname master01
  • node01 节点:hostnamectl set-hostname node01
  • node02 节点:hostnamectl set-hostname node02
1.2.2 配置主机映射

将节点 IP 与主机名绑定,避免依赖外部 DNS,执行以下命令:

cat >> /etc/hosts << EOF
172.16.0.100 master01
172.16.0.10 node01
172.16.0.11 node02
EOF

1.3 关闭防火墙与 SELinux(所有节点执行)

K8s 集群内部通信需关闭防火墙与 SELinux(增强安全策略),避免端口拦截或权限限制:

# 关闭并禁用防火墙(永久生效)
systemctl stop firewalld.service
systemctl disable firewalld.service

# 临时关闭 SELinux(当前会话生效)
setenforce 0 
# 永久关闭 SELinux(重启后生效)
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

1.4 关闭 Swap 分区(所有节点执行)

Swap 分区会影响 K8s 对节点资源的调度,需禁用:

# 临时关闭 Swap(当前会话生效)
swapoff -a
# 永久关闭 Swap(注释 Swap 挂载项,重启后生效)
sed -i '/swap/s/^/#/g' /etc/fstab

#集合版
systemctl stop firewalld&&systemctl disable firewalld&&setenforce 0&&sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config&&swapoff -a&&sed -ri 's/.*swap.*/#&/' /etc/fstab
#验证,/etc/fstab中swap那一行应该被注释,如果没有,手动添加。
cat /etc/fstab

1.5 配置内核参数(所有节点执行)

配置 K8s 所需的内核参数(开启 IP 转发、网桥过滤等):

# 创建内核参数配置文件
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1  # 开启 IPv6 网桥过滤
net.bridge.bridge-nf-call-iptables = 1   # 开启 IPv4 网桥过滤
net.ipv4.ip_forward = 1                  # 开启 IP 转发
EOF
====================================================================================
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
# 加载内核参数(立即生效)
sysctl --system

1.6 安装 IPVS 相关工具(所有节点执行)

K8s 推荐使用 IPVS 模式实现 Service 负载均衡,需安装工具并加载内核模块:

# 安装依赖工具
yum -y install conntrack ipvsadm ipset jq iptables curl sysstat libseccomp wget net-tools git

# 配置 IPVS 内核模块(开机自动加载)
cat > /etc/modules-load.d/ipvs.conf << EOF
# Load IPVS at boot(开机加载 IPVS 相关模块)
ip_vs
ip_vs_rr        # 轮询调度算法
ip_vs_wrr       # 加权轮询调度算法
ip_vs_sh        # 源哈希调度算法
nf_conntrack    # 连接跟踪模块
nf_conntrack_ipv4 # IPv4 连接跟踪模块
EOF
==============================================================================
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

# 立即加载模块并设置开机启动
systemctl enable --now systemd-modules-load.service

# 验证模块加载(出现 ip_vs 和 nf_conntrack_ipv4 相关输出即成功)
lsmod | egrep "ip_vs|nf_conntrack_ipv4"

1.7 安装 Containerd(所有节点执行)

Containerd 是 K8s 官方推荐的容器运行时(替代 Docker),需配置阿里源加速安装:

1.7.1 安装依赖与添加阿里 Docker 源
# 安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2

# 添加阿里 Docker 源(加速镜像下载)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.7.2 加载 Containerd 所需内核模块
# 配置模块开机加载
cat >> /etc/modules-load.d/containerd.conf << EOF
overlay
br_netfilter
EOF

# 立即加载模块
modprobe overlay
modprobe br_netfilter
1.7.3 安装并配置 Containerd
# 安装 Containerd(默认最新版)
yum -y install containerd.io

# 创建 Containerd 配置文件(生成默认配置)
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 修改配置:1. 启用 SystemdCgroup(适配 K8s 资源管理);2. 替换镜像源为阿里(加速)
sed -i '/SystemdCgroup/s/false/true/g' /etc/containerd/config.toml
sed -i '/sandbox_image/s/registry.k8s.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml
1.7.4 启动 Containerd
# 设置开机启动并立即启动
systemctl enable containerd
systemctl start containerd

# 验证状态(出现 active (running) 即成功)
systemctl status containerd

二、安装 kubectl、kubelet、kubeadm(所有节点执行)

kubeadm 用于初始化集群,kubelet 是节点核心组件,kubectl 是集群命令行工具,需统一安装 1.28.2 版本。

2.1 添加阿里 Kubernetes 源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

2.2 安装指定版本组件

# 查看 1.28 系列可用版本(可选,确认版本存在)
yum --showduplicates list kubelet | grep 1.28  (可选)

# 安装 1.28.2 版本(三者版本需一致)
yum -y install kubectl-1.28.2 kubelet-1.28.2 kubeadm-1.28.2

# 设置开机启动并立即启动 kubelet
systemctl enable kubelet
systemctl start kubelet

# 验证版本(出现 v1.28.2 即成功)
kubectl version --client
kubelet --version
kubeadm version

三、部署 Kubernetes 集群(仅 master01 节点执行)

3.1 初始化集群配置

3.1.1 查看初始化所需镜像(可选)

确认 K8s 1.28.2 初始化需拉取的镜像,提前拉取可避免初始化超时:

kubeadm config images list --kubernetes-version=v1.28.2

输出如下(已通过 Containerd 配置替换为阿里源):

registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1
3.1.2 创建初始化配置文件

创建 vim /tmp/kubeadm-init.yaml,指定集群 IP、镜像源、网段等核心配置(IP 已调整为 172.16.0.100):

cat > /tmp/kubeadm-init.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2  # 集群版本
controlPlaneEndpoint: 172.16.0.100:6443  # master 节点 IP:API 端口(6443 为 K8s 默认 API 端口)
imageRepository: registry.aliyuncs.com/google_containers  # 镜像源(阿里)
networking:
  podSubnet: 10.244.0.0/16  # Pod 网段(需与后续 Calico 网段一致)
  serviceSubnet: 10.96.0.0/16  # Service 网段(默认)

# 配置 kube-proxy 为 IPVS 模式
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF
==============================================================================
cat > /tmp/kubeadm-init.yaml << EOF
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.28.2
controlPlaneEndpoint: 172.16.0.100:6443  
imageRepository: registry.aliyuncs.com/google_containers  
networking:
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/16
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
EOF
3.1.3 初始化集群
# 执行初始化,--ignore-preflight-errors=all 忽略部分前置检查错误(如内核版本警告)
kubeadm init --config=/tmp/kubeadm-init.yaml --ignore-preflight-errors=all

关键输出保存:初始化成功后,会生成 工作节点加入命令,需复制保存(示例如下,实际以自身输出为准):

# 控制平面节点加入命令(可选,用于多 master 集群)
kubeadm join 172.16.0.100:6443 --token 0606nd.ouxz2yelf2ayzbts \
	--discovery-token-ca-cert-hash sha256:dc783bface432671755642818606cefbb6bc56345144a4d7be61a7fe5750e9f6 \
	--control-plane

# 工作节点加入命令(必须保存,用于 node01、node02 加入)
kubeadm join 172.16.0.100:6443 --token 0606nd.ouxz2yelf2ayzbts \
	--discovery-token-ca-cert-hash sha256:dc783bface432671755642818606cefbb6bc56345144a4d7be61a7fe5750e9f6
3.1.4 添加工作节点(仅 node01、node02 执行)

在 node01 和 node02 节点上,执行步骤 3.1.3 保存的 工作节点加入命令:

# node01、node02 节点执行(替换为自身初始化生成的命令)
kubeadm join 172.16.0.100:6443 --token kq3r2z.fmyp8jp31m74w6sq \
  --discovery-token-ca-cert-hash sha256:babe339bb09fe24d1d794be3d91cffeebb40f859ceb104ca286f9121412972de

3.2 配置 kubectl 命令(仅 master01 节点执行)

初始化后,需配置 kubectl 连接集群的权限:

# 普通用户配置(若使用 root,可跳过此步直接执行 export)
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.3 查看集群初始状态(仅 master01 节点执行)

# 查看节点状态(此时 master01 为 NotReady,因缺少网络插件)
kubectl get node

# 查看 Pod 状态(coredns 为 Pending,因无网络)
kubectl get pod -A

预期输出:master01 节点状态为 NotReady,kube-system 命名空间下 coredns Pod 状态为 Pending。

四、集群优化配置

4.1 开启 kubectl 命令补全(所有节点执行)

# 安装 bash-completion 依赖
yum -y install bash-completion

# 配置 kubectl 补全(永久生效,重启终端后生效)
echo "source <(kubectl completion bash)" >> /etc/profile

# 立即生效
source /etc/profile

4.2 安装 Nerdctl(所有节点执行)

Nerdctl 是 Containerd 的命令行工具,兼容 Docker 命令格式:

# 下载 Nerdctl 压缩包(v1.7.0 版本)
wget -q -c https://github.com/containerd/nerdctl/releases/download/v1.7.0/nerdctl-1.7.0-linux-amd64.tar.gz
#上传对应包
nerdctl-1.7.0-linux-amd64.tar.gz
# 解压到 /usr/local/bin(全局可执行)
tar xf nerdctl-1.7.0-linux-amd64.tar.gz -C /usr/local/bin

# 配置 Nerdctl 命令补全(永久生效)
echo "source <(nerdctl completion bash)" >> ~/.bashrc
source ~/.bashrc

# 验证(查看 K8s 集群内容器,需加 -n k8s.io)
nerdctl -n k8s.io ps

五、安装 Calico 网络插件(所有 节点执行)

K8s 需 CNI 网络插件实现 Pod 跨节点通信,推荐使用 Calico(性能优、支持网络策略)。

5.1 下载并修改 Calico 配置

# 下载 Calico 配置文件(v3.25 版本,适配 K8s 1.28)
wget https://docs.tigera.io/archive/v3.25/manifests/calico.yaml

上传本地包calico.yaml,calico-cni-v3.24.5.tar,calico-controllers-v3.24.5.tar,calico-node-v3.24.5.tar,dashboard-v2.7.0.tar,metrics-scraper-v1.0.8.tar

nerdctl -n k8s.io load -i calico-cni-v3.24.5.tar 
nerdctl -n k8s.io load -i calico-controllers-v3.24.5.tar
nerdctl -n k8s.io load -i calico-node-v3.24.5.tar
nerdctl -n k8s.io load -i dashboard-v2.7.0.tar
nerdctl -n k8s.io load -i metrics-scraper-v1.0.8.tar

5.2 部署 Calico

kubectl apply -f calico.yaml

# 查看 Calico 部署状态(所有 Calico Pod 为 Running 即成功)
kubectl get pod -n kube-system -l k8s-app=calico-node

5.3 验证集群状态(仅 master01 节点执行)

# 查看节点状态(master01 变为 Ready)
kubectl get node

# 查看所有 Pod 状态(coredns、calico 均为 Running)
kubectl get pod -A

六、安装 Kubernetes Dashboard(仅 master01 节点执行)

Dashboard 是 K8s 可视化管理工具,需修改配置开启 NodePort 访问。

6.1 下载并修改 Dashboard 配置

# 下载 Dashboard 配置文件(v2.7.0 版本)
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

本地上传recommended.yaml
# 修改配置,添加 NodePort 访问(便于外部浏览器访问)
vim recommended.yaml
#找到always,替换为IfNotPresent

6.2 部署 Dashboard

kubectl apply -f recommended.yaml

# 查看 Dashboard 状态(Pod 为 Running、Service 为 NodePort 即成功)
kubectl get pod,svc -n kubernetes-dashboard

6.3 创建管理员用户与 Token

Dashboard 默认无管理员权限,需创建 ServiceAccount 并绑定集群管理员角色:

6.3.1 创建管理员配置文件
cat > dashboard-admin.yaml << EOF
# 1. 创建 ServiceAccount(命名空间:kubernetes-dashboard)
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard

# 2. 绑定 ClusterRole(集群管理员角色)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin  # 集群管理员角色
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard

# 3. 创建 Secret(关联 ServiceAccount,生成 Token)
apiVersion: v1
kind: Secret
metadata:
  name: kubernetes-dashboard-admin
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin"  # 关联上述 ServiceAccount
type: kubernetes.io/service-account-token
EOF
==============================================================================
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kubernetes-dashboard
---
apiVersion: v1
kind: Secret
metadata:
  name: kubernetes-dashboard-admin
  namespace: kubernetes-dashboard
  annotations:
    kubernetes.io/service-account.name: "admin"
type: kubernetes.io/service-account-token
6.3.2 应用配置并获取 Token
# 应用配置
kubectl apply -f dashboard-admin.yaml

# 获取 Token(用于登录 Dashboard)
Token=$(kubectl -n kubernetes-dashboard get secret | awk '/kubernetes-dashboard-admin/ {print $1}')

kubectl describe secrets -n kubernetes-dashboard ${Token} | grep token | awk 'NR==NF {print $2}'
#复制出现的密钥(自己生成的)
eyJhbGciOiJSUzI1NiIsImtpZCI6IkV5SXdFWG9vbl94R2Z3NnBYN1lvMHRXMnV1QjVDNlNuZktQOWxvaU1XWTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC1hZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJhZG1pbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjUyNmJjOTAwLTQ2NGUtNDRmZC1hNjNiLTI2ODg4M2FkYWZiNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbiJ9.gQanRPJZ3xZAcWS_ioOYYv3flKStYbQ-wBlFlejmHslnhPvgMKLf5p2mdzuGab4WmYQcUMWjHmHL1tg8Y5DXkJWgWqgOxj2ML3y25fmEWEOMlK3qFzSexPY5QpqqeZ2g517kZMiFS1o3T8xHiAQT_SOa_SpbXg2dmZhw7ptEvjib9-6Zx3hEDNIMOZyhkMyzko4LKB8ASJ4VDh6tn6U4-ExmmWRYBHh0aNAAsH9DQiELitxmfXv0j2VxJ5wjtfw8k9tUqbst5qETwJHZag6_-Y1iIcoiGzEeJ9_2SH7MLd-D-myvYFpeJ_0NjG8mPTxzIr0PXMniZ3vEKQXSB-XhJA

6.4 访问 Dashboard

  1. 浏览器地址:https://172.16.0.100:30000(master 节点 IP + NodePort 30000)
  2. 安全提示处理:浏览器会提示“不安全连接”,选择“高级”→“继续访问”(自签名证书正常现象)
  3. 登录方式:选择“Token”,粘贴步骤 7.3.2 获取的 Token,点击“登录”
6.4.1 权限问题修复(若登录后无资源)

若登录后提示“无权限”或“找不到资源”,执行以下命令补充授权:

kubectl create clusterrolebinding serviceaccount-cluster-admin \
  --clusterrole=cluster-admin \
  --user=system:serviceaccount:kubernetes-dashboard:kubernetes-dashboard
#创建任务。  
kubectl create deployment nginx --image=nginx:1.14 --replicas=3
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐