zlabjp/kubernetes-resource: 使用Concourse资源操作Kubernetes
概况
在Z Lab中,我们使用了几个CI/CD工具,其中之一是Concourse。Concourse是一种基于管道的CI/CD工具,由Pivotal开发。由于Concourse中没有满足我们要求的资源来将应用程序从Concourse部署到Kubernetes,我们进行了新的开发,并以OSS(MIT许可证)的形式发布。
- zlabjp/kubernetes-resource: A Concourse resource for controlling the Kubernetes cluster
如何在Kubernetes上部署应用程序?
要在Kubernetes上部署应用程序,需要使用用于操作Kubernetes的命令行界面工具kubectl。
-
- kubectl run: 特定のコンテナイメージをクラスタで実行する
-
- kubectl create: リソースを作成する(既に作成済の場合は実行に失敗する)
-
- kubectl delete: リソースを削除する
-
- kubectl apply: リソースに設定を適応する
- kubectl get: 一つまたは複数のリソースの情報を表示する
Kubernetes 提供了许多其他子命令,您可以使用它们来部署应用程序。Kubernetes 使用多个资源来表示应用程序的配置,如 Pod、Service、Volume 等等。因此,部署是指操作这些资源。
これらのサブコマンドを駆使してリソースを管理する手法を3つ紹介します。
请下令。
Imperative command はおもに kubectl run などの一度限りのコマンドを利用してアプリケーションをデプロイする方法です。以下の例は、nginx:latest イメージをレプリカ数5で myapp という名前で作成します。この手法はアプリケーションの設定を詳細に設定できないため、開発用途など一時的に実行したい場合に利用します。
# Start a replicated contianer of nginx
$ kubectl run myapp --image=nginx:latest --replicas=5
请把目标配置命令改写成汉语原生语言。
Imperative object configuration はリソースの設定をマニフェストファイルとして YAML または JSON としてファイルに記載し、kubectl create や kubectl delete などを利用してリソースを作成、削除します。この方法は Imperative command と比較してアプリケーションの設定をファイルとして記載するため、バージョン管理することができます。ただしこれらのコマンドはリソースが既に作成されていたり、削除されていて存在しない場合に実行に失敗します。
# Create a resource by a manifest file
$ kubectl create -f nginx-deployment.yaml
声明性对象配置
Declarative object configuration をマニフェストファイルを kubectl apply のみを利用してリソースを作成、削除します。kubectl apply は kubectl create と比較して既にリソースが存在していればそれを更新し、存在していなければ作成します。また更新方法も他のコマンドによるリソースの操作に干渉しないものとなっており、CD としてアプリケーションを継続的にデプロイするにはもっとも適しています。
# Create/Update a resource by a manifest file
$ kubectl apply -f nginx-deployment.yaml
如果你希望更加详细了解 kubectl apply 的行为,请参考 kubectl apply 的机制/ How kubectl apply works。
在Concourse上实现对Kubernetes应用的持续部署
您可以使用zlabjp/kubernetes-resource从Concourse操作Kubernetes。这是一个作为Concourse资源运行的工具,可以使用kubectl在集群上执行任意命令。它还具有在部署应用程序时非常有用的功能。
版本
このリソースは下記のような複数のバージョンを提供しています。バージョンは kubectl のバージョンと紐付いているため、Kubernetes クラスタのバージョンと同一のバージョンを利用することを推奨します。
zlabjp/kubernetes-resource:1.8 (stable-1.8)
zlabjp/kubernetes-resource:1.7 (stable-1.7)
zlabjp/kubernetes-resource:1.6 (stable-1.6)
zlabjp/kubernetes-resource:latest (latest)
设置源
kubeconfig ファイルを直接渡す方法とクラスタコンフィグを個々に設定する方法の二つを提供します。
kubeconfig
Kubernetes配置文件
kubeconfig: 任意. kubeconfig ファイル
yaml
kubeconfig: |
apiVersion: v1
clusters:
– cluster:
…
在生成kubeconfig文件时,使用zlabjp/kubernetes-scripts中包含的create-kubeconfig脚本会很方便。
# Create a kubeconfig to access the apiserver with the specified serviceaccount and outputs it to stdout.
$ ./create-kubeconfig <serviceaccount-name> <kubectl-options>
集群配置
server: 任意. API サーバとアドレスとポート。token が必須です。 (e.g. https://192.168.99.100:8443
token: 任意. API サーバの認証に利用するトークン。server が必須です。 (e.g. eyj….
namespace: 任意. ネームスペース。デフォルトは default です。
certificate_authority: 任意. 認証局の証明書です。
insecure_skip_tls_verify: 任意. もし true なら、API サーバの証明書の有効性を確認しません。HTTPS が安全ではなくなります。デフォルトは false です。
動作
只有“out”的实现。
检查:什么也不做
什么都不做 bù zuò)
以原生的方式操作Kubernetes集群
进行类似于 kubectl apply、kubectl delete、kubectl label 等操作的 Kubernetes 集群操作。
函数中的参数
kubectl: 必須. kubectl に続く任意のコマンドを指定します。(e.g. apply -f …
wait_until_ready: 任意. 全ての Pods が Ready になるまで待機する秒数です。0 なら待機しません。デフォルトは 30 です。
wait_until_ready_interval: 任意. 全ての Pods が Ready かどうか確認する間隔(秒)です。デフォルトは 3 です。
wait_until_ready_selector: 任意. Ready かどうか確認する Pods を絞り込むラベルセレクタです。デフォルトはネームスペース内の全ての Pods です。
由于Kubernetes是一个异步的分布式系统,只要资源操作满足规格,命令就会成功。但实际上,在部署中可能会出现失败的情况,比如指定了不存在的容器镜像版本。为了使作业失败,在这种情况下我们提供了wait_until_ready。它将等待该命名空间中的Pod变为Running状态。如果在指定的时间内所有Pod都没有变为Running状态,作业将失败。如果要限制目标Pod的范围,请使用wait_until_ready_selector。此功能还可以防止在部署后的e2e测试中,在容器启动之前执行测试。
管道的例子
在执行 kubectl apply 时,通过更新存储库(repo リポジトリ)中的清单文件来触发对 prod 集群的操作。
resource_types:
- name: kubernetes
type: docker-image
source:
repository: zlabjp/kubernetes-resource
tag: "1.8"
resources:
- name: prod
type: kubernetes
source:
kubeconfig: ((prod-kubeconfig))
- name: repo
type: git
source:
...
jobs:
- name: prod-deploy
plan:
- get: repo
trigger: true
- put: prod
params:
kubectl: apply -f repo/deploy -f repo/deploy/prod
wait_until_ready_selector: app=myapp
由于kubectl参数支持命令替换,因此还可以进行以下用法。
jobs:
- name: force-update-deployment
serial: true
plan:
- put: mycluster
params:
kubectl: |
patch deploy nginx -p '{"spec":{"template":{"metadata":{"labels":{"updated_at":"'$(date +%s)'"}}}}}'
wait_until_ready_selector: run=nginx
总结
zlabjp/kubernetes-resource是用于操作Kubernetes集群的Concourse资源。可以利用kubectl的各种子命令来操作集群。我们在下面的存储库中准备了一个使用此资源的示例管道,请参考。
- https://github.com/zlabjp/concourse-meetup-tokyo-7-demo
最后
這篇文章是我們公司Z Lab成員在工作時間中撰寫的Z Lab Advent Calendar 2017的第一天內容。第二天內容將由@Ladicle介紹Istio入門。
请参考
-
- Kubernetes Object Management | Kubernetes
-
- Continuous Delivery with Concourse and Kubernetes // Speaker Deck
- https://github.com/zlabjp/concourse-meetup-tokyo-7-demo