AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1163539
Accepted
lsambo
lsambo
Asked: 2024-08-06 16:03:08 +0800 CST2024-08-06 16:03:08 +0800 CST 2024-08-06 16:03:08 +0800 CST

kubeadm 证书更新后,Kubernetes kube-apiserver 无法启动,oidc 连接被拒绝

  • 772

在具有 2 个 ubuntu 控制器集群的 Kubernetes 1.25 中,在检测到 /etc/kubernetes/pki 中的证书过期后,我们在两个控制器节点上启动了“kubeadm renew all”命令,然后重新启动了节点。

重启后,kube-apiserver 无法再启动,并且其 docker 容器不断崩溃。

docker 日志抱怨无法访问 oidc 服务器(它是一个 keycloak pod),因此似乎 oidc 连接器对于启动 api 服务器是必需的:

{"log":"I0805 13:24:51.011009       1 plugins.go:158] Loaded 12 mutating admission controller(s) successfully in the following order: NamespaceLifecycle,LimitRanger,ServiceAccount,NodeRestriction,TaintNodesByCondition,Priority,DefaultTolerationSeconds,DefaultStorageClass,StorageObjectInUseProtection,RuntimeClass,DefaultIngressClass,MutatingAdmissionWebhook.\n","stream":"stderr","time":"2024-08-05T13:24:51.011063776Z"}
{"log":"I0805 13:24:51.011027       1 plugins.go:161] Loaded 11 validating admission controller(s) successfully in the following order: LimitRanger,ServiceAccount,PodSecurity,Priority,PersistentVolumeClaimResize,RuntimeClass,CertificateApproval,CertificateSigning,CertificateSubjectRestriction,ValidatingAdmissionWebhook,ResourceQuota.\n","stream":"stderr","time":"2024-08-05T13:24:51.011072396Z"}
{"log":"I0805 13:24:51.013060       1 etcd.go:292] \"Using watch cache\" resource=\"customresourcedefinitions.apiextensions.k8s.io\"\n","stream":"stderr","time":"2024-08-05T13:24:51.013133647Z"}
{"log":"E0805 13:25:01.010261       1 oidc.go:335] oidc authenticator: initializing plugin: Get \"https://10.10.2.123/admin/master/console/#/MYORGANIZATION/.well-known/openid-configuration\": dial tcp 10.10.2.123:443: connect: connection refused\n","stream":"stderr","time":"2024-08-05T13:25:01.010450438Z"}
{"log":"E0805 13:25:11.009612       1 oidc.go:335] oidc authenticator: initializing plugin: Get \"https://10.10.2.123/admin/master/console/#/MYORGANIZATION/.well-known/openid-configuration\": dial tcp 10.10.2.123:443: connect: connection refused\n","stream":"stderr","time":"2024-08-05T13:25:11.009785705Z"}

kubelet 日志表明 kubelet 找不到第一个 kubernetes 节点(预计因为 kube-apiserver 不工作):

Aug 05 16:33:21 mynode1hostname kubelet[3556]: E0805 16:33:21.973266    3556 kubelet.go:2448] "Error getting node" err="node \"mynode1hostname\" not found"
Aug 05 16:33:22 mynode1hostname kubelet[3556]: E0805 16:33:22.032233    3556 controller.go:144] failed to ensure lease exists, will retry in 7s, error: Get "https://10.10.2.123:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/mynode1hostname?timeout=10s": dial tcp 10.10.2.123:6443: connect: connection refused
Aug 05 16:33:22 mynode1hostname kubelet[3556]: E0805 16:33:22.074320    3556 kubelet.go:2448] "Error getting node" err="node \"mynode1hostname\" not found"
Aug 05 16:33:22 mynode1hostname kubelet[3556]: E0805 16:33:22.083596    3556 file.go:182] "Provided manifest path is a directory, not recursing into manifest path" path="/etc/kubernetes/manifests/BACKUP"
Aug 05 16:33:22 mynode1hostname kubelet[3556]: E0805 16:33:22.174820    3556 kubelet.go:2448] "Error getting node" err="node \"mynode1hostname\" not found"

