[英]/bin/bash: line 89: docker: command not found GITLAB CI/CD ISSUE
[英]/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.