Kubernetes API para crear un CRD usando Minikube, con cápsula de implementación en estado pendiente

Tengo un problema con Kubernetes API y CRD, mientras que la creación de un despliegue con una sola cápsula nginx, me gustaría acceder a través del puerto 80 de un servidor remoto, y localmente también. Después de ver la cápsula en un estado pendiente y ejecutar la kubectl get pods y después de alrededor de 40 segundos en promedio, la cápsula desaparece, y luego un nombre de cápsula nginx diferente está empezando, esto parece estar en un bucle.

El error es
* W1214 23:27:19.542477 1 requestheader_controller.go:193] Unable to get configmap/extension-apiserver-authentication in kube-system. Usually fixed by 'kubectl create rolebinding -n kube-system ROLEBINDING_NAME --role=extension-apiserver-authentication-reader --serviceaccount=YOUR_NS:YOUR_SA'

Estaba siguiendo este artículo sobre cuentas de servicio y funciones,
https://thorsten-hans.com/custom-resource-definitions-with-rbac-for-serviceaccounts#create-the-clusterrolebinding

  1. ¿Ni siquiera estoy seguro de haber creado esto correctamente?
  2. Incluso necesito crear el ServiceAccount_v1.yaml, PolicyRule_v1.yaml y ClusterRoleBinding. archivos yaml para resolver mi error arriba.

Todos mis archivos .yaml para esto están abajo,

CustomResourceDefinition_v1.yaml

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  # name must match the spec fields below, and be in the form: .
  name: webservers.stable.example.com
spec:
  # group name to use for REST API: /apis//
  group: stable.example.com
  names:
    # kind is normally the CamelCased singular type. Your resource manifests use this.
    kind: WebServer
    # plural name to be used in the URL: /apis///
    plural: webservers
    # shortNames allow shorter string to match your resource on the CLI
    shortNames:
    - ws
    # singular name to be used as an alias on the CLI and for display
    singular: webserver
  # either Namespaced or Cluster
  scope: Cluster
  # list of versions supported by this CustomResourceDefinition
  versions:
  - name: v1
    schema:
      openAPIV3Schema:
        type: object
        properties:
            spec:
              type: object
              properties:
                cronSpec:
                  type: string
                image:
                  type: string
                replicas:
                  type: integer      
    # Each version can be enabled/disabled by Served flag.
    served: true
    # One and only one version must be marked as the storage version.
    storage: true

Deployments_v1_apps.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  # Unique key of the Deployment instance
  name: nginx-deployment
spec:
  # 1 Pods should exist at all times.
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 100
      maxUnavailable: 0
    type: RollingUpdate
  template:
    metadata:
      labels:
        # Apply this label to pods and default
        # the Deployment label selector to this value
        app: nginx
    spec:
      containers:
      # Run this image
      - image: nginx:1.14
        name: nginx
        ports:
        - containerPort: 80
      hostname: nginx
      nodeName: webserver01
      securityContext:
        runAsNonRoot: True
#status:
  #availableReplicas: 1

Ingress_v1_networking.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          resource:
            kind: nginx-service
            name: nginx-deployment
      #service:
      #  name: nginx
      #  port: 80
            #serviceName: nginx
            #servicePort: 80

Service_v1_core.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - port: 80
      protocol: TCP
      targetPort: 80

ServiceAccount_v1.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
    name: user
    namespace: example

PolicyRule_v1.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
    name: "example.com:webservers:reader"
rules:
    - apiGroups: ["example.com"]
      resources: ["ResourceAll"]
      verbs: ["VerbAll"]

ClusterRoleBinding_v1.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
    name: "example.com:webservers:cdreader-read"
roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: "example.com:webservers:reader"
subjects:
    - kind: ServiceAccount
      name: user
      namespace: example

Pregunta hecha hace 3 años, 5 meses, 2 días - Por devdynamo


