簡體   English   中英

/bin/bash:第 117 行:kubectl:找不到命令 gitlab-ci

[英]/bin/bash: line 117: kubectl: command not found gitlab-ci

我無法在gitlab-ci.yml文件中使用kubectl命令。

我已經完成了文檔中提到的步驟以在文檔中添加現有集群。

他們沒有提到,我該如何使用kubectl

我嘗試了以下配置。

stages:
  - docker-build
  - deploy

docker-build-master:
  image: docker:latest
  stage: docker-build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE:prod" .
    - docker push "$CI_REGISTRY_IMAGE:prod"
  only:
    - master

deploy-prod:
  stage: deploy
  image: roffe/kubectl
  script:
    - kubectl apply -f scheduler-deployment.yaml
  only:
    - master

但我得到以下錯誤,

Executing "step_script" stage of the job script
00:01
Using docker image sha256:c8d24d490701efec4c8d544978b3e4ecc4855475a221b002a8f9e5e473398805 for roffe/kubectl with digest roffe/kubectl@sha256:ba13f8ffc55c83a7ca98a6e1337689fad8a5df418cb160fa1a741c80f42979bf ...
$ kubectl apply -f scheduler-deployment.yaml
error: unable to recognize "scheduler-deployment.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp [::1]:8080: connect: connection refused
Cleaning up file based variables
00:00
ERROR: Job failed: exit code 1

顯然,它無法連接到集群,或者可能試圖連接到這個roffe/kubectl鏡像容器內的集群。

當我刪除圖像時,我收到此錯誤。

/bin/bash: line 117: kubectl: command not found

我瀏覽了整個文檔,找不到解釋這部分的單個示例或參考。

請建議我如何部署到現有的 k8s 集群。

更新

我瀏覽了這個文檔,並在我的 gitlab-ci.yml 中使用定義的變量來更新 kubectl 的上下文。

但它仍然不起作用。

deploy-prod:
  stage: deploy
  image: roffe/kubectl
  script:
    - echo $HOME
    - echo $KUBECONFIG
    - echo $KUBE_URL
    - mkdir -p $HOME/.kube
    - echo -n $KUBECONFIG | base64 -d > $HOME/.kube/config
    - kubectl get pods
  only:
    - master

我得到的錯誤,

$ echo $HOME
/root
$ echo $KUBECONFIG
$ echo $KUBE_URL
$ mkdir -p $HOME/.kube
$ echo -n $KUBECONFIG | base64 -d > $HOME/.kube/config
$ kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
Cleaning up file based variables
00:01
ERROR: Job failed: exit code 1

要使用現有集群自動部署,您需要執行以下步驟:

1. 將您的集群添加到 gitlab 項目中。

按照這個文檔,並添加您現有的集群

2. 構建您的項目並推送到 docker 或任何注冊表

stages:
  - docker-build
  - deploy

docker-build-master:
  image: docker:latest
  stage: docker-build
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker build --pull -t "$CI_REGISTRY_IMAGE:prod" .
    - docker push "$CI_REGISTRY_IMAGE:prod"
  only:
    - master

3. 將你的 deployment.yml 應用到集群

要在gitlab-ci.yml中使用kubectl ,您需要一個具有kubectl的圖像。 你用過的那個就可以了。

但是容器內的kubectl不知道您之前添加的集群的上下文。

現在這就是 gitlab 的環境變量發揮作用的地方。

默認環境 scope 是 *,這意味着所有作業,無論其環境如何,都使用該集群。 每個 scope 只能由項目中的單個集群使用,否則會出現驗證錯誤。 此外,沒有設置環境關鍵字的作業無法訪問任何集群。 看這里

因此,當您添加集群時,默認情況下它位於 scope *中,並且如果它使用某種環境,它將被傳遞給每個作業。

此外,當您創建集群時,gitlab 默認為該集群創建環境變量, 請參見此處

需要注意的重要一點是它還添加了一個環境變量KUBECONFIG


為了訪問您的 Kubernetes 集群, kubectl使用了一個配置文件。 默認的kubectl配置文件位於~/.kube/config並被稱為kubeconfig文件。

kubeconfig文件組織有關集群、用戶、命名空間和身份驗證機制的信息。 kubectl命令使用這些文件來查找選擇集群並與之通信所需的信息。

加載順序遵循以下規則:

  • 如果設置了--kubeconfig標志,則僅加載給定文件。 該標志只能設置一次,並且不會發生合並。

  • 如果設置了$KUBECONFIG環境變量,則根據系統的正常路徑分隔規則將其解析為文件系統路徑列表。

  • 否則,將使用${HOME}/.kube/config文件並且不會進行合並。

因此, kubectl命令可以使用變量KUBECONFIG來設置上下文, 請參見此處

因此,您的部署工作將如下所示,

deploy-prod:
  stage: deploy
  image: roffe/kubectl
  script:
    - kubectl get pods
    - kubectl get all
    - kubectl get namespaces
    - kubectl apply -f scheduler-deployment.yaml
  environment:
    name: production
    kubernetes:
      namespace: default
  only:
    - master

您還可以使用environment.kubernetes.namespace為作業設置命名空間

此圖像(roffe/kubectl)沒有 kubectl package,因此您可以添加一些 package kubectl 和配置來連接您的 ZB76E98AF9AAA680979BF5A65B2D5A100。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM