首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让kubernetes应用程序更改部署配置

如何让kubernetes应用程序更改部署配置
EN

Stack Overflow用户
提问于 2020-03-17 13:33:30
回答 3查看 152关注 0票数 1

我有两个应用程序在K8中运行。APP A具有对数据存储的写入访问权限,而APP B具有读取访问权限。

APP A需要能够改变APP B的运行部署。

我们目前是通过在APP A中手动启动一个进程来实现这一点的,该进程在数据存储中添加一个新的DB (比如db bob)。然后我们这样做:

代码语言:javascript
复制
kubectl edit deploy A

并将环境变量更改为bob。这将启动APP B的所有pod的滚动重启。我们想让这个过程自动化。

有没有办法让APP A在k8中更改APP B的部署配置?

EN

回答 3

Stack Overflow用户

发布于 2020-03-18 03:31:01

首先回答你的主要问题:

有没有办法让一个服务改变k8中另一个服务的部署配置?

据我所知,您将其称为服务A和B是因为它在现实生活中的用途,但为了便于理解,我建议将其称为APP AAPP B,因为:

在Kubernetes中,Service是一种抽象,它定义了Pod的逻辑集和访问它们的策略(有时这种模式称为微服务)。

所以,如果你的问题是指:

“有没有办法让APP A在k8中更改APP B的部署配置?”

然后使用kubectl set env命令更改/添加env,您可以向pod授予管理权限,以管理集群的其他组件。

为了实现这一目标,您需要:

在命名空间中具有所需权限的

  • A Service Account
    • 注意:在下面的示例中,由于我不知道您是否在使用多个名称空间,因此我使用了一个ClusterRole,将cluster-admin授予特定用户。如果仅对这些应用程序使用一个命名空间,请考虑使用角色instead.

再现的步骤:

要应用群集管理员权限,我将其命名为manager-deploy.yaml

  • 创建部署

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: manager-deploy
  labels:
    app: manager
spec:
  replicas: 1
  selector:
    matchLabels:
      app: manager
  template:
    metadata:
      labels:
        app: manager
    spec:
      serviceAccountName: k8s-role    
      containers:
        - name: manager
          image: gcr.io/google-samples/node-hello:1.0

  • 创建一个包含环境变量的部署,模拟您的服务B。我将其命名为deploy-env.yaml

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: env-deploy
  labels:
    app: env-replace
spec:
  replicas: 1
  selector:
    matchLabels:
      app: env-replace
  template:
    metadata:
      labels:
        app: env-replace
    spec:
      serviceAccountName: k8s-role    
      containers:
        - name: env-replace
          image: gcr.io/google-samples/node-hello:1.0
          env:
          - name: DATASTORE_NAME
            value: "john"

  • 创建一个ServiceAccount和一个具有cluster-admin权限的ClusterRoleBinding,我将其命名为service-account-for-pod.yaml (请注意,它是service-account-for-pod.yaml

代码语言:javascript
复制
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: k8s-role
subjects:
- kind: ServiceAccount
  name: k8s-role
  namespace: default
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: k8s-role

  • 应用deploy-env pod中的service-account-for-pod.yamldeploy-env.yamlmanager-deploy.yaml和list current环境变量:

代码语言:javascript
复制
$ kubectl apply -f manager-deploy.yaml 
deployment.apps/manager-deploy created
$ kubectl apply -f deploy-env.yaml 
deployment.apps/env-deploy created
$ kubectl apply -f service-account-for-pod.yaml 
clusterrolebinding.rbac.authorization.k8s.io/k8s-role created
serviceaccount/k8s-role created

$ kubectl exec -it env-deploy-fbd95bb94-hcq75 -- printenv
DATASTORE_NAME=john

  • 外壳程序安装到manager pod中,下载kubectl二进制文件并应用

代码语言:javascript
复制
$ kubectl exec -it manager-deploy-747c9d5bc8-p684s -- /bin/bash

root@manager-deploy-747c9d5bc8-p684s:/# curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
root@manager-deploy-747c9d5bc8-p684s:/# chmod +x ./kubectl
root@manager-deploy-747c9d5bc8-p684s:/# mv ./kubectl /usr/local/bin/kubectl

root@manager-deploy-747c9d5bc8-p684s:/# kubectl set env deployment/env-deploy DATASTORE_NAME=bob     

  • 验证pod上的env var value (请注意,修改部署时会重新创建pod:

代码语言:javascript
复制
$ kubectl exec -it env-deploy-7f565ffc4-t46zc -- printenv
DATASTORE_NAME=bob

如果您对如何将此解决方案应用到您的环境中有任何疑问,请在评论中让我知道。

票数 2
EN

Stack Overflow用户

发布于 2020-03-17 15:33:15

您可以让服务A访问您的集群(安装kubectl并允许从服务A的NAT到您的集群主机的通信),并使用一些cron作业或jenkins / ssh或将执行您的命令的其他工具来执行此操作。您也可以使用kubectl patch或获取第二个部署导出的当前配置,并使用regex/awk/sed对其进行编辑,然后应用,尽管-- kubectl get deployment <name> -o yaml --export > deployment.yaml方法已被弃用,因此您也可以在服务A上下载GIT代码库,然后应用新的配置。

票数 1
EN

Stack Overflow用户

发布于 2020-03-19 20:45:09

感谢所有人的回答(因为他们都是正确的,所以被提升了)。我只是把我自己的答案记录下来,到底是什么为我解决了这个问题。

在我的例子中,我只需要使用k8上可用的patch url。这一点加上this的例子起作用了。

我所需要做的就是创建一个服务帐户来限制谁可以在哪里打补丁。将该帐户限制为Service A,并使用Service A中的java客户端更新Service B图表。在那之后,豆荚就会滚动并完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60716724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档