Rocky10 使用kubeadm部署K8s v1.34 一主两从
使用kubeadm部署k8s 一主两从
- 一、基础环境准备
- 1. 服务器准备
- 2. 服务器初始化
- 2.1. 设置主机名
- 2.2. 配置主机hosts(所有主机执行)
- 2.3. 配置时间同步(所有主机执行)
- 2.4. 关闭交换分区(已关闭可以跳过)
- 2.5 关闭防火墙,selinux(所有主机执行)
- 2.6 内核配置(所有主机执行)
- 2.6.1. 将网络流量交给iptables管理,并开启内核转发(所有主机执行)
- 2.6.2. 加载必要内核模块
- 二、安装容器运行时(所有主机执行)
- 1. 安装docker
- 1. 配置dnf源
- 2. 安装docker
- 3. 修改docker配置文件
- 4. 启动docker
- 2. 安装cri-dockerd(所有主机执行)
- 2.1. 下载cri-dockerd
- 2.2. 安装cri-dockerd
- 2.2.1. 配置cri-docker.service
- 2.2.2. 配置cri-docker.socket
- 2.3. 启动cri-docker
- 三、部署k8s
- 1. 配置dnf源(所有主机执行)
- 2. 安装kubeadm,kubelet,kubectl
- 3. 初始化集群(二选一)
- 3.1. 使用yml文件初始化(只需在master节点执行)
- a. 打印默认初始化文件重定向到`init-defaults.yaml`中
- b. 将镜像提前拉取下来
- c. 预执行(可选)
- d. 初始化集群
- 3.2. 使用命令行参数初始化集群
- 4. 将node节点添加到集群
- 5. 安装网络插件
- 5.1. 安装Flannel网络插件
- 5.2. 安装calico
- 6. metrics-server安装
- 7. 仪表盘安装
- 7.1. Kubernetes Dashboard 介绍:
- 7.2. 安装Helm
- 7.3. 部署kubernetes-dashboard
- 7.4. 创建用于登录kubernetes-dashboard的集群管理员账号。
- 7.5. 登录kubernetes-dashboard
- 四、扩展
- 1. 将kube-proxy默认的代理模式由iptables改为ipvs
- 1.1. 加载ipvs模板
- 1.2. 安装ipvs 命令行工具
- 1.3. 修改kube-proxy配置文件
- 1.4. 更新配置
- 2. 手动修改集群证书过期时间
- 2.1. 查看集群内部证书到期时间
- 2.2. 更新证书到期时间
- 2.3. 重启控制平面Pod
- 3. 如何在集群外部访问集群
- 3.1. Linux客户端使用凭据访问到集群
- 3.1.1. 安装kubectl 命令行工具
- 3.1.2 将准入文件拷贝到Linux客户端机器(必须保证能与k8s api通信):
- 3.1.3 访问测试
- 3.2. Windows客户端访问
- 3.2.1. 安装kubectl 命令行工具
- 3.2.2. 将准入文件拷贝到windows指的目录下
- 3.2.3. 访问测试
一、基础环境准备
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=alwaysLimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinityTasksMax=infinity
Delegate=yes
KillMode=process[Install]
WantedBy=multi-user.targetEOF
--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-tokentoken: abcdef.0123456789abcdefttl: 24h0m0susages:- signing- authentication
kind: InitConfiguration
localAPIEndpoint:advertiseAddress: 192.169.100.130bindPort: 6443
nodeRegistration:criSocket: unix:///run/cri-dockerd.sockimagePullPolicy: IfNotPresentimagePullSerial: truename: k8s-master01taints: null
timeouts:controlPlaneComponentHealthCheck: 4m0sdiscovery: 5m0setcdAPICall: 2m0skubeletHealthCheck: 4m0skubernetesAPICall: 1m0stlsBootstrap: 5m0supgradeManifests: 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.localserviceSubnet: 10.96.0.0/12podSubnet: 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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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=15simage: 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:443NOTE: 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 svcDashboard 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-adminnamespace: kubernetes-dashboardannotations: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: 420name: kube-proxyname: kube-proxy
可以看出kube-system daemonsets挂载了一个名叫kube-proxy的configmap卷作为配置文件,我们只需要修改kube-proxy即可。
kubectl -n kube-system edit configmap kube-proxy
ipvs:excludeCIDRs: nullminSyncPeriod: 0sscheduler: ""strictARP: falsesyncPeriod: 0stcpFinTimeout: 0stcpTimeout: 0sudpTimeout: 0skind: KubeProxyConfigurationlogging:flushFrequency: 0options:json:infoBufferSize: "0"text:infoBufferSize: "0"verbosity: 0metricsBindAddress: ""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 noCERTIFICATE 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 clusterUsage: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 itselfall Renew all available certificatesapiserver Renew the certificate for serving the Kubernetes APIapiserver-etcd-client Renew the certificate the apiserver uses to access etcdapiserver-kubelet-client Renew the certificate for the API server to connect to kubeletcontroller-manager.conf Renew the certificate embedded in the kubeconfig file for the controller manager to useetcd-healthcheck-client Renew the certificate for liveness probes to healthcheck etcdetcd-peer Renew the certificate for etcd nodes to communicate with each otheretcd-server Renew the certificate for serving etcdfront-proxy-client Renew the certificate for the front proxy clientscheduler.conf Renew the certificate embedded in the kubeconfig file for the scheduler manager to usesuper-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/proxyTo 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/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.