Rocky10 使用kubeadm部署K8s v1.34 一主两从
使用kubeadm部署k8s 一主两从
一、基础环境准备
1. 服务器准备
master服务器配置必须 >= 2c2g,内核版本需要在支持列表中:https://kubernetes.io/zh-cn/docs/reference/node/kernel-version-requirements/
| ip | 角色 |
|---|---|
| 192.169.100.130 | master |
| 192.169.100.131 | node |
| 192.169.100.132 | node |
2. 服务器初始化
2.1. 设置主机名
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02
2.2. 配置主机hosts(所有主机执行)
cat >> /etc/hosts << EOF
192.169.100.130 k8s-master01 m1
192.169.100.131 k8s-node01 n1
192.169.100.132 k8s-node02 n2
EOF
2.3. 配置时间同步(所有主机执行)
timedatectl set-timezone Asia/Shanghai
echo "server ntp.aliyun.com iburst" >> /etc/chrony.conf && systemctl restart chronyd
chronyc sources查看时间是否同步。
2.4. 关闭交换分区(已关闭可以跳过)
swapoff -a
永久关闭需要注释掉/etc/fstab中的配置
2.5 关闭防火墙,selinux(所有主机执行)
如果需要开启防火墙可以参考需要开放的必要端口:https://kubernetes.io/zh-cn/docs/reference/networking/ports-and-protocols/
systemctl disable firewalld --now
setenforce 0
grubby --update-kernel ALL --args selinux=0
sed -i 's/SELINUX=enforcing/SELINUX=disable/g' /etc/selinux/config
2.6 内核配置(所有主机执行)
2.6.1. 将网络流量交给iptables管理,并开启内核转发(所有主机执行)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
2.6.2. 加载必要内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
二、安装容器运行时(所有主机执行)
常见的容器运行时接口安装参考官网手册:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/,这里将使用docker作为容器运行时。
1. 安装docker
1. 配置dnf源
dnf -y install dnf-plugins-core
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2. 安装docker
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 修改docker配置文件
cat > /etc/docker/daemon.json <<EOF
{
"data-root": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "100"
},
"registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com", "https://docker-pull.ygxz.in", "https://quay-pull.ygxz.in"]
}
EOF
- “data-root”: “/data/docker” : 指定docker数据存储目录
- “exec-opts”: [“natice.cgroupdriver=systemd”]:修改cgroup引擎为systemd,默认是cgroupv2
- “log-driver”: “json-file”:日志引擎为json文件
- “max-size”: “100m”:单容器单文件大小
- “max-file”: “100”:单容器最大日志数量
- “registry-mirrors”: [“https://kfp63jaj.mirror.aliyuncs.com”,“https://docker-pull.ygxz.in”,““https://quay-pull.ygxz.in””]:仓库加速地址
4. 启动docker
systemctl daemon-reload
systemctl enable docker --now
2. 安装cri-dockerd(所有主机执行)
从v1.24版本开始k8s就弃用dockershim,而是开发一个CRI接口,所以就不在支持docker了,所有的容器运行时,必须支持CRI接口。
docker就联合其他公司开发了cri-dockerd用于支持CRI接口,将cri-dockerd当k8s和docker的翻译官。
2.1. 下载cri-dockerd
项目地址:https://github.com/Mirantis/cri-dockerd
curl -O -k https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.20/cri-dockerd-0.3.20.amd64.tgz
2.2. 安装cri-dockerd
tar -zxvf cri-dockerd-0.3.20.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/bin/
2.2.1. 配置cri-docker.service
cat > /usr/lib/systemd/system/cri-docker.service << EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
--network-plugin=cni: 使用cni容器网络接口,选用此选项docker在创建容器的使用就不会使用docker0接口。--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10:指定pause容器名称
2.2.2. 配置cri-docker.socket
cat > /usr/lib/systemd/system/cri-docker.socket << EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
%t/cri-dockerd.sock:%t 变量系统临时目录,这里是 /run
2.3. 启动cri-docker
systemctl daemon-reload
systemctl enable cri-docker --now
三、部署k8s
1. 配置dnf源(所有主机执行)
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
2. 安装kubeadm,kubelet,kubectl
master节点需要安装这3个,node节点只需要安装kubeadm、kubelet
dnf -y install kubeadm kubectl kubelet --disableexcludes=kubernetes
systemctl enable kubelet
--disableexcludes=kubernetes:禁用kubernetes,执行后即使执行dnf update ,k8s组件也不会被更新kubeadm:集群部署工具kubectl:k8s命令行管理工具kubelet:k8s核心组件,负责上报节点和pod的状态,负责维护pod的期望值,负责创建和启动容器,健康检查,与CSI,CNI插件交互, 创建静态pod。systemctl enable kubelet:由于api-server还未启动,这里只是加入到开机自启
3. 初始化集群(二选一)
3.1. 使用yml文件初始化(只需在master节点执行)
a. 打印默认初始化文件重定向到init-defaults.yaml中
kubeadm config print init-defaults > init-defaults.yaml
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.169.100.130
bindPort: 6443
nodeRegistration:
criSocket: unix:///run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: k8s-master01
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.34.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
proxy: {}
scheduler: {}
advertiseAddress: 192.169.100.130:kube-apiserver对外暴露的地址name: k8s-master01:master服务器主机名criSocket: unix:///run/cri-dockerd.sock:docker的cri接口(其实就是cri-docker)certificatesDir: /etc/kubernetes/pki:CA证书目录dataDir: /var/lib/etcd:etcd数据保存目录imageRepository: registry.aliyuncs.com/google_containers:k8s其他组件的镜像拉取地址dnsDomain: cluster.local:service域名serviceSubnet: 10.96.0.0/12:service CIDRpodSubnet: 10.244.0.0/16:pod CIDR,新增配置,pod地址是有网络供应商提供,这里提前设置了,就需要修改网络供应商那边的配置。
b. 将镜像提前拉取下来
kubeadm config images pull --config=init-defaults.yaml
c. 预执行(可选)
预执行,不是真正的执行,只是看个效果,如果有报错可以,提前处理。
kubeadm init --config=init-defaults.yaml --dry-run
--dry-run:预执行--ignore-preflight-errors=SystemVerification:忽略错误看情况添加
d. 初始化集群
初始化干了什么可以看看官网写的:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/#%E6%A6%82%E8%A6%81
kubeadm init --config=init-defaults.yaml
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.169.100.130:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:ae45196af4752d1905055cafc2466e34e8269863e789d947dc1a1f4f60ae67f2
根据提示配置认证配置(我当前为root用户):
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
source ~/.bashrc
kubeadm join 192.169.100.130:6443 --token uhw5t1.d4944ictxgq79ohw \ --discovery-token-ca-cert-hash sha256:12b2da3132d32aea8f95b5083bdc510de24f9bf2fb76352c52ab8e3333a617fe: 添加node节点命令。
3.2. 使用命令行参数初始化集群
更多参数参考官网:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/#%E9%80%89%E9%A1%B9
kubeadm init \
--apiserver-advertise-address=192.169.100.130 \
--node-name=k8s-master01 \
--cri-socket=unix:///run/cri-dockerd.sock \
--image-repository=registry.aliyuncs.com/google_containers \
--service-dns-domain=cluster.local \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
- 若想预执行,可以添加
--dry-run参数
根据提示配置认证配置(我当前为root用户):
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
source ~/.bashrc
4. 将node节点添加到集群
如果忘了可以使用
kubeadm token create --print-join-command打印出来
kubeadm join 192.169.100.130:6443 --token uhw5t1.d4944ictxgq79ohw \
--discovery-token-ca-cert-hash sha256:12b2da3132d32aea8f95b5083bdc510de24f9bf2fb76352c52ab8e3333a617fe \
--cri-socket unix:///run/cri-dockerd.sock
--cri-socket unix:///run/cri-dockerd.sock:指定使用的OCI接口
查看节点状态:
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 NotReady control-plane 3m47s v1.34.0
k8s-node01 NotReady <none> 31s v1.34.0
k8s-node02 NotReady <none> 29s v1.34.0
当前STATUS是NotReady ,这是由于网络插件还未安装,当前node节点角色为 <none> ,可以添加一个compute-node标签:
kubectl label nodes k8s-node01 node-role.kubernetes.io/compute-node=
kubectl label nodes k8s-node02 node-role.kubernetes.io/compute-node=
5. 安装网络插件
官网提供了许多第三方的网络插件项目:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/addons/#networking-and-network-policy,可以找到自己合适的进行安装
当前比较广泛使用的是Flannel和Calico还有Cilium,功能如下介绍:
| 特性 | Flannel | Calico | Cilium |
|---|---|---|---|
| 网络模型 | 基于 overlay 的三层网络(vxlan/host-gw) | 原生三层路由(BGP)+ overlay(可选) | 基于 eBPF 的三层/四层网络(vxlan/直接路由) |
| 网络策略 | 不支持 | 支持(L3/L4,基于 iptables 或 eBPF) | 支持(L3/L4/L7,基于 eBPF,支持 HTTP/GRPC 等) |
| 性能 | 中等(overlay 有封装开销) | 高性能(原生路由无封装,eBPF 模式更优) | 极高(eBPF 绕过内核协议栈,低延迟) |
| 易用性 | 极简(单配置文件部署,几乎零维护) | 中等(需配置 BGP 或 overlay,策略较复杂) | 中等(依赖 eBPF 内核支持,配置项较多) |
| Scalability | 适合中小集群(千级节点以内) | 适合大规模集群(万级节点,BGP 路由聚合) | 适合超大规模集群(eBPF 高效处理,低资源占用) |
| 监控与可观测性 | 基础(仅网络连通性) | 丰富(Felix 代理 metrics,网络流量可视化) | 极强(eBPF 原生抓包,L7 流量分析,Hubble 工具) |
| 内核依赖 | 低(支持绝大多数 Linux 内核) | 中(BGP 模式无特殊依赖,eBPF 模式需 ≥5.3) | 高(需 ≥5.4 内核,部分功能需 ≥5.8/6.1) |
| 安全特性 | 无 | 网络策略、加密网络(IPsec) | 网络策略、透明加密、L7 策略(如 API 路径限制) |
| 典型适用场景 | 入门学习、简单生产环境、对性能要求不高的场景 | 大规模集群、需要精细网络策略的生产环境 | 高性能场景(如金融、AI)、需要 L7 策略和深度可观测的环境 |
| 社区活跃度 | 稳定(维护中,功能迭代较慢) | 活跃(广泛企业采用,持续迭代) | 非常活跃(eBPF 技术趋势,快速发展) |
| 资源占用 | 低(仅 flanneld 进程,内存占用小) | 中(Felix、BIRD 等组件,内存中等) | 中(agent 进程 + eBPF 程序,CPU 占用低) |
下面只介绍Flannel和Calico的安装(二选一)
5.1. 安装Flannel网络插件
Flannel优势在于部署非常简单,适合小型网络环境,缺点也是太简单了,不支持网络策略。
项目地址:https://github.com/flannel-io/flannel#deploying-flannel-manually
curl -O https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
先将资源清单下载到本地,修改pod Network地址,地址需要跟初始化集群设置的:podSubnet: 10.244.0.0/16保持一致,资源清单中默认就是此地址范围,所以无需修改。
创建资源:
kubectl apply -f kube-flannel.yml
查看node节点状态:
[root@k8s-master01 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 22h v1.34.0
k8s-node01 Ready compute-node 22h v1.34.0
k8s-node02 NotReady compute-node 22h v1.34.0
5.2. 安装calico
calico与k8s有版本依赖关系:https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
官网安装介绍:https://docs.tigera.io/calico/latest/getting-started/kubernetes/k8s-single-node
wget https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml

将- name: CALICO_IPV4POOL_CIDR注释取消,value: "10.244.0.0/16"修改为你在初始化时设置的Pod的地址范围。
kubectl apply -f calico.yaml
检查节点状态:
[root@192 ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane 3h v1.34.1
k8s-node01 Ready compute-node 161m v1.34.1
k8s-node02 Ready compute-node 161m v1.34.1
可以看出现在node状态是正常的了。
6. metrics-server安装
github地址:https://github.com/kubernetes-sigs/metrics-server
介绍:
Metrics Server 是为 Kubernetes 内置自动缩放流程提供可扩展、高效容器资源指标来源的工具。
Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 在 Kubernetes api-server 中进行暴露。 供 水平 Pod 自动缩放器 和 垂直 Pod 自动缩放器 使用。Metrics API 也可以被 kubectl top 访问,从而更方便地调试自动缩放流程。
兼容列表参考:https://github.com/kubernetes-sigs/metrics-server#compatibility-matrix
使用高可用方式安装:
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
修改容器运行时参数和镜像:
containers:
- args:
- --kubelet-insecure-tls # 不验证证书
- --cert-dir=/tmp
- --secure-port=10250
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.8.0 # 使用阿里云镜像
创建资源:
kubectl apply -f high-availability-1.21+.yaml
kubectl get pod -A -l k8s-app=metrics-server -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system metrics-server-87cf6f4d9-7kg9f 1/1 Running 0 37s 10.244.85.194 k8s-node01 <none> <none>
kube-system metrics-server-87cf6f4d9-wbx7r 1/1 Running 0 37s 10.244.58.195 k8s-node02 <none> <none>
测试:
kubectl top node
NAME CPU(cores) CPU(%) MEMORY(bytes) MEMORY(%)
k8s-master01 130m 6% 1444Mi 55%
k8s-node01 61m 3% 534Mi 33%
k8s-node02 64m 3% 742Mi 47%
7. 仪表盘安装
K8S 官方提供的仪表盘工具为kubernetes-dashboard,github地址:https://github.com/kubernetes/dashboard#kubernetes-dashboard
7.1. Kubernetes Dashboard 介绍:
Kubernetes Dashboard 是一个通用的、基于 Web 的 Kubernetes 集群界面。它允许用户管理集群中运行的应用程序并对其进行故障排除,同时还可以管理集群本身。
从 7.0.0 版本开始,我们已停止对基于 Manifest 的安装的支持。现在仅支持基于 Helm 的安装。由于多容器设置和对 Kong 网关 API 代理的硬依赖,无法轻松支持基于 Manifest 的安装。
此外,我们已更改了版本号方案,并从 Helm 图表中移除了 appVersion。这是因为,在多容器设置中,每个模块现在都单独进行版本控制。Helm 图表版本现在可以被视为应用版本。
7.2. 安装Helm
Helm 官网文档:https://helm.sh/zh/docs/intro/install/#%E7%94%A8helm%E9%A1%B9%E7%9B%AE%E5%AE%89%E8%A3%85
下载地址:https://github.com/helm/helm/releases
当前最新版本是v3.19.0,github上目前没有提供二进制包,所有我们需要下载源码自行编译。
wget https://github.com/helm/helm/archive/refs/tags/v3.19.0.tar.gz
tar -zxvf v3.19.0.tar.gz
cd /root/helm-3.19.0
go build helm-3.19.0
cp helm /usr/local/bin/
helm version
version.BuildInfo{Version:"v3.19", GitCommit:"", GitTreeState:"", GoVersion:"go1.24.6 (Red Hat 1.24.6-1.el10_0)"}
7.3. 部署kubernetes-dashboard
所有官网的Helm仓库用不了,国内也没有找到可用的,所有这里我们去官网下载指定版本的kubernetes-dashboard的压缩包,进行本地部署。
所有发布地址:https://github.com/kubernetes/dashboard/releases
我们选择使用kubernetes-dashboard-7.13.0这个版本,兼容性应该能满足:
kubernetes-dashboard使用到的镜像:
docker.io/kubernetesui/dashboard-api:1.12.0
docker.io/kubernetesui/dashboard-auth:1.3.0
docker.io/kubernetesui/dashboard-metrics-scraper:1.2.2
docker.io/kubernetesui/dashboard-web:1.7.0
kong:3.8
wget https://github.com/kubernetes/dashboard/archive/refs/tags/kubernetes-dashboard-7.13.0.tar.gz
# 创建 kubernetes-dashboard namespace
kubectl create namespace kubernetes-dashboard
# 使用 Helm 部署 Kubernetes Dashboard 应用
helm install --install kubernetes-dashboard ./kubernetes-dashboard-7.13.0.tgz --namespace kubernetes-dashboard --create-namespace
*************************************************************************************************
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
*************************************************************************************************
Congratulations! You have just installed Kubernetes Dashboard in your cluster.
To access Dashboard run:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
NOTE: In case port-forward command does not work, make sure that kong service name is correct.
Check the services in Kubernetes Dashboard namespace using:
kubectl -n kubernetes-dashboard get svc
Dashboard will be available at:
https://localhost:8443
确保所有Pod正常运行:
kubectl get pod -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
kubernetes-dashboard-api-7bd9bc84d9-zqfdx 1/1 Running 0 37m
kubernetes-dashboard-auth-74fcf794c4-6mw2n 1/1 Running 0 37m
kubernetes-dashboard-kong-6465d78779-4bt8c 1/1 Running 0 37m
kubernetes-dashboard-metrics-scraper-85448cbcc4-rwzqz 1/1 Running 0 37m
kubernetes-dashboard-web-7958b4cc8f-md4z9 1/1 Running 0 37m
k8s
kubectl port-forward转发原理是通过scoat实现的,所有所有节点需要安装这个工具
目前kubernetes-dashboard已经安装完成了,根据提示可以使用kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443 临时将本机8443端口转发到集群内部,访问kubernetes-dashboard前端,但是目前还没有可以登录kubernetes-dashboard 的账号
7.4. 创建用于登录kubernetes-dashboard的集群管理员账号。
dashboard-admin-token.yaml:
# 创建一个账号资源、账号名称为dashboard-admin
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin # 账号名称
namespace: kubernetes-dashboard
---
# 创建一个集群角色绑定资源、用于绑定集群角色,并赋予权限。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin # 集群角色绑定资源名称
roleRef:
apiGroup: rbac.authorization.k8s.io # 声明下面的资源属于 RBAC 权限控制相关的 API 组。
kind: ClusterRole # 绑定集群角色
name: cluster-admin # 权限(cluster-admin 集群管理员,拥有所有权限)
subjects:
- kind: ServiceAccount # 绑定对象资源是账号
name: dashboard-admin # 账号名称
namespace: kubernetes-dashboard # 该账号所属的命名空间
---
# 创建一个tocken,用来登录kubernetes-dashboard
apiVersion: v1
kind: Secret
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
annotations:
kubernetes.io/service-account.name: "dashboard-admin"
type: kubernetes.io/service-account-token
kubectl apply -f dashboard-admin-token.yaml
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created
secret/dashboard-admin created
获取tocken
kubectl get secret dashboard-admin -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6InFyU3VQVUxjTVFBYzZmZFcwNjYyM05YSjVseFZmRWFoUGc5U3JkY0VVeHMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGIxY2IyZDgtZjFlYy00ZDk5LTk3NzYtMjI5MzRiMzdmMDdjIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.n0fKN76OJ0dscfAt71Acgr1IksXrW4WrZAAScCkzoPrk-Co75RBMTyr8xJNbR5F4nojggR_VBK3Bu1oLWwTUcjaIaRTSS5pzQzv09gjceh0e42kQlXO-m2s8WVQ4QLxeCB4x8Qus0uS75fTWWQVUGKAcGvW97mI8STvWDvaknJSCQStgHRoTyOWgqLDauzcSOfxXRPVlXKV27N6gR-_aVPdtsxqLxlUQ9ccCvE-jt66bKjQ8aTJi83eV1ZX_r8eN-bqtgjzo9h_f7aQIC4jN43kHCl8ZHkN
7.5. 登录kubernetes-dashboard
使用kubectl port-forward将本地端口临时转发到集群中(这里kubernetes-dashboard创建了service,所以将本地端口转发到service即可)
kubectl -n kubernetes-dashboard port-forward --address 0.0.0.0 svc/kubernetes-dashboard-kong-proxy 8443:443

将kubernetes-dashboard前端访问的svc类型修改为NodePort
kubectl edit svc kubernetes-dashboard-kong-proxy -n kubernetes-dashboard
type: NodePort # 将service类型修改为NodePort
kubectl get svc -n kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-dashboard-kong-proxy NodePort 10.107.201.34 <none> 443:32713/TCP 3h12m
使用本机的32713端口访问:
四、扩展
1. 将kube-proxy默认的代理模式由iptables改为ipvs
1.1. 加载ipvs模板
cat > /etc/modules-load.d/ipvs.modules << EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
for i in `cat /etc/modules-load.d/ipvs.modules`;do modprobe $i;done
for i in `cat /etc/modules-load.d/ipvs.modules`;do lsmod|grep -o $i|uniq;done
1.2. 安装ipvs 命令行工具
dnf -y install ipvsadm ipset
1.3. 修改kube-proxy配置文件
kube-proxy配置参考官网:https://kubernetes.io/zh-cn/docs/reference/command-line-tools-reference/kube-proxy/
默认是是iptables模式,可以配置--proxy-mode ipvs修改为ipvs模式
kubectl get ds -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 9d
可以看出kube-proxy是使用daemonsets部署的,查看ds中的configmap名称去修改它的配置文件
kubectl get ds -n kube-system -o yaml
containers:
- command:
- /usr/local/bin/kube-proxy
- --config=/var/lib/kube-proxy/config.conf
- --hostname-override=$(NODE_NAME)
volumes:
- configMap:
defaultMode: 420
name: kube-proxy
name: kube-proxy
可以看出kube-system daemonsets挂载了一个名叫kube-proxy的configmap卷作为配置文件,我们只需要修改kube-proxy即可。
kubectl -n kube-system edit configmap kube-proxy
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
logging:
flushFrequency: 0
options:
json:
infoBufferSize: "0"
text:
infoBufferSize: "0"
verbosity: 0
metricsBindAddress: ""
mode: "ipvs" # 修改为ipvs,表示使用ipvs模式
mode: "ipvs"
1.4. 更新配置
kubectl -n kube-system rollout restart daemonSet kube-proxy
使用滚动更新的方式重启kube-proxy
查看Pod地址代理是否已经修改:
kubectl logs kube-proxy-kbtc2 -n kube-system
server_linux.go:189] "Using ipvs Proxier"
I0919 03:45:38.688793 1 proxier.go:353] "IPVS scheduler not specified, use rr by default" ipFamily="IPv4"
I0919 03:45:38.688963 1 proxier.go:353] "IPVS scheduler not specified, use rr by default" ipFamily="IPv6"
2. 手动修改集群证书过期时间
2.1. 查看集群内部证书到期时间
其中并不包含
kubelet,因为kubelet设置为自动更新证书
kubeadm certs check-expiration
[check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file' to re-upload it.
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Sep 09, 2026 16:20 UTC 355d ca no
apiserver Sep 09, 2026 16:20 UTC 355d ca no
apiserver-etcd-client Sep 09, 2026 16:20 UTC 355d etcd-ca no
apiserver-kubelet-client Sep 09, 2026 16:20 UTC 355d ca no
controller-manager.conf Sep 09, 2026 16:20 UTC 355d ca no
etcd-healthcheck-client Sep 09, 2026 16:20 UTC 355d etcd-ca no
etcd-peer Sep 09, 2026 16:20 UTC 355d etcd-ca no
etcd-server Sep 09, 2026 16:20 UTC 355d etcd-ca no
front-proxy-client Sep 09, 2026 16:20 UTC 355d front-proxy-ca no
scheduler.conf Sep 09, 2026 16:20 UTC 355d ca no
super-admin.conf Sep 09, 2026 16:20 UTC 355d ca no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Sep 07, 2035 16:20 UTC 9y no
etcd-ca Sep 07, 2035 16:20 UTC 9y no
front-proxy-ca Sep 07, 2035 16:20 UTC 9y no
-
CERTIFICATE: 普通证书名称,证书存放在/etc/kubernetes/pki目录下 -
EXPIRES:证书到期时间 -
RESIDUAL TIME:剩余时间 -
CERTIFICATE AUTHORITY:签发机构 -
EXTERNALLY MANAGED:是否外部管理 -
CERTIFICATE AUTHORITY:CA证书名称
证书默认是1年到期、当你升级k8s时,在使用kubeadm upgrade会自动将证书更新,关于更多信息参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#automatic-certificate-renewal
2.2. 更新证书到期时间
备份旧的证书:
cp -r /etc/kubernetes /etc/kubernetes.bak
使用kubeadm certs renew更新普通证书,命令使用如下:
你可以使用kubeadm certs renew all更新所有证书,或者只更新某个证书。
Renew certificates for a Kubernetes cluster
Usage:
kubeadm certs renew [flags]
kubeadm certs renew [command]
Available Commands:
admin.conf Renew the certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself
all Renew all available certificates
apiserver Renew the certificate for serving the Kubernetes API
apiserver-etcd-client Renew the certificate the apiserver uses to access etcd
apiserver-kubelet-client Renew the certificate for the API server to connect to kubelet
controller-manager.conf Renew the certificate embedded in the kubeconfig file for the controller manager to use
etcd-healthcheck-client Renew the certificate for liveness probes to healthcheck etcd
etcd-peer Renew the certificate for etcd nodes to communicate with each other
etcd-server Renew the certificate for serving etcd
front-proxy-client Renew the certificate for the front proxy client
scheduler.conf Renew the certificate embedded in the kubeconfig file for the scheduler manager to use
super-admin.conf Renew the certificate embedded in the kubeconfig file for the super-admin
默认是更新时间为1年,通过修改
kubeadm初始化配置可以延长证书到期时间,但是不能更新CA证书。
在kubeadm config print init-defaults初始化中默认就有关于,普通证书和CA证书的到期时间:
caCertificateValidityPeriod: 87600h0m0s # CA证书默认是10年
certificateValidityPeriod: 8760h0m0s # 普通证书默认是1年
certificatesDir: /etc/kubernetes/pki # 证书存放目录
更新证书将普通证书过期时间修改为100年:kubeadm-cert-renew.yaml:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration # 必须指定 Kind,否则 kubeadm 无法识别
caCertificateValidityPeriod: 87600h0m0s # CA 证书,默认10年,不支持更新
certificateValidityPeriod: 876000h0m0s # 普通证书正)
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
kubeadm certs renew all --config kubeadm-cert-renew.yaml
kubeadm certs check-expiration
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Aug 26, 2125 04:34 UTC 99y ca no
apiserver Aug 26, 2125 04:34 UTC 99y ca no
apiserver-etcd-client Aug 26, 2125 04:34 UTC 99y etcd-ca no
apiserver-kubelet-client Aug 26, 2125 04:34 UTC 99y ca no
controller-manager.conf Aug 26, 2125 04:34 UTC 99y ca no
etcd-healthcheck-client Aug 26, 2125 04:34 UTC 99y etcd-ca no
etcd-peer Aug 26, 2125 04:34 UTC 99y etcd-ca no
etcd-server Aug 26, 2125 04:34 UTC 99y etcd-ca no
front-proxy-client Aug 26, 2125 04:34 UTC 99y front-proxy-ca no
scheduler.conf Aug 26, 2125 04:34 UTC 99y ca no
super-admin.conf Aug 26, 2125 04:34 UTC 99y ca no
2.3. 重启控制平面Pod
为啥要重启Pod参考官网:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#manual-certificate-renewal
移除静态Pod:
等待20s左右,将静态Pod资源文件放回去
mv /etc/kubernetes/manifests/*.yaml /opt
mv /opt/*.yaml /etc/kubernetes/manifests/
3. 如何在集群外部访问集群
所有访问方式参考官方文档:https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/access-cluster/
这里使用kubectl来访问集群,首先你需要有一个访问凭据,在k8s集群初始化完时,默认创建了一个管理员凭据在/etc/kubernetes/admin.conf
3.1. Linux客户端使用凭据访问到集群
3.1.1. 安装kubectl 命令行工具
curl -LO https://dl.k8s.io/release/v1.34.0/bin/linux/amd64/kubectl
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
kubectl version
3.1.2 将准入文件拷贝到Linux客户端机器(必须保证能与k8s api通信):
mkdir /etc/kubernetes/
scp k8s-master01:/etc/kubernetes/admin.conf /etc/kubernetes/
声明KUBECONFIG环境变量,值为/etc/kubernetes/admin.conf
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' >> ~/.bashrc
source ~/.bashrc
3.1.3 访问测试
kubectl cluster-info
Kubernetes control plane is running at https://192.169.100.130:6443
CoreDNS is running at https://192.169.100.130:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
访问正常
3.2. Windows客户端访问
3.2.1. 安装kubectl 命令行工具
下载二进制文件
我已经将二进制文件放到了
C:\Windows目录中
https://dl.k8s.io/release/v1.34.0/bin/windows/amd64/kubectl.exe
放到环境变量中

打开控制台测试:
kubectl version
3.2.2. 将准入文件拷贝到windows指的目录下
我的准入文件在:C:\.kube\admin.conf
配置KUBECONFIG环境变量,值为C:\.kube\admin.conf
3.2.3. 访问测试
kubectl cluster-info
Kubernetes control plane is running at https://192.169.100.130:6443
CoreDNS is running at https://192.169.100.130:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
更多推荐


所有评论(0)