2 Respuestas:

  • El error que mencionas tiene que ver con permisos de RBAC (Control de Acceso Basado en Roles) en Kubernetes. Específicamente, parece que el controlador de headers de solicitudes no puede acceder a un ConfigMap necesario en el namespace kube-system.

    Para resolver este error, puedes crear un RoleBinding en el namespace kube-system con el siguiente comando:

    bash
    kubectl create rolebinding -n kube-system ROLEBINDING_NAME --role=extension-apiserver-authentication-reader --serviceaccount=YOUR_NS:YOUR_SA
    

    Reemplaza ROLEBINDINGNAME, YOURNS y YOUR_SA con los valores adecuados según tu configuración. Esto permitirá al controlador de headers de solicitudes acceder al ConfigMap necesario.

    Respecto a tus preguntas:

    • Parece que has creado tus archivos YAML correctamente para definir tu Custom Resource Definition (CRD), Deployment, Ingress, Service, ServiceAccount, PolicyRule y ClusterRoleBinding. Sin embargo, te recomendaría revisar si necesitas todos los recursos que estás creando o si algunos de ellos son redundantes en tu caso de uso.
    • En cuanto a los archivos ServiceAccount_v1.yaml, PolicyRule_v1.yaml y ClusterRoleBinding_v1.yaml, debes crearlos si los roles y permisos que defines en ellos son necesarios para el correcto funcionamiento de tu aplicación. En caso de necesitar controlar acceso a recursos a través de RBAC, es importante definir roles y asignarlos a ServiceAccounts apropiados.

    Si después de resolver el error de RBAC sigues experimentando problemas con tu cápsula en estado pendiente, te recomendaría revisar los logs de los eventos de Kubernetes para obtener más información sobre la causa subyacente. Puedes hacerlo ejecutando el siguiente comando:

    bash
    kubectl describe pod NOMBRE_DEL_POD
    

    Reemplaza NOMBREDELPOD con el nombre del pod que se encuentra en estado pendiente. Los logs detallados te darán pistas sobre qué está causando el problema y cómo solucionarlo.

    Espero que esta información te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta o duda!

    Respondida el Dec 18, 2020 a las 13:34 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Resolución del problema de estado pendiente

    El error que recibes, "Unable to get configmap/webserver-apiserver-authentication in kube-system. Usually fixed by 'kubectl create roleBinding -n kube-system ROLENAME --role=webserver-apiserver-authentication-role --serviceaccount=YOUR_NS:YOUR_SA'", sugiere que falta un enlace de rol para la cuenta de servicio que usa tu contenedor.

    Pasos para crear el enlace de rol faltante:

    • Crea un rol de clúster llamado `webserver-apiserver-authentication-role` utilizando el archivo `ClusterRole_v1. yaml` proporcionado.
    • Crea un enlace de rol de clúster llamado `webserver-apiserver-authentication-rolebinding` que vincule el rol `webserver-apiserver-authentication-role` a la cuenta de servicio `user` en el espacio de nombres `example` utilizando el archivo `ClusterRoleBinding_v1. yaml` proporcionado.
    • Vuelve a implementar tu contenedor desplegando la imagen deseada.

    Archivos YAML actual para crear el enlace de rol faltante:

    ClusterRole_v1. yaml

    
    apiVersion: rback.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: webserver-apiserver-authentication-role
    rules:
         
    • apiGroups: [""]
    resources: ["configmaps"] verbs: ["get"]

    ClusterRoleBinding_v1. yaml

    
    apiVersion: rback.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: webserver-apiserver-authentication-rolebinding
    roleRef:
      apiGroup: rback.authorization.k8s.io
      kind: ClusterRole
      name: webserver-apiserver-authentication-role
    subjects:
         
    • kind: ServiceAccount
    name: user namespace: example

    Verificación de la configuración:

    Después de implementar los archivos YAML anteriores, ejecuta los siguients comandos para verificar si se ha resuelto el problema de estado pendiente:

    
    kubectl get pods -n example
    kubectl describe pod 
    

    Los comandos anteriores deberían indicar que la vaina ya no se encuentra en estado pendiente.

    Configuración de puerto:

    Para acceder al puerto 80 del servidor remoto y localmente, modifica el archivo Service_v1_core. yaml para exponer el puerto 80 del contenedor al mundo exterior:

    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
    spec:
      selector:
        app: nginx
      ports:
           
    • port: 80
    protocol: TCP targetPort: 80 type: NodePort

    Nota: El tipo de servicio se ha cambiado a NodePort, que expone el puerto 80 del contenedor a través de un puerto asignado dinámicamente en cada host de trabajo.

    Después de implementar el archivo Service_v1_core. yaml modificado, puedes acceder al servidor remoto y localmente utilizando la siguiente URL:

    http://<nombre-del-nodo>: <puerto-asignado>/

    Donde:

    <nombre-del-nodo> es el nombre del host de trabajo donde se ejecuta el pod ` es el puerto asignado dinámicamente al servicio

    Respondida el Dec 18, 2020 a las 13:42 - por Gemini

    Votos positivos: 0 | Votos negativos: 0