Как ограничить доступ к некоторому пространству имен Kubernetes, разрешив доступ только некоторым модулям?

#kubernetes

#kubernetes

Вопрос:

У меня есть следующий сервис:

 apiVersion: v1
kind: Service
metadata:
  name: foo
  labels:
    app: foo
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 8080
      protocol: TCP
      name: foo
  selector:
    app: foo
  

Эта служба указывает на следующее развертывание:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: foo
  labels:
    app: foo
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: foo
  template:
    metadata:
      labels:
        app: foo
    spec:
      containers:
        - name: foo
          image: gcr.io/foo:1.0.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
  

У меня также есть другое развертывание:

 apiVersion: apps/v1
kind: Deployment
metadata:
  name: bar
  labels:
    app: bar
spec:
  selector:
    matchLabels:
      app: bar
  template:
    metadata:
      labels:
        app: bar
    spec:
      containers:
        - name: bar
          image: gcr.io/bar:1.0.0
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080
  

foo развертывается в пространстве имен Kubernetes под названием kube-protected , bar развертывается в пространстве имен Kubernetes по умолчанию.

foo содержит данные импорта и должен быть хорошо защищен.

Пространство имен Kubernetes по умолчанию также может содержать другие развертывания: qux , baz и т.д.

Я хочу ограничить доступ к сервису, foo чтобы только bar к нему можно было получить доступ. Или другой способ — ограничить доступ к kube-protected пространству имен, чтобы только bar могли попасть в него.

РЕШЕНИЕ

 ---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: namespace-which-you-want-to-protect-network-policy
  namespace: namespace-which-you-want-to-protect
spec:
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: namespace-which-is-only-allowed-to-access-protected-namespace
      podSelector:
        matchLabels:
          app: application-which-is-only-allowed-to-access-protected-namespace
  podSelector: {}
  

Комментарии:

1. Когда вы ссылаетесь на ресурс из другого пространства имен, вам нужно будет указать пространство имен, иначе ресурс не будет виден. Так что не уверен, поможет ли это, но также взгляните на эту ссылку .

2. @cookiedough Спасибо за ответ. Я думаю, что RBAC больше предназначен для контроля доступа в команде, но мой вопрос касается взаимодействия модулей. Проверьте мое решение в нижней части моего вопроса.

3. @yivo Привет, я попробовал ваше решение, но у меня оно не сработало. нужно ли нам создавать какой-либо дополнительный файл helm, чтобы ограничить входной доступ к пространствам имен

Ответ №1:

в этой ситуации вы можете использовать сетевую политику для ограничения доступа к foo

 kind: NetworkPolicy

apiVersion: networking.k8s.io/v1

metadata:

  name: access-nginx

spec:

  podSelector:

    matchLabels:

      app: foo

  ingress:

  - from:

    - podSelector:

        matchLabels:

          app: bar
  

Комментарии:

1. Не знал, что эта функция существует! Большое вам спасибо! Я поиграю с этим и отвечу.

2. Большое вам спасибо. Я опубликовал решение в нижней части моего вопроса.