当前位置: 首页 > news >正文

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.130master
192.169.100.131node
192.169.100.132node

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 CIDR
  • podSubnet: 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,功能如下介绍:

特性FlannelCalicoCilium
网络模型基于 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'.
http://www.dtcms.com/a/390752.html

相关文章:

  • 深入理解Buffer:数据世界的“蓄水池“
  • 通义万相开源 Wan2.2-S2V-14B,实现图片+音频生成电影级数字人视频
  • windows c++环境 使用VScdoe配置opencv
  • JVM(四)-- 对象的实例化内存布局和直接内存
  • G1垃圾回收器的优势
  • 内存分配策略
  • Python采集Tik Tok视频详情,Tik TokAPI接口(json数据返回)
  • 实时通信技术大比拼:长轮询、短轮询、WebSocket 与 SSE 深度解析及实战指南
  • ICML 2025|图像如何与激光雷达对齐并互补?迈向协调的多模态3D全景分割
  • 基于Web的3D工程应用图形引擎——HOOPS Communicator技术解析
  • 【每日一问】运放的失调电压是什么?对于电路有何影响?
  • 【轨物方案】轨物科技新型储能管理系统:以AIoT技术驱动储能资产全生命周期价值最大化
  • 线性回归 vs 逻辑回归:从原理到实战的全面对比
  • HashMap的底层原理
  • 股指期货超短线如何操作?
  • 【洛谷】算法竞赛中的树结构:形式、存储与遍历全解析
  • 育苗盘补苗路径规划研究
  • API Gateway :API网关组件
  • conda激活虚拟环境
  • 重构大qmt通达信板块预警自动交易系统--读取通达信成分股
  • 25.9.19 Spring AOP
  • d38: PostgreSQL 简单入门与 Vue3 动态路由实现
  • No006:订阅化时间管理——迈向个性化、生态化的AI服务模式
  • 微服务-sentinel的理论与集成springcloud
  • C++学习:哈希表unordered_set/unordered_map的封装
  • 圆柱永磁体磁场及梯度快速计算与可视化程序
  • 种群演化优化算法:原理与Python实现
  • 基于IPDRR模型能力,每个能力的概念及所要具备的能力产品
  • NUST技术漫谈:当非结构化数据遇见状态跟踪——一场静默的技术革命
  • 在技术无人区开路,OPPO的指南针是“人”