최신 Kubernetes 수신의 AKS HTTP 애플리케이션 라우팅 문제



나는 기본적으로 멋진 생성 도메인과 NGINX 인그레스 컨트롤러로 DNS sone을 생성하는 AKS용 HTTP 애플리케이션 라우팅 애드온을 사용하는 클라이언트와 함께 작업하고 있었습니다. 분명히 프로덕션 워크로드에 사용하려는 것은 아니지만 테스트 배포를 생성하고 있고 완전히 자동화된 간편한 Ingress를 원하는 경우에 유용합니다.

글쎄, 우리가 그것을 작동 시키면 좋을 것입니다. 나는 전에 이 애드온을 사용한 적이 없지만 문서를 읽을 때 특별한 단계가 필요하지 않았지만 어떤 이유로 작동하지 않았습니다.

알고 보니 일부 내부 구성 요소를 업데이트하는 데 사용되는 서비스 계정에 충분한 액세스 권한이 없었습니다. Azure RBAC와 일반 Kubernetes RBAC를 모두 사용해 보았지만 여전히 작동하지 않습니다. 새 인그레스를 만들 때 외부 IP로 매우 빠르게 업데이트되어야 하지만 그런 일은 일어나지 않았습니다.



여기에서 볼 수 있듯이 주소가 설정되지 않은 상태로 거의 1시간 동안 존재한 두 개의 Ingress가 있습니다. 클래스도 비어 있었지만 주석을 통해 설정되었습니다.

수신 컨트롤러에 대한 로그를 확인했을 때 다음 메시지가 표시됩니다.

W0920 17:43:32.171988 7 status.go:288] error updating ingress rule: ingresses.networking.k8s.io "cm-acme-http-solver-99lwz" is forbidden: User "system:serviceaccount:kube-system:addon-http-application-routing-nginx-ingress-serviceaccount" cannot update resource "ingresses/status" in API group "networking.k8s.io" in the namespace "ris-pullrequest1628": Azure does not have opinion for this user.
W0920 17:43:32.172332 7 status.go:288] error updating ingress rule: ingresses.networking.k8s.io "cm-acme-http-solver-slr4j" is forbidden: User "system:serviceaccount:kube-system:addon-http-application-routing-nginx-ingress-serviceaccount" cannot update resource "ingresses/status" in API group "networking.k8s.io" in the namespace "ris-dev": Azure does not have opinion for this user.
W0920 17:43:32.366825 7 status.go:288] error updating ingress rule: ingresses.networking.k8s.io "cm-acme-http-solver-5ffk2" is forbidden: User "system:serviceaccount:kube-system:addon-http-application-routing-nginx-ingress-serviceaccount" cannot update resource "ingresses/status" in API group "networking.k8s.io" in the namespace "rstest01": Azure does not have opinion for this user.


그러면 이 추가 기능에 대해 Azure에서 만든 ClusterRole로 이동합니다.



Ingress의 상태를 업데이트할 권한이 있지만 버전 1.22에서 제거될 APIGroup extensions/v1beta1만 사용합니다. Cert-Manager를 사용하는 경우 최신 버전이 ACME에 대한 안정적인 버전 Ingress 리소스를 생성하기 때문에 문제가 됩니다. 따라서 이전 API 그룹을 사용하도록 코드를 업데이트하더라도 여전히 작동하지 않습니다.

애드온 관리자를 읽은 후 addonmanager.kubernetes.io/mode=Reconcile이라는 레이블이 있는 것을 보았습니다. 나는 이것들을 제거할 수 있지만, 그것은 그 프로세스를 변경하고 일반적으로 예기치 않은 동작으로 끝나는 내 경험에서 볼 수 있습니다. 그래서 다음에 시도한 것은 서비스 계정을 추가할 수 있는 나만의 역할과 역할을 만드는 것이었습니다.

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: addon-http-app-routing-fix
rules:
- apiGroups:
  - "networking.k8s.io"
  resources: 
  - "ingresses/status"
  verbs:
  - "update"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: addon-http-app-routing-fix-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: addon-http-app-routing-fix
subjects:
  - kind: ServiceAccount
    name: addon-http-application-routing-nginx-ingress-serviceaccount
    namespace: kube-system
---


이것은 꽤 잘 작동했지만 한 가지 문제가 남아 있습니다. DNS 영역은 인그레스를 기반으로 업데이트되지 않습니다. 이에 사용된 서비스 계정의 권한을 확인했을 때 이전 APIGroup을 참조하고 있었습니다... 그래서 역할이 Ingress 개체를 확인하고 해당 서비스 계정에 역할을 바인딩할 수 있도록 규칙을 업데이트하고 있습니다. .

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: addon-http-app-routing-fix
rules:
- apiGroups:
  - "networking.k8s.io"
  resources: 
  - "ingresses/status"
  verbs:
  - "update"
- apiGroups:
  - "networking.k8s.io"
  resources:
    - "ingresses"
  verbs:
    - "get"
    - "watch"
    - "list"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: addon-http-app-routing-fix-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: addon-http-app-routing-fix
subjects:
  - kind: ServiceAccount
    name: addon-http-application-routing-nginx-ingress-serviceaccount
    namespace: kube-system
  - kind: ServiceAccount
    name: addon-http-application-routing-external-dns
    namespace: kube-system
---


그리고 그것은 그것을 해결합니다. 분명히 이전 베타 API 제거를 마무리하고 있으므로 이 문제는 지금쯤 해결되었어야 하지만 그렇지 않은 것 같습니다.

좋은 웹페이지 즐겨찾기