如何从 Gitlab-ci 部署到多个 kubernetes 命名空间?

How to Deploy from Gitlab-ci to multiple kubernetes namespaces?

我有两个变量包含我的命名空间名称:

$KUBE_NAMESPACE_DEV ="stellacenter-dev"
$KUBE_NAMESPACE_STAGE "stellacenter-stage-uat" 

现在我想修改以下 .gitlab-ci.yaml 配置以包含命名空间逻辑:

deploy_dev:
  stage: deploy
  image: stellacenter/aws-helm-kubectl
  before_script:
    - aws configure set aws_access_key_id ${DEV_AWS_ACCESS_KEY_ID}
    - aws configure set aws_secret_access_key ${DEV_AWS_SECRET_ACCESS_KEY}
    - aws configure set region ${DEV_AWS_DEFAULT_REGION}
  script:
    - sed -i "s/<VERSION>/${CI_COMMIT_SHORT_SHA}/g" provider-service.yml     
    - mkdir -p  $HOME/.kube
    - cp $KUBE_CONFIG_DEV $HOME/.kube/config
    - chown $(id -u):$(id -g) $HOME/.kube/config 
    - export KUBECONFIG=$HOME/.kube/config
    - kubectl apply -f ./provider-service.yml 
  only:
    - developer  

提供-service.yml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: provider-app
  namespace: "stellacenter-dev" or "stellacenter-stage-uat" 
  labels:
    app: provider-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app : provider-app
  template:
    metadata:
      labels:
        app: provider-app
    spec:
      containers:
      - name: provider-app
        image: registry.gitlab.com/stella-center/backend-services/provider-service:<VERSION>
        imagePullPolicy: Always
        ports:
          - containerPort: 8092
      imagePullSecrets:
        - name:  gitlab-registry-token-auth

---

apiVersion: v1
kind: Service
metadata:
  name:  provider-service
  namespace: "stellacenter-dev" "stellacenter-stage-uat" 
spec:
  type: NodePort
  selector:
    app:  provider-app
  ports:
  - port:  8092
    targetPort:  8092

我不知道如何正确整合变量和值。我在 运行 pipeline.Kindly 帮助我解决问题时遇到了错误。

apply命令上面加一行

- export KUBECONFIG=$HOME/.kube/config
- kubectl apply -f ./provider-service.yml 

使用 sed 你可以将相应的变量替换到 YAML 文件中

sed -i "s, NAMESPACE,$KUBE_NAMESPACE_DEV," Provide-service.yml

在 YAML 文件中保持类似

的内容
apiVersion: v1
kind: Service
metadata:
  name:  provider-service
  namespace: NAMESPACE
spec:
  type: NodePort

您可以保留一个变量而不是两个用于命名空间管理,但是使用 sed 可以将命名空间设置到 YAML 中并应用该 YAML。

虽然在你的 repo 中它会像一个模板,当 CI 将 运行 NAMESPACE 将被 sed 命令替换并且 YAML 将被应用到 k8s。因此,您也可以保留其他内容作为模板,并根据需要用 sed 替换它们。

    apiVersion: v1
    kind: Service
    metadata:
      name:  SERVICE_NAME
      namespace: NAMESPACE
    spec:
      type: SERVICE_TYPE

您可以从清单中删除 namespace: NAMESPACE,然后使用命令行在命名空间中应用资源。

- kubectl apply -f ./provider-service.yml -n ${KUBE_NAMESPACE_DEV}
- kubectl apply -f ./provider-service.yml -n ${KUBE_NAMESPACE_STAGE}