我有两个应用程序在K8中运行。APP A具有对数据存储的写入访问权限,而APP B具有读取访问权限。
APP A需要能够改变APP B的运行部署。
我们目前是通过在APP A中手动启动一个进程来实现这一点的,该进程在数据存储中添加一个新的DB (比如db bob)。然后我们这样做:
kubectl edit deploy A并将环境变量更改为bob。这将启动APP B的所有pod的滚动重启。我们想让这个过程自动化。
有没有办法让APP A在k8中更改APP B的部署配置?
发布于 2020-03-18 03:31:01
首先回答你的主要问题:
有没有办法让一个服务改变k8中另一个服务的部署配置?
据我所知,您将其称为服务A和B是因为它在现实生活中的用途,但为了便于理解,我建议将其称为APP A和APP B,因为:
在Kubernetes中,Service是一种抽象,它定义了Pod的逻辑集和访问它们的策略(有时这种模式称为微服务)。
所以,如果你的问题是指:
“有没有办法让APP A在k8中更改APP B的部署配置?”
然后使用kubectl set env命令更改/添加env,您可以向pod授予管理权限,以管理集群的其他组件。
为了实现这一目标,您需要:
在命名空间中具有所需权限的
cluster-admin授予特定用户。如果仅对这些应用程序使用一个命名空间,请考虑使用角色instead.
APP A上
再现的步骤:
要应用群集管理员权限,我将其命名为manager-deploy.yaml
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.0deploy-env.yamlapiVersion: 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.yamlkind: 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-roledeploy-env pod中的service-account-for-pod.yaml、deploy-env.yaml、manager-deploy.yaml和list current环境变量:$ 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二进制文件并应用$ 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 env var value (请注意,修改部署时会重新创建pod:$ kubectl exec -it env-deploy-7f565ffc4-t46zc -- printenv
DATASTORE_NAME=bob如果您对如何将此解决方案应用到您的环境中有任何疑问,请在评论中让我知道。
发布于 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代码库,然后应用新的配置。
https://stackoverflow.com/questions/60716724
复制相似问题