ClusterRole and ClusterRoleBinding creation

Great! Sounds good–we now know that clearing the issue with the KongClusterPlugin requirement and providing ready-made Role-only manifests should address this use case for others in the future. Thanks for working through this in your environment to confirm!

Hi @jondow,
do you still have access to the custom kong ingress controller image? If yes, do you mind sharing how you did it?
I tried commenting out the line //informers = append(informers, kongClusterPluginInformer) and run make container then push the image to my repo, refer it to the yaml file:

    apiVersion: v1
    kind: Namespace
    metadata:
      name: testing
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: kongconsumers.configuration.konghq.com
    spec:
      additionalPrinterColumns:
      - JSONPath: .username
        description: Username of a Kong Consumer
        name: Username
        type: string
      - JSONPath: .metadata.creationTimestamp
        description: Age
        name: Age
        type: date
      group: configuration.konghq.com
      names:
        kind: KongConsumer
        plural: kongconsumers
        shortNames:
        - kc
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            credentials:
              items:
                type: string
              type: array
            custom_id:
              type: string
            username:
              type: string
      version: v1
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: kongcredentials.configuration.konghq.com
    spec:
      additionalPrinterColumns:
      - JSONPath: .type
        description: Type of credential
        name: Credential-type
        type: string
      - JSONPath: .metadata.creationTimestamp
        description: Age
        name: Age
        type: date
      - JSONPath: .consumerRef
        description: Owner of the credential
        name: Consumer-Ref
        type: string
      group: configuration.konghq.com
      names:
        kind: KongCredential
        plural: kongcredentials
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            consumerRef:
              type: string
            type:
              type: string
          required:
          - consumerRef
          - type
      version: v1
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: kongingresses.configuration.konghq.com
    spec:
      group: configuration.konghq.com
      names:
        kind: KongIngress
        plural: kongingresses
        shortNames:
        - ki
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            proxy:
              properties:
                connect_timeout:
                  minimum: 0
                  type: integer
                path:
                  pattern: ^/.*$
                  type: string
                protocol:
                  enum:
                  - http
                  - https
                  - grpc
                  - grpcs
                  - tcp
                  - tls
                  type: string
                read_timeout:
                  minimum: 0
                  type: integer
                retries:
                  minimum: 0
                  type: integer
                write_timeout:
                  minimum: 0
                  type: integer
              type: object
            route:
              properties:
                headers:
                  additionalProperties:
                    items:
                      type: string
                    type: array
                  type: object
                https_redirect_status_code:
                  type: integer
                methods:
                  items:
                    type: string
                  type: array
                path_handling:
                  enum:
                  - v0
                  - v1
                  type: string
                preserve_host:
                  type: boolean
                protocols:
                  items:
                    enum:
                    - http
                    - https
                    - grpc
                    - grpcs
                    - tcp
                    - tls
                    type: string
                  type: array
                regex_priority:
                  type: integer
                strip_path:
                  type: boolean
            upstream:
              properties:
                algorithm:
                  enum:
                  - round-robin
                  - consistent-hashing
                  - least-connections
                  type: string
                hash_fallback:
                  type: string
                hash_fallback_header:
                  type: string
                hash_on:
                  type: string
                hash_on_cookie:
                  type: string
                hash_on_cookie_path:
                  type: string
                hash_on_header:
                  type: string
                healthchecks:
                  properties:
                    active:
                      properties:
                        concurrency:
                          minimum: 1
                          type: integer
                        healthy:
                          properties:
                            http_statuses:
                              items:
                                type: integer
                              type: array
                            interval:
                              minimum: 0
                              type: integer
                            successes:
                              minimum: 0
                              type: integer
                          type: object
                        http_path:
                          pattern: ^/.*$
                          type: string
                        timeout:
                          minimum: 0
                          type: integer
                        unhealthy:
                          properties:
                            http_failures:
                              minimum: 0
                              type: integer
                            http_statuses:
                              items:
                                type: integer
                              type: array
                            interval:
                              minimum: 0
                              type: integer
                            tcp_failures:
                              minimum: 0
                              type: integer
                            timeout:
                              minimum: 0
                              type: integer
                          type: object
                      type: object
                    passive:
                      properties:
                        healthy:
                          properties:
                            http_statuses:
                              items:
                                type: integer
                              type: array
                            interval:
                              minimum: 0
                              type: integer
                            successes:
                              minimum: 0
                              type: integer
                          type: object
                        unhealthy:
                          properties:
                            http_failures:
                              minimum: 0
                              type: integer
                            http_statuses:
                              items:
                                type: integer
                              type: array
                            interval:
                              minimum: 0
                              type: integer
                            tcp_failures:
                              minimum: 0
                              type: integer
                            timeout:
                              minimum: 0
                              type: integer
                          type: object
                      type: object
                    threshold:
                      type: integer
                  type: object
                host_header:
                  type: string
                slots:
                  minimum: 10
                  type: integer
              type: object
      version: v1
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: kongplugins.configuration.konghq.com
    spec:
      additionalPrinterColumns:
      - JSONPath: .plugin
        description: Name of the plugin
        name: Plugin-Type
        type: string
      - JSONPath: .metadata.creationTimestamp
        description: Age
        name: Age
        type: date
      - JSONPath: .disabled
        description: Indicates if the plugin is disabled
        name: Disabled
        priority: 1
        type: boolean
      - JSONPath: .config
        description: Configuration of the plugin
        name: Config
        priority: 1
        type: string
      group: configuration.konghq.com
      names:
        kind: KongPlugin
        plural: kongplugins
        shortNames:
        - kp
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            config:
              type: object
            configFrom:
              properties:
                secretKeyRef:
                  properties:
                    key:
                      type: string
                    name:
                      type: string
                  required:
                  - name
                  - key
                  type: object
              type: object
            disabled:
              type: boolean
            plugin:
              type: string
            protocols:
              items:
                enum:
                - http
                - https
                - grpc
                - grpcs
                - tcp
                - tls
                type: string
              type: array
            run_on:
              enum:
              - first
              - second
              - all
              type: string
          required:
          - plugin
      version: v1
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: tcpingresses.configuration.konghq.com
    spec:
      additionalPrinterColumns:
      - JSONPath: .status.loadBalancer.ingress[*].ip
        description: Address of the load balancer
        name: Address
        type: string
      - JSONPath: .metadata.creationTimestamp
        description: Age
        name: Age
        type: date
      group: configuration.konghq.com
      names:
        kind: TCPIngress
        plural: tcpingresses
      scope: Namespaced
      subresources:
        status: {}
      validation:
        openAPIV3Schema:
          properties:
            apiVersion:
              type: string
            kind:
              type: string
            metadata:
              type: object
            spec:
              properties:
                rules:
                  items:
                    properties:
                      backend:
                        properties:
                          serviceName:
                            type: string
                          servicePort:
                            format: int32
                            type: integer
                        type: object
                      host:
                        type: string
                      port:
                        format: int32
                        type: integer
                    type: object
                  type: array
                tls:
                  items:
                    properties:
                      hosts:
                        items:
                          type: string
                        type: array
                      secretName:
                        type: string
                    type: object
                  type: array
              type: object
            status:
              type: object
      version: v1beta1
    status:
      acceptedNames:
        kind: ""
        plural: ""
      conditions: []
      storedVersions: []
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: kong-serviceaccount
      namespace: testing
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: Role
    metadata:
      name: kong-ingress-namespace-role
      namespace: testing
    rules:
    - apiGroups:
      - ""
      resources:
      - endpoints
      - nodes
      - pods
      - secrets
      verbs:
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - nodes
      verbs:
      - get
    - apiGroups:
      - ""
      resources:
      - services
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - networking.k8s.io
      - extensions
      - networking.internal.knative.dev
      resources:
      - ingresses
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - events
      verbs:
      - create
      - patch
    - apiGroups:
      - networking.k8s.io
      - extensions
      - networking.internal.knative.dev
      resources:
      - ingresses/status
      verbs:
      - update
    - apiGroups:
      - configuration.konghq.com
      resources:
      - tcpingresses/status
      verbs:
      - update
    - apiGroups:
      - configuration.konghq.com
      resources:
      - kongplugins  
      - kongcredentials
      - kongconsumers
      - kongingresses
      - tcpingresses
      verbs:
      - get
      - list
      - watch
    - apiGroups:
      - ""
      resources:
      - configmaps
      verbs:
      - create
      - get
      - update
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: RoleBinding
    metadata:
      name: kong-ingress-namespace-role-nisa-binding
      namespace: testing
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: kong-ingress-namespace-role
    subjects:
    - kind: ServiceAccount
      name: kong-serviceaccount
      namespace: testing
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: kong-proxy
      namespace: testing
    spec:
      ports:
      - name: proxy
        port: 80
        protocol: TCP
        targetPort: 8000
      - name: proxy-ssl
        port: 443
        protocol: TCP
        targetPort: 8443
      selector:
        app: ingress-kong
      type: LoadBalancer
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: ingress-kong
      name: ingress-kong
      namespace: testing
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ingress-kong
      template:
        metadata:             
          labels:
            app: ingress-kong
        spec:
          containers:
          - env:
            - name: KONG_PROXY_LISTEN
              value: 0.0.0.0:8000, 0.0.0.0:8443 ssl http2
            - name: KONG_ADMIN_LISTEN
              value: 127.0.0.1:8444 ssl
            - name: KONG_STATUS_LISTEN
              value: 0.0.0.0:8100
            - name: KONG_DATABASE
              value: "off"
            - name: KONG_NGINX_WORKER_PROCESSES
              value: "1"
            - name: KONG_ADMIN_ACCESS_LOG
              value: /dev/stdout
            - name: KONG_ADMIN_ERROR_LOG
              value: /dev/stderr
            - name: KONG_PROXY_ERROR_LOG
              value: /dev/stderr       
            - name: KONG_PLUGINS
              value: "oidc, rate-limiting"
            image: docker.io/thiennd/kong-oidc-img
            lifecycle:
              preStop:
                exec:
                  command:
                  - /bin/sh
                  - -c
                  - kong quit
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /status
                port: 8100
                scheme: HTTP
              initialDelaySeconds: 5
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: proxy
            ports:
            - containerPort: 8000
              name: proxy
              protocol: TCP
            - containerPort: 8443
              name: proxy-ssl
              protocol: TCP
            - containerPort: 8100
              name: metrics
              protocol: TCP
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /status
                port: 8100
                scheme: HTTP
              initialDelaySeconds: 5
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            securityContext:
              runAsUser: 1000
          - env:
            - name: CONTROLLER_KONG_ADMIN_URL
              value: https://127.0.0.1:8444
            - name: CONTROLLER_KONG_ADMIN_TLS_SKIP_VERIFY
              value: "true"        
            - name: CONTROLLER_PUBLISH_SERVICE
              value: testing/kong-proxy
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            image: docker.io/thiennd/custom-kong-ingress-controller
            imagePullPolicy: IfNotPresent
            livenessProbe:
              failureThreshold: 3
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
              initialDelaySeconds: 5
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
            name: ingress-controller
            readinessProbe:
              failureThreshold: 3
              httpGet:
                path: /healthz
                port: 10254
                scheme: HTTP
              initialDelaySeconds: 5
              periodSeconds: 10
              successThreshold: 1
              timeoutSeconds: 1
          serviceAccountName: kong-serviceaccount

But after I applied the yaml file, only the proxy started successfully, the ingress-controller throws these logs:

	E0902 10:26:18.259379       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1beta1.TCPIngress: tcpingresses.configuration.konghq.com is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "tcpingresses" in API group "configuration.konghq.com" at the cluster scope
	E0902 10:26:18.263386       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.Secret: secrets is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "secrets" in API group "" at the cluster scope
	E0902 10:26:18.264149       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.KongCredential: kongcredentials.configuration.konghq.com is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "kongcredentials" in API group "configuration.konghq.com" at the cluster scope
	E0902 10:26:18.268128       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.KongPlugin: kongplugins.configuration.konghq.com is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "kongplugins" in API group "configuration.konghq.com" at the cluster scope
	E0902 10:26:18.271741       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.KongIngress: kongingresses.configuration.konghq.com is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "kongingresses" in API group "configuration.konghq.com" at the cluster scope
	E0902 10:26:18.272826       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.4/tools/cache/reflector.go:105: Failed to list *v1.KongConsumer: kongconsumers.configuration.konghq.com is forbidden: User "system:serviceaccount:devgcp:kong-serviceaccount" cannot list resource "kongconsumers" in API group "configuration.konghq.com" at the cluster scope 

Thanks,
Best regards.

Hi Lafonte,
It seems that your your kong insgress controller is still getting the old kong-ingress-controller image. Did you push the new image to the docker registry. I see the imagePullPolicy in your yaml = IfNotPresent, try to change it to Always and make sure that you push the new version of the kong-ingress-controller image in your private docker registry.

Thanks
Stan