一、环境准备
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
所有节点操作关闭防火墙、SELinux、swap
#关闭防火墙(简化网络配置)systemctl stop firewalld && systemctl disable firewalldsystemctl stop firewalldsystemctl disable firewalld#关闭 SELinux(避免权限干扰)setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/configsetenforce 0 # 临时关闭sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 永久关闭(重启生效)#关闭 swap 交换分区(K8s 要求)swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstabswapoff -a # 临时关闭sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久关闭(重启生效)
-
设置主机名 + Hosts 解析
hostnamectl set-hostname k8s-masterhostnamectl set-hostname k8s-node1hostnamectl set-hostname k8s-node2hostnamectl set-hostname k8s-node3
所有节点编辑/etc/hosts,添加
cat >> /etc/hosts << EOF10.132.47.60 k8s-master10.132.47.61 k8s-node110.132.47.62 k8s-node210.132.47.63 k8s-node3EOF
-
添加网桥过滤和地址转发功能
vim /etc/sysctl.conf-------------------------------------------------------------------------------------net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-arptables = 1net.ipv4.ip_forward=1net.ipv4.ip_forward_use_pmtu = 0-------------------------------------------------------------------------------------#配置内核参数(开启 K8s 需要的网络转发)cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1EOF-------------------------------------------------------------------------------------两种配置的区别/etc/sysctl.conf:这是系统默认的内核参数配置文件,所有内核参数都会在这里集中配置。但它是 “全局配置文件”,如果后续其他应用也需要修改内核参数,可能会和 K8s 的配置混淆,不利于管理。/etc/sysctl.d/k8s.conf:这是 “按功能拆分的配置文件”,sysctl.d 目录下的 .conf 文件会被系统自动加载,专门用于存放 K8s 相关的内核参数。这样做的好处是:配置隔离:K8s 的参数单独存放,和其他应用的配置互不干扰,后期维护时一目了然。符合 Linux 的配置规范:现代 Linux 系统推荐将不同服务的配置拆到 /etc/xxx.d/ 目录下,方便管理。-------------------------------------------------------------------------------------#生效配置:sysctl --system#查看效果sysctl -a|grep "ip_forward"
-
时间同步
#向阿里云服务器同步时间ntpdate time1.aliyun.com#删除本地时间并设置时区为上海rm -rf /etc/localtimeln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime#查看时间date -R || date
二、安装docker
-
卸载docker
-
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine -y -
-
-
-
-
安装工具和驱动包
https://docs.docker.com/engine/install
#安装yum工具包和存储驱动yum install -y yum-utils device-mapper-persistent-data lvm2
安装 dnf-plugins-core 包(提供管理 DNF 存储库的命令)并设置存储库。
sudo dnf -y install dnf-plugins-coresudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#导入阿里云 Docker 仓库的公钥:rpm --import https://mirrors.aliyun.com/docker-ce/linux/centos/gpg#配置阿里云 Docker 源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 清理旧缓存,生成新缓存yum clean all && yum makecache
-
安装dokcer
yum install docker-ce docker-ce-cli containerd.io -y
如果出现以下问题
Error downloading packages:docker-compose-plugin-2.27.1-1.el7.x86_64:
解决方案
(1)首先清理 yum 包管理器缓存sudo yum clean all(2)按系统提示清理 metadata 缓存sudo yum --enablerepo=docker-ce-stable clean metadata(3)重新安装依赖sudo yum install -y yum-utils device-mapper-persistent-data lvm2(4)配置 Docker 镜像源sudo yum-config-manager \--add-repo \https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.reposudo sed -i 's|https://download.docker.com|https://mirrors.tuna.tsinghua.edu.cn/docker-ce|g' /etc/yum.repos.d/docker-ce.repo(5)生成高速缓存(提升安装速度)sudo yum makecache fast(6)安装 Docker 引擎核心组件sudo yum install -y docker-ce(7)验证 Docker 是否安装成功docker --version
-
启动Docker并设置开机自启动
systemctl enable docker && systemctl start docker
-
docker换源
#更改/etc/docker/daemon.json文件sudo vim /etc/docker/daemon.json-------------------------------------------------------------------------------------{"max-concurrent-downloads": 10,"max-concurrent-uploads": 5,"default-shm-size": "1G","debug": true,"experimental": false,"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors":["https://x9r52uz5.mirror.aliyuncs.com","https://dockerhub.icu","https://docker.chenby.cn","https://docker.1panel.live","https://docker.awsl9527.cn","https://docker.anyhub.us.kg","https://dhub.kubesre.xyz","https://uy35zvn6.mirror.aliyuncs.com","https://b9pmyelo.mirror.aliyuncs.com","https://ustc-edu-cn.mirror.aliyuncs.com/","https://ccr.ccs.tencentyun.com/","https://docker.m.daocloud.io/"]}-------------------------------------------------------------------------------------# 重载 docker 的配置文件systemctl daemon-reload# 重启 Dockersystemctl restart docker
三、初始化集群
-
切换国内源
vim /etc/yum.repos.d/kubernetes.repo-------------------------------------------------------------------------------------[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttps://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg-------------------------------------------------------------------------------------#更新缓存yum clean all && yum -y makecache
-
安装kubeadm、kubelet和kubectl
yum install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0systemctl enable kubelet && systemctl start kubelet
四、Master 节点操作
-
拉取 K8s 镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.23.0
-
初始化 Master(复制最后输出的 join 命令)
kubeadm init \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version v1.23.0 \--pod-network-cidr=10.244.0.0/16 \--service-cidr=10.96.0.0/12 \--apiserver-advertise-address=10.132.47.60
-
复制下面的内容
kubeadm join 10.132.47.60:6443 --token 5odpb6.e52f3h0pb24bb6oc \--discovery-token-ca-cert-hash sha256:c848cc4e808214384ddc2590f3cc6ff9c6eb9a5de87a6d4c797c8305a8fae4ed------------------------------------------------------------------------------#注意:默认token有效期为24小时,当过期之后,该token就不可用了#在master里运行:kubeadm token create --print-join-command即可重新创建token -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
配置 kubectl 权限
mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config
-
验证 Master 状态(显示 Ready 即可)
kubectl get nodeskubectl get pods -n kube-system -w
-
安装 Calico 网络插件
kubectl apply -f https://docs.projectcalico.org/v3.22/manifests/calico.yaml# 查看Calico相关Pod(在kube-system命名空间)kubectl get pods -n kube-system -w
五、将 Worker 节点加入集群
-
执行加入命令
在 3 个 Worker 节点(k8s-node1、k8s-node2、k8s-node3)上,分别执行 Master 初始化时输出的join命令:
kubeadm join 10.132.47.60:6443 --token xxxxxxx.xxxxxxxxxxxx \--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-------------------------------------------------------------------------------------kubeadm join 10.132.47.60:6443 --token 5odpb6.e52f3h0pb24bb6oc \--discovery-token-ca-cert-hash sha256:c848cc4e808214384ddc2590f3cc6ff9c6eb9a5de87a6d4c797c8305a8fae4ed
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.每个 Worker 节点执行完后,会提示 “joined the cluster successfully”,说明加入成功。
-
验证所有节点就绪(Worker 加入后)
kubectl get nodes
六、配置清单1.0
-
集群基础信息
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
节点详细配置(IP / 角色 / 主机名)
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
关键配置文件路径
-
Kubeconfig 配置(kubectl 使用): /root/.kube/config(Master 节点) -
K8s 系统配置目录: /etc/kubernetes/ -
Calico 配置目录: /etc/cni/net.d/(CNI 配置)、/var/run/calico/(运行时数据) -
Docker 配置目录: /etc/docker/
-
核心命令(快速验证集群状态)
kubectl get nodeskubectl get pods -n kube-systemkubectl get podskubectl get svckubeadm token create --print-join-command
-
已部署核心组件清单
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
七、Dashboard(UI 界面)+ Metrics Server(资源监控)
-
部署 Metrics Server
Metrics Server 用于收集集群节点和 Pod 的 CPU、内存等资源数据,是 Dashboard 显示监控图表的前提。
下载并修改 Metrics Server 配置文件
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml
修改 metrics-server 启动参数#
metrics-server 会请求每台节点的 kubelet 接口来获取监控数据,接口通过 HTTPS 暴露,但 Kubernetes 节点的 kubelet 使用的是自签证书,若 metrics-server 直接请求 kubelet 接口,将产生证书校验失败的错误,因此需要在 components.yaml 文件中加上 --kubelet-insecure-tls 启动参数。
且由于 metrics-server 官方镜像仓库存储在 k8s.gcr.io ,国内可能无法直接拉取,您可以自行同步到 CCR 或使用已同步的镜像 ccr.ccs.tencentyun.com/mirrors/metrics-server:v0.5.0。
components.yaml 文件修改示例如下:
containers:- args:- --cert-dir=/tmp- --secure-port=443- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname- --kubelet-use-node-status-port- --metric-resolution=15s- --kubelet-insecure-tls # 加上该启动参数image: ccr.ccs.tencentyun.com/mirrors/metrics-server:v0.5.0 # 国内集群,请替换成这个镜像
#部署 metrics-server##修改 components.yaml 之后,执行以下命令,通过 kubectl 一键部署到集群:kubectl apply -f components.yaml
-
验证 Metrics Server 部署成功
# 查看Pod状态(确保Running且无重启)kubectl get pods -n kube-system | grep metrics-server# 正常输出:metrics-server-xxxx 1/1 Running 0 30s#metrics-server-8f68868ff-nwjrx 1/1 Running 0 2m19s# 查看日志(确认无报错)kubectl logs -n kube-system 【metrics-server的Pod名称】# 日志中无"connection refused"或"tls: bad certificate"即为正常# 等待1分钟,测试Metrics APIkubectl top node # 应显示所有节点的CPU/内存使用率NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%k8s-master 215m 5% 1780Mi 23%k8s-node1 87m 2% 857Mi 11%k8s-node2 96m 2% 908Mi 11%k8s-node3 96m 2% 834Mi 10%kubectl top pod -n kube-system # 应显示所有Pod的资源使用情况NAME CPU(cores) MEMORY(bytes)calico-kube-controllers-5bb5d4f7f4-ldx68 4m 31Micalico-node-4c4wz 35m 145Micalico-node-mc6xn 35m 146Micalico-node-mhck8 40m 155Micalico-node-nk77r 27m 146Micoredns-6d8c4cb4d-76fkb 2m 16Micoredns-6d8c4cb4d-b4wwq 2m 16Mietcd-k8s-master 17m 58Mikube-apiserver-k8s-master 51m 390Mikube-controller-manager-k8s-master 15m 56Mikube-proxy-474gq 1m 17Mikube-proxy-g8sfp 1m 16Mikube-proxy-rgrn7 1m 16Mikube-proxy-tjmh5 1m 16Mikube-scheduler-k8s-master 4m 23Mimetrics-server-8f68868ff-nwjrx 5m 21Mi
-
部署 Kubernetes Dashboard(UI 管理界面)
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml#修改配置文件(可选)vim recommended.yaml-------------------------------------------------------------------------------------kind: ServiceapiVersion: v1metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboardspec:type: NodePort #添加ports:- port: 8000targetPort: 8000nodePort: 32111 #添加selector:k8s-app: dashboard-metrics-scraper-------------------------------------------------------------------------------------1. 这两段配置的作用type: NodePort:Kubernetes 的 Service 默认类型是 ClusterIP(仅集群内部可访问)。设置为 NodePort 后,会在集群所有节点上开放一个静态端口(即 nodePort 指定的 32111),外部可以通过「任意节点 IP:32111」访问这个 Service。nodePort: 32111:明确指定暴露的节点端口号(范围必须在 30000-32767 之间)。如果不指定,K8s 会自动分配一个随机端口。2. dashboard-metrics-scraper?它是 Dashboard 的配套组件,作用是从 Metrics Server 采集监控数据(如 Pod / 节点的 CPU、内存使用率),然后提供给 Dashboard 前端展示(比如 Dashboard 中的资源监控图表)。3. 这两段配置的影响默认情况下,dashboard-metrics-scraper 的 Service 类型是 ClusterIP,仅允许集群内部访问(比如 Dashboard 前端容器可以访问它)。这种情况下:对 Dashboard 功能无影响:因为 Dashboard 前端和 dashboard-metrics-scraper 都在集群内部,通过内部域名即可通信,监控数据能正常显示。外部无法直接访问该组件:但这是合理的,因为 dashboard-metrics-scraper 是 Dashboard 的 “后端助手”,不需要外部直接访问,用户只需要通过 Dashboard 界面间接使用它的数据即可。-------------------------------------------------------------------------------------#部署 Dashboard(使用适配 v1.23 版本的官方配置)kubectl apply -f recommended.yaml
-
查看 kubernetes-dashboard 命名空间下资源状态
kubectl get pods,svc -n kubernetes-dashboard -
-
-
-
-
-
-
配置 Dashboard 访问权限(创建管理员用户,避免权限不足)
# 1. 创建管理员服务账号kubectl create serviceaccount dashboard-admin -n kube-system# 2. 绑定集群管理员权限kubectl create clusterrolebinding dashboard-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin# 3. 获取登录Token(复制输出的长字符串)kubectl describe secret -n kube-system $(kubectl get secret -n kube-system | grep dashboard-admin-token | awk '{print $1}') | grep "token:" | awk '{print $2}'#执行第 3 步后,复制 “data -> token” 对应的字符串(很长一段),保存好。#如:[root@k8s-master ~]# kubectl describe secret -n kube-system $(kubectl get secret -n kube-system | grep dashboard-admin-token | awk '{print $1}') | grep "token:" | awk '{print $2}'eyJhbGciOiJSUzI1NiIsImtpZCI6IkdGdER3UWxRUEs2M19LR191S3lrcFg5N2NWQVFNLWpfamphWlJvYWZaekUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tY3h2OHgiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYWM3MGUzMmYtYzFjNS00OTBjLWEwMjctN2MxZTY3ZWY1ZDkyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.PO-4boQoICCWsMM88QoGU_NYypfETG7FlZsDhiYyWu0KVkhJ-4d9xHgwNl5eVNKK9_JoMG5cHMhwR8rn2SFXKMob4sBAVe0X6_wCq6y3AAdw3l08US_-1HdiKLwRHH3S4Yt1uRssx3y8rD69W1JUPUbMYwfmUKnp_Yxwgp7aA-bJqtC5EL9ldUj7iz8QKhDmkRFw8Z8hVPHcJZyMi6r-Q3FOy1wvAN-jVUmrJc4qOi3-EMdqGSS2k3WlG88lV93v2UIMadj1bPOa0GILrzDPhM_mE-Z1dh_UaSmJbd7BDXFyCRPX1EPn4DmuGqoiydB7v-Hlv6cEtw3CjK76SA4VkQ
-
配置 Dashboard 端口转发(方便本地访问,无需暴露外网)
#Dashboard 默认只允许集群内部访问,通过端口转发让外部能访问:# 后台运行端口转发(映射8001端口,允许所有IP访问)nohup kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8001:443 --address 0.0.0.0 &--address 0.0.0.0:允许所有机器访问(如果只需要本地访问,可去掉该参数)执行后,通过ps aux | grep port-forward可查看进程是否正常运行。
-
访问 Dashboard 并使用
浏览器访问并登录打开浏览器,输入地址:https://10.132.47.60:8001(你的 Master 节点 IP+8001 端口)忽略 “不安全连接” 警告(自签名证书正常现象)选择 “Token” 登录,粘贴步骤 1 复制的 Token,点击 “Sign in”登录后就能看到集群的节点状态、Pod 列表,以及 Metrics Server 提供的 CPU / 内存监控数据了!
八、配置清单2.0
-
集群核心配置清单
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-
关键组件状态(正常运行标准)
kubectl get nodeskubectl get pods -n kube-system | grep -E "metrics-server|calico|coredns|etcd|kube-"kubectl get pods -n kubernetes-dashboard
-
Dashboard 快捷访问指南
启动端口转发(重启 Master 后需重新执行)
# 后台启动端口转发(外部可通过8001端口访问)nohup kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8001:443 --address 0.0.0.0 &
访问地址 & 登录
-
浏览器地址:
https://10.132.47.60:8001(Master 节点 IP+8001 端口) -
登录方式:Token(长期有效,丢失可重新查询)
-
查询 Token 命令:
kubectl describe secret -n kube-system $(kubectl get secret -n kube-system | grep dashboard-admin-token | awk '{print $1}') | grep "token:" | awk '{print $2}' -
-
-
-
查看资源监控数据
左侧菜单 → Nodes:查看所有节点的 CPU、内存使用率(数据来自 Metrics Server)
左侧菜单 → Pods:点击具体 Pod,在详情页查看该 Pod 的资源使用趋势图
左侧菜单 → Deployments:查看整个应用的资源汇总数据
-
常用维护命令(集群管理)
# 1. 测试Metrics Server监控(正常显示节点资源)kubectl top nodekubectl top pod -n kubernetes-dashboard# 2. 重启Dashboard组件(故障时使用)kubectl rollout restart deployment kubernetes-dashboard -n kubernetes-dashboardkubectl rollout restart deployment dashboard-metrics-scraper -n kubernetes-dashboard# 3. 重启Metrics Server(监控异常时)kubectl rollout restart deployment metrics-server -n kube-system# 4. 查看Dashboard访问日志(排查登录/访问问题)kubectl logs -n kubernetes-dashboard $