kube-apiserver.yaml 文件非常标准。我们尝试通过注释其行来删除 OIDC 依赖项,但无济于事,因为 kubelet 仍然抱怨无法到达 OIDC(因此 OIDC 看起来像循环死循环,因为 kubelet 无法在没有 oidc 的情况下启动,并且 keycloak pod 无法由于 kubelet 失败而启动等等):

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.10.2.123:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=10.10.2.123
    - --anynomous-auth=true
    - --allow-privileged=true
    - --audit-log-path=/var/log/kube-apiserver.log
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction
    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443
    - --service-account-issuer=https://kubernetes.default.svc.cluster.local
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --token-auth-file=/etc/kubernetes/passwords.csv
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
      #    - --oidc-issuer-url=https://10.10.2.123/admin/master/console/#/MYORGANIZATION
      #    - --oidc-client-id=Kubernetes
      #    - --oidc-username-claim=username
      #    - --oidc-groups-claim=group
    - -v=5
    image: registry.k8s.io/kube-apiserver:v1.25.11
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 10.10.2.123
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-apiserver
    readinessProbe:
      failureThreshold: 3
      httpGet:
        host: 10.10.2.123
        path: /readyz
        port: 6443
        scheme: HTTPS
      periodSeconds: 1
      timeoutSeconds: 15
    resources:
      requests:
        cpu: 250m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 10.10.2.123
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/ca-certificates
      name: etc-ca-certificates
      readOnly: true
    - mountPath: /etc/pki
      name: etc-pki
      readOnly: true
    - mountPath: /etc/kubernetes/pki
      name: k8s-certs
      readOnly: true
    - mountPath: /usr/local/share/ca-certificates
      name: usr-local-share-ca-certificates
      readOnly: true
    - mountPath: /usr/share/ca-certificates
      name: usr-share-ca-certificates
      readOnly: true
  hostNetwork: true
  priorityClassName: system-node-critical
  securityContext:
    seccompProfile:
      type: RuntimeDefault
  volumes:
  - hostPath:
      path: /etc/ssl/certs
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/ca-certificates
      type: DirectoryOrCreate
    name: etc-ca-certificates
  - hostPath:
      path: /etc/pki
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
  - hostPath:
      path: /usr/local/share/ca-certificates
      type: DirectoryOrCreate
    name: usr-local-share-ca-certificates
  - hostPath:
      path: /usr/share/ca-certificates
      type: DirectoryOrCreate
    name: usr-share-ca-certificates
status: {}

在更新 kubernetes 证书并重新启动节点后,有人也发现类似的情况吗?我尝试在 SO 中搜索,但没有此案例的明确证据。

先感谢您

ubuntu
  • 2 2 个回答
  • 78 Views

2 个回答

  • Voted
  1. Sai Chandini Routhu
    2024-08-06T20:42:11+08:002024-08-06T20:42:11+08:00

    根据问题标题,该问题似乎是续订后的证书不匹配以及与 OIDC 集成相关的潜在配置问题。

    请遵循以下故障排除步骤:

    • 确保 kube-apiserver 配置文件中指定的证书路径(/etc/kubernetes/pki/)正确并指向续订后新生成的证书,同时检查 kube-apiserver 的日志文件中是否存在与证书验证相关的具体错误消息。
    • 重新启动控制器节点和 kube apiserver pod。这样 kube-apiserver 就能够在不依赖 OIDC 的情况下启动。
    • 系统重启后,请确保 Keycloak pod 正常工作,可以通过执行以下命令进行验证:Kubectl get pods -n kube-system
    • 确保 keycloak 服务已公开并可从 kube-apiserver pod 访问。用于kubectl get service -n kube -system检查服务及其端点。
    • 确保您已检查网络连接问题或其他可能阻止 kube apiserver pod 和 keycloak 服务之间通信的防火墙或网络策略。
    • 如果所有这些故障排除步骤均不起作用,则意味着您的设置需要 OIDC,在这种情况下,我建议重新开始在每个控制器节点上使用 kubeadm init 和 kubeadm join 重新安装 kubernetes 集群,这可能会重新创建具有更新证书的集群状态,也许还会修复配置问题。

    有关更多信息,请参阅Bob Killen 撰写的此Github 链接 和Medium 博客。

    • 1
  2. Best Answer
    lsambo
    2024-08-09T22:48:02+08:002024-08-09T22:48:02+08:00

    对于可能遇到类似问题的任何人:oidc 依赖项需要一个 keycloak 功能端点。

    在我们的案例中,keycloak 无法正常运行(我们在其日志中发现,连接到其 postgresdb 存在问题)。

    我们从 kube-apiserver 完全禁用了 oidc 部分,这样 api-server 就可以在没有 oidc/sso/keycloak 集成的情况下启动。

    为了“强制” kube-apiserver 从/etc/kubernetes/manifests 中的最新 yaml 重新启动,我们看到从 /etc/kubernetes/manifests 中移出和移入 yamls 文件会以某种方式“触发” kube-apiserver docker 的重新部署(以及重新启动 kubelet 服务)。

    无论如何,kubelet 都会不断从 /etc/kubernetes/manifests 读取(如果您没有更改默认的 yaml 路径),因此从 kube-apiserver 中注释掉 oidc 行就足以启动新的 kube-apiserver docker。

    • 0

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve