docker -/bin/bash : line 117: kubectl: command not found gitlab-ci

标签 docker kubernetes gitlab gitlab-ci

我无法在 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/

相关文章:

eclipse - 如何在 Eclipse 的 JAVA_OPTS 中禁用 SSL?

azure - SSL证书问题: unable to get local issuer certificate AZURE DEVOPS

gitlab - 发布 gitlab 项目的覆盖结果

docker - Docker上的Rviz核心转储

docker - 如何使用 k3d 通过唯一端口公开两个应用程序/服务?

Kubernetes 负载均衡

kubernetes -/var/lib/etcd/member/snap 中的 etcd 文件

docker - 使用Alpine在Gitlab CI/CD上构建docker镜像

docker - 有没有办法将 Docker 镜像组合到 1 个容器中?

docker - Alpine docker image +755 无效模式下的 Linux 命令