K8S二进制部署exec unable to upgrade connection: Unauthorized异常解决方案

K8S二进制部署exec unable to upgrade connection: Unauthorized异常解决方案

1. 异常分析

当执行kubectl exec、logs、port-forward 等需要"升级连接"(WebSocket/SPDY)的命令时,流程如下

  1. kubectl → kube-apiserver,使用 ~/.kube/config中的认证,通常是 cluster-admin 权限
  2. kube-apiserver 代表自己连接目标 Pod 所在节点的 kubelet(通过节点的 10250 端口),执行 exec 等操作
  3. 这个连接本质是:apiservers使用kube-apiserver 的证书 CN对 nodes/proxy 子资源执行 create 操作
    不仅需要在apiserver的启动参数中添加--enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction --authorization-mode=RBAC,还需要RBAC 中对 apiserver 自身证书对应的用户授予 nodes/proxy 的权限
bash 复制代码
# 笔者的apiserver的启动参数如下:

/usr/local/bin/kube-apiserver --v=2 --etcd-servers=https://192.168.101.40:2379 --bind-address=192.168.101.40 --secure-port=6443 --advertise-address=192.168.101.40 --allow-privileged=true --service-cluster-ip-range=10.0.0.0/24 --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction --authorization-mode=RBAC,Node --enable-bootstrap-token-auth=true --service-node-port-range=30000-32767 --kubelet-client-certificate=/etc/kubernetes/pki/kubernetes.pem --kubelet-client-key=/etc/kubernetes/pki/kubernetes-key.pem --tls-cert-file=/etc/kubernetes/pki/kubernetes.pem --tls-private-key-file=/etc/kubernetes/pki/kubernetes-key.pem --client-ca-file=/etc/kubernetes/pki/ca.pem --service-account-key-file=/etc/kubernetes/pki/sa.pub --service-account-issuer=https://192.168.101.40:6443 --service-account-signing-key-file=/etc/kubernetes/pki/sa.key --etcd-cafile=/etc/etcd/ssl/ca.pem --etcd-certfile=/etc/etcd/ssl/etcd-server.pem --etcd-keyfile=/etc/etcd/ssl/etcd-server-key.pem --requestheader-client-ca-file=/etc/kubernetes/pki/ca.pem --proxy-client-cert-file=/etc/kubernetes/pki/kubernetes.pem --proxy-client-key-file=/etc/kubernetes/pki/kubernetes-key.pem --requestheader-allowed-names=kubernetes --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --enable-aggregator-routing=true --audit-log-maxage=30 --audit-log-maxbackup=3 --audit-log-maxsize=100 --audit-log-path=/var/log/kubernetes/k8s-audit.log

2. 解决方案

bash 复制代码
cat > apiserver-to-kubelet.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: system:kubernetes-to-kubelet
rules:
- apiGroups:
  - ""
  resources:
  - nodes/proxy
  - nodes/stats
  - nodes/log
  - nodes/spec
  - nodes/metrics
  verbs:
  - "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:kubernetes
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kubernetes-to-kubelet
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: kubernetes
EOF
# 注意需要修改name,根据自己集群中的name

kubectl apply -f apiserver-to-kubelet.yaml
相关推荐
CodeMartain1 小时前
Dify Windows 原生部署(无 Docker、纯本地)
运维·docker·容器
牛奶咖啡132 小时前
k8s容器编排技术实践——使用containerd作为容器运行时部署k8s集群
kubernetes·k8s的安装部署·开启系统的ipvs支持·安装containerd·containerd配置加速器·安装k8s的工具·安装calico网络插件
万里侯3 小时前
云原生数据备份与恢复:保障数据安全的最佳实践
微服务·容器·k8s
llrraa20103 小时前
配置docker国内镜像源
运维·docker·容器
阿里云云原生3 小时前
阿里云 STAROps 全域智能运维平台发布!从“被动救火”到“主动自治”
云原生
2301_780789664 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
35岁程序员的自救之路4 小时前
AiBBS - 面向下一个十年的AI + 云原生社区系统
人工智能·云原生
珂玥c5 小时前
k8s集群ingress碎碎念
云原生·容器·kubernetes
佳杰云星5 小时前
如何给大模型集群选“大脑”?智算调度与管理平台 10 维选型指南(附选型评分表)
人工智能·kubernetes·大模型·云计算·gpu·算力调度·智算中心
比特森林探险记7 小时前
context 在 gRPC / Gin / K8s 中的实战
容器·kubernetes·gin