我无法在 gitlab-ci.yml
文件中使用 kubectl
命令。
我已经完成了文档中提到的步骤,在 doc 中添加现有集群。 .
他们没有提到,我如何使用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 集群。
更新
我经历过这个doc我正在 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 项目。
关注this doc ,并添加您现有的集群
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 的环境变量发挥作用的地方。
The default environment scope is *, which means all jobs, regardless of their environment, use that cluster. Each scope can be used only by a single cluster in a project, and a validation error occurs if otherwise. Also, jobs that don’t have an environment keyword set can’t access any cluster. see here
因此,当您添加集群时,它默认位于范围 *
中,并且将传递给每个作业(只要它使用某些环境)。
此外,当您创建集群时,gitlab 默认为该集群创建环境变量 see here .
需要注意的重要一点是,它还添加了一个环境变量 KUBECONFIG
。
为了访问您的 Kubernetes 集群,kubectl
使用配置文件。默认的 kubectl 配置文件位于 ~/.kube/config ,称为 kubeconfig 文件。
kubeconfig
文件组织有关集群、用户、命名空间和身份验证机制的信息。 kubectl
命令使用这些文件来查找选择集群并与其通信所需的信息。
加载顺序遵循以下规则:
如果设置了
--kubeconfig
标志,则仅加载给定的文件。该标志只能设置一次,并且不会发生合并。如果设置了
$KUBECONFIG
环境变量,则会根据系统的正常路径分隔规则将其解析为文件系统路径列表。否则,将使用
${HOME}/.kube/config
文件并且不会发生合并。
因此,kubectl
命令可以使用变量KUBECONFIG
来设置上下文see here .
因此,您的部署工作将如下所示,
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
为作业设置命名空间
关于docker -/bin/bash : line 117: kubectl: command not found gitlab-ci,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66648803/