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
相关推荐
雨奔5 小时前
Kubernetes DNS 完全指南:服务发现核心机制与实践
java·kubernetes·服务发现
米高梅狮子6 小时前
05.Kubernetes Volume和Kubernetes ConfigMap
云原生·容器·kubernetes
MAVER1CK12 小时前
Install VNC in Docker container
运维·docker·容器
眷蓝天15 小时前
kubectl 管理工具
kubernetes·kubectl
亚空间仓鼠15 小时前
Kubernetes技术入门与实践(二):常用命令
云原生·容器·kubernetes
LSL666_15 小时前
3 安装docker
运维·docker·容器
小江的记录本15 小时前
【微服务与云原生架构】DevOps、CI/CD流水线、GitOps 系统性知识体系
分布式·后端·ci/cd·微服务·云原生·架构·devops
LSL666_16 小时前
4 Docker 镜像安装与容器启动
运维·docker·容器
wuxinyan12317 小时前
Java面试题51:一文深入了解K8s 环境下企业级 CI/CD 流水线搭建
java·ci/cd·kubernetes·面试题
安逸sgr17 小时前
Hermes Agent + Obsidian 打造第二大脑(三):Docker 部署详解——从零到生产环境的完整实战指南!
运维·docker·容器·obsidian·hermes·hermesagent