Доступ к сервису kubernetes от C# docker - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь получить доступ к службе Kubernetes, используя C# docker в службе kuberentes.

У меня есть файл YAML python docker, и я хочу создать модуль, используя тот же YAML программно из c# Сделайте tnet ядро ​​docker, которое работает в том же кластере python docker. Я нашел Kubernetes api для ядра do tnet. Я создал код для модулей списка, который ниже.

using System;
using k8s;

namespace simple
{
    internal class PodList
    {
        private static void Main(string[] args)
        {
            var config = KubernetesClientConfiguration.InClusterConfig();
            IKubernetes client = new Kubernetes(config);
            Console.WriteLine("Starting Request!");

            var list = client.ListNamespacedPod("default");
            foreach (var item in list.Items)
            {
                Console.WriteLine(item.Metadata.Name);
            }

            if (list.Items.Count == 0)
            {
                Console.WriteLine("Empty!");
            }
        }
    }
}

этот код получает ошибку Запрещено («Операция вернула недопустимый код статуса« Запрещено »»). вместо InClusterConfig с использованием BuildConfigFromConfigFile код работает в локальной среде. Что я пропустил?

Отредактировано

apiVersion: v1
kind: ServiceAccount
metadata:
  name: test-serviceaccount
  namespace: api

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: api
  name: test-role
rules:
    - apiGroups: ["","apps","batch"]
      # "" indicates the core API group
      resources: ["deployments", "namespaces","cronjobs"]
      verbs: ["get", "list", "update", "patch","create"]  
  

  
---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: test-binding
  namespace: api
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: test-role
subjects:
  - kind: ServiceAccount
    name: test-serviceaccount
    namespace: api

---


apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "4"
  creationTimestamp: "2019-07-04T16:05:43Z"
  generation: 4
  labels:
    app: test-console
    tier: middle-end
  name: test-console
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: test-console
      tier: middle-end
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: "2019-07-04T16:05:43Z"
      labels:
        app: test-console
        tier: middle-end
    spec:
      serviceAccountName: test-serviceaccount
      containers:
      - image: test.azurecr.io/tester:1.0.0
        imagePullPolicy: Always
        name: test-console
        ports:
        - containerPort: 80
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      imagePullSecrets:
      - name: pull
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      
C# code

  client.CreateNamespacedCronJob(jobmodel, "testnamesapce");
crone job
 'apiVersion': 'batch/v1beta1',
    'kind': 'CronJob',
    'metadata': {
        'creationTimestamp': '2020-08-04T06:29:19Z',
        'name': 'forcaster-cron',
        'namespace': 'testnamesapce'
    },

1 Ответ

2 голосов
/ 03 августа 2020

InClusterConfig использует учетную запись службы default пространства имен, в котором вы развертываете модуль. По умолчанию в этой учетной записи службы не будет RBA C, что приведет к ошибке Forbidden.

Причина, по которой он работает в локальной среде, заключается в том, что он использует учетные данные из файла kubeconfig которые в большинстве случаев являются учетными данными администратора с разрешением root уровня RBA C для кластера.

Вам необходимо определить Role и привязать эту роль к учетной записи службы, используя RoleBinding

Итак, если вы развертываете модуль в пространстве имен default, то должно работать ниже RBA C.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: myrole
  namespace: default
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: role-binding
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: myrole
subjects:
- kind: ServiceAccount
  name: default
  namespace: default

После того, как вы примените выше RBA C, вы можете проверить разрешение учетной записи службы используя команду ниже

kubectl auth can-i list pods --as=system:serviceaccount:default:default -n default
yes
...