在kubernetes cronjob中指定角色

时间:2019-12-13 14:52:36

标签: kubernetes istio

我们有一个运行istio代理的kubernetes集群。 最初,我创建了一个cronjob,它从数据库读取并更新一个值(如果找到)。效果很好。

然后事实证明,我们已经有一个服务来进行数据库更新,因此我将数据库代码更改为服务调用。

conn := dial.Service("service:3550", grpc.WithInsecure())
client := protobuf.NewServiceClient(conn)

client.Update(ctx)

但是istio拒绝带有RBAC错误的呼叫。它只是拒绝,没有说为什么。

是否可以向cronjob添加角色?我们该怎么做?

mTLS网格策略允许。

Kubernetes版本为1.17,而istio版本为1.3

API Version:  authentication.istio.io/v1alpha1
Kind:         MeshPolicy
Metadata:
  Creation Timestamp:  2019-12-05T16:06:08Z
  Generation:          1
  Resource Version:    6578
  Self Link:           /apis/authentication.istio.io/v1alpha1/meshpolicies/default
  UID:                 25f36b0f-1779-11ea-be8c-42010a84006d
Spec:
  Peers:
    Mtls:
      Mode:  PERMISSIVE

cronjob yaml

Name:                          cronjob
Namespace:                     serve
Labels:                        <none>
Annotations:                   <none>
Schedule:                      */30 * * * *
Concurrency Policy:            Allow
Suspend:                       False
Successful Job History Limit:  1
Failed Job History Limit:      3
Pod Template:
  Labels:  <none>
  Containers:
   service:
    Image:      service:latest
    Port:       <none>
    Host Port:  <none>
    Environment:
      JOB_NAME:                         (v1:metadata.name)
    Mounts:                            <none>
  Volumes:                             <none>
Last Schedule Time:                    Tue, 17 Dec 2019 09:00:00 +0100
Active Jobs:                           <none>
Events:

编辑 我已经为ClusterRBACConfig中的命名空间关闭了RBA,现在可以使用了。因此,我的结论是cronjobs受角色影响,因此应该可以添加角色并调用其他服务。

1 个答案:

答案 0 :(得分:1)

如果启用了RBAC,cronjob需要适当的权限才能运行。

在这种情况下,一种解决方案是将ServiceAccount添加到cronjob配置文件中,该文件具有足够的特权来执行所需的操作。

由于名称空间中已经有现有服务,因此可以使用以下方法检查特定ServiceAccount是否已存在NameSpace

$ kubectl get serviceaccounts -n serve

如果存在ServiceAccount,则可以将其添加到您的cronjob清单yaml文件中。

如本例所示:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: adwords-api-scale-up-cron-job
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      activeDeadlineSeconds: 100
      template:
        spec:
          serviceAccountName: scheduled-autoscaler-service-account
          containers:
          - name: adwords-api-scale-up-container
            image: bitnami/kubectl:1.15-debian-9
            command:
              - bash
            args:
              - "-xc"
              - |
                kubectl scale --replicas=2 --v=7 deployment/adwords-api-deployment
            volumeMounts:
            - name: kubectl-config
              mountPath: /.kube/
              readOnly: true
          volumes:
          - name: kubectl-config
            hostPath:
              path: $HOME/.kube # Replace $HOME with an evident path location
          restartPolicy: OnFailure

然后在Pod模板下应有可见的服务帐户:

$ kubectl describe cronjob adwords-api-scale-up-cron-job
Name:                          adwords-api-scale-up-cron-job
Namespace:                     default
Labels:                        <none>
Annotations:                   kubectl.kubernetes.io/last-applied-configuration:
                                 {"apiVersion":"batch/v1beta1","kind":"CronJob","metadata":{"annotations":{},"name":"adwords-api-scale-up-cron-job","namespace":"default"},...
Schedule:                      */2 * * * *
Concurrency Policy:            Allow
Suspend:                       False
Successful Job History Limit:  3
Failed Job History Limit:      1
Starting Deadline Seconds:     <unset>
Selector:                      <unset>
Parallelism:                   <unset>
Completions:                   <unset>
Active Deadline Seconds:       100s
Pod Template:
  Labels:           <none>
  Service Account:  scheduled-autoscaler-service-account
  Containers:
   adwords-api-scale-up-container:
    Image:      bitnami/kubectl:1.15-debian-9
    Port:       <none>
    Host Port:  <none>
    Command:
      bash
    Args:
      -xc
      kubectl scale --replicas=2 --v=7 deployment/adwords-api-deployment

    Environment:  <none>
    Mounts:
      /.kube/ from kubectl-config (ro)
  Volumes:
   kubectl-config:
    Type:            HostPath (bare host directory volume)
    Path:            $HOME/.kube
    HostPathType:    
Last Schedule Time:  <unset>
Active Jobs:         <none>
Events:              <none>

对于自定义RBAC配置,我建议参考kubernetes文档。

希望这会有所帮助。