Istio 自动注入 sidecar 失败导致无法访问webhook服务的解决方法

 更新时间:2023年10月26日 10:37:21   作者:张志翔的博客  
最近工作中在部署Istio环境的过程中发现官方示例启动的pod不能访问不到Istio的webhook,这个问题也是困扰了我一天,我把他归类到sidecar注入失败的情况下,本文给大家分享问题解决方法,感兴趣的朋友跟随小编一起看看吧

最近工作中在部署Istio环境的过程中发现官方示例启动的pod不能访问不到Istio的webhook,这个问题也是困扰了我一天,我把他归类到sidecar注入失败的情况下,特此记录,便于日后查阅。

1、第一种可能(我遇到的情况)

如果自动注入时,报如下错误信息:

Error from server (InternalError): error when creating "STDIN": Internal error occurred: failed calling webhook "rev.validation.istio.io": failed to call webhook: Post "https://istiod.istio-system.svc:443/validate?timeout=10s": dial tcp 10.101.106.199:443: i/o timeout

造成上述问题的原因是 kube-apiserver 的 --enable-admission-plugins 没有配置 MutatingAdmissionWebhook,ValidatingAdmissionWebhook参数,所以解决问题的方法就是找到 kube-apiserver.yaml 配置文件,我是通过kubeadm安装的,所以路径在 /etc/kubernetes/manifests 下,把 --enable-admission-plugins 修改为 NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook 后保存文件,删掉 kube-apiserver 的pod,让他自己根据新的配置文件重新启动(注意:如果是用kubeadm安装的修改内容如果错误,可能会导致k8s集群中的kube-apiserver全部挂掉,导致无法访问集群,这时就需要从官网下载kube-apiserver二进制文件,重新拉起一个进程,再执行删除pod的操作),修改后文件内容如下:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 192.168.1.61:6443
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.1.61
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook
    - --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
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --feature-gates=RemoveSelfLink=false
    image: registry.aliyuncs.com/google_containers/kube-apiserver:v1.23.0
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 192.168.1.61
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    name: kube-apiserver
    readinessProbe:
      failureThreshold: 3
      httpGet:
        host: 192.168.1.61
        path: /readyz
        port: 6443
        scheme: HTTPS
      periodSeconds: 1
      timeoutSeconds: 15
    resources:
      requests:
        cpu: 250m
    startupProbe:
      failureThreshold: 24
      httpGet:
        host: 192.168.1.61
        path: /livez
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 10
      periodSeconds: 10
      timeoutSeconds: 15
    volumeMounts:
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki
      name: etc-pki
      readOnly: true
    - mountPath: /etc/kubernetes/pki
      name: k8s-certs
      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/pki
      type: DirectoryOrCreate
    name: etc-pki
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
status: {}

2、第二种可能

安装 Istio 时,配置了 enableNamespacesByDefault: false

sidecarInjectorWebhook:
  enabled: true
  # 变量为true,就会为所有命名空间开启自动注入功能。如果赋值为false,则只有标签为istio-injection的命名空间才会开启自动注入功能
  enableNamespacesByDefault: false
  rewriteAppHTTPProbe: false

解决方法:

# 设置标签
$ kubectl label namespace default istio-injection=enabled --overwrite
# 查看
$ kubectl get namespace -L istio-injection
NAME                   STATUS   AGE    ISTIO-INJECTION
default                Active   374d   enabled

如果要重新禁用注入istio sidecar,执行下面命令:

$ kubectl label namespace default istio-injection=disabled --overwrite

3、第三种可能

安装 Istio 时,设置 autoInject: disabled

proxy:
  includeIPRanges: 192.168.16.0/20,192.168.32.0/20
  # 是否开启自动注入功能,取值enabled则该pods只要没有被注解为sidecar.istio.io/inject: "false",就会自动注入。如果取值为disabled,则需要为pod设置注解sidecar.istio.io/inject: "true"才会进行注入
  autoInject: disabled

解决方法:

  • 第一个方法:设置 autoInject: enabled
  • 第二个方法:在 Pod 或者 Deployment 声明 sidecar.istio.io/inject: "true"  

到此这篇关于Istio 自动注入 sidecar 失败导致无法访问webhook服务的文章就介绍到这了,更多相关Istio 自动注入 sidecar 失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • k8s pod如何使用sriov

    k8s pod如何使用sriov

    这篇文章主要介绍了k8s pod如何使用sriov问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • MinIO使用基础教程(最新整理)

    MinIO使用基础教程(最新整理)

    文章介绍了MinIO云存储服务的快速安装和使用,并通过SpringBoot实现文件上传和查询的功能,感兴趣的朋友跟随小编一起看看吧
    2025-03-03
  • kubernetes(k8s)安装metrics-server实现资源使用情况监控方式详解

    kubernetes(k8s)安装metrics-server实现资源使用情况监控方式详解

    这篇文章主要介绍了kubernetes(k8s)安装metrics-server实现资源使用情况监控,包括Metrics Server下载方式, k8s集群安装部署metrics的问题,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 基于云服务MRS构建DolphinScheduler2调度系统的案例详解

    基于云服务MRS构建DolphinScheduler2调度系统的案例详解

    这篇文章主要介绍了基于云服务MRS构建DolphinScheduler2调度系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 在K8S中使用ArgoCD做持续部署的方案

    在K8S中使用ArgoCD做持续部署的方案

    ArgoCD是一个基于Kubernetes的GitOps持续交付工具,应用的部署和更新都可以在Git仓库上同步实现,并自带一个可视化界面,本文介绍如何使用Git+Argocd方式来实现在k8s中部署和更新应用服务,感兴趣的朋友一起看看吧
    2025-03-03
  • K8s搭建Jenkins的详细教程(附源代码)

    K8s搭建Jenkins的详细教程(附源代码)

    Jenkins 是一个开源的自动化服务器,主要用于持续集成和持续交付,这篇文章主要来和大家介绍一下如何在K8s中搭建Jenkins,有需要的可以了解下
    2025-03-03
  • 云原生技术kubernetes之volumes容器的使用

    云原生技术kubernetes之volumes容器的使用

    这篇文章主要为大家介绍了云原生技术kubernetes之volumes容器使用方式, 有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • 基于openEuler的Ceph分布式存储集群部署指南

    基于openEuler的Ceph分布式存储集群部署指南

    本文详细介绍了如何在openEuler22.03LTS操作系统上部署Ceph分布式存储集群,包括环境准备、软件仓库配置、集群初始化、存储节点部署、存储池创建、监控集成和性能优化等步骤,感兴趣的朋友一起看看吧
    2025-03-03
  • 阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    阿里云kubernetes查找镜像中jar包的方法(docker查看镜像中的jar)

    这篇文章主要给大家介绍了关于阿里云kubernetes查找镜像中jar包的方法,也就是在docker查看镜像中的jar,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • K8S内部pod之间相互调用案例以及详解

    K8S内部pod之间相互调用案例以及详解

    这篇文章主要给大家介绍了关于K8S内部pod之间相互调用案例的相关资料,Pod是Kubernetes中最小的可部署单元,它是一个或多个容器的集合,它们共享网络和存储资源,并在同一节点上运行,需要的朋友可以参考下
    2023-08-08

最新评论