Contenu connexe Similaire à Jenkins x Kubernetesが簡単だと思ったら大変だった話 (20) Plus de Masaki Yamamoto (18) Jenkins x Kubernetesが簡単だと思ったら大変だった話7. Cloud Native
Trail Map
1. CONTAINARIZATION
2. CI/CD
3. ORCHESTRATION &
APPLICATION DEFINITION
4. OBSERVABILITY &
ANALYSIS
5. … And more!
https://github.com/cncf/landscape/blob/master/README.md
12. • CNCF Cloud Native Interactive Landscape
• 前述のCloud Native Trail Mapで使用するツール郡
• 605個(2018/12/1現在)
• https://landscape.cncf.io/
30. Declarative Pipeline サンプルコード
pipeline {
agent { docker 'maven:3-alpine' }
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}
• ビルドするエージェントを指定
• mavenのdockerイメージを使用
32. Declarative Pipeline サンプルコード
pipeline {
agent { docker 'maven:3-alpine' }
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}
• ビルドのステージ定義
• 「Example Build」を指定
33. Declarative Pipeline サンプルコード
pipeline {
agent { docker 'maven:3-alpine' }
stages {
stage('Example Build') {
steps {
sh 'mvn -B clean verify'
}
}
}
}
• ビルドの実行ステップを記載
• Shellでmavenを実行
35. Declarative Pipeline サンプルコード
pipeline {
agent any
stages {
stage('No-op') { ... }
}
post {
always { ... }
success { echo 'I succeeeded!' }
unstable { echo 'I am unstable :/' }
failure { echo 'I failed :(' }
changed { echo 'Things were different before...' }
}
} • ビルド結果に応じてクリーンアップ可能
• dockerイメージやtempファイルなど消せる
40. Jenkins で kubectl
• kubectl先の設定方法
– 複数のKubernetesクラスタを使う
– 複数の設定情報が必要
– KUBERNETES_MASTER環境変数とパラメーターを使用
– 詳細は後述
• デプロイ用のファイルは別途準備
– CI用のJenkinsfileとCD用のJenkinsfileは別
– 環境ごとにk8sのDeployment用yamlを分ける
• ベストプラクティスかどうかはわからない
– spinnakerとかを使用したほうが良いかも
45. Declarative Pipeline サンプルコード
stage('deploy') {
steps {
script {
withCredentials([string(credentialsId: 'k8s-dev', variable: 'master'),
file(credentialsId: 'k8s-dev-client-cert', variable: 'cert'),
file(credentialsId: 'k8s-dev-client-key', variable: 'key')]) {
sh """
export KUBERNETES_MASTER=${master}
kubectl apply -f deploy.yaml --client-certificate=${cert} --client-
key=${key}
"""
}
}
}
}
• 認証情報をJenkinsの認証プロバイダーから
読み込む
46. Declarative Pipeline サンプルコード
stage('deploy') {
steps {
script {
withCredentials([string(credentialsId: 'k8s-dev', variable: 'master'),
file(credentialsId: 'k8s-dev-client-cert', variable: 'cert'),
file(credentialsId: 'k8s-dev-client-key', variable: 'key')]) {
sh """
export KUBERNETES_MASTER=${master}
kubectl apply -f deploy.yaml --client-certificate=${cert} --client-
key=${key}
"""
}
}
}
}
• 複数行のShellはヒアドキュメント形式
• 環境変数が適用されないため複数行にする
47. Declarative Pipeline サンプルコード
stage('deploy') {
steps {
script {
withCredentials([string(credentialsId: 'k8s-dev', variable: 'master'),
file(credentialsId: 'k8s-dev-client-cert', variable: 'cert'),
file(credentialsId: 'k8s-dev-client-key', variable: 'key')]) {
sh """
export KUBERNETES_MASTER=${master}
kubectl apply -f deploy.yaml --client-certificate=${cert} --client-
key=${key}
"""
}
}
}
}
49. ビルド時にtoo many linksエラー
• なぜかCI中にビルドエラーが起きます!と連絡
• ローカル環境では問題なし
• Jenkinsのログを調べてみるとCIでDockerイメージビル
ド中に「 too many links」エラーと出て失敗する
• エラーログ
– link /lib/docker/overlay/(省略)/checksum_type
/lib/docker/overlay/(省略)/checksum_type: too many
links
Jenkins
Docker
Kubernetes
50. ビルド時にtoo many linksエラー
• ハードリンクが使いつくされ、i-nodeが枯渇
• Jenkins上でDocker Imageのクリーンアップが行われて
いなかった
• 約3000イメージファイルが存在
• とあるイメージは2GBを超えていた
Jenkins
Docker
Kubernetes
51. ビルド時にtoo many linksエラー
• Dockerイメージの削除を実施
– docker image prune だと 削除時にdockerd が応答しなくな
るほどのメモリ、CPU負荷が発生
– docker image ls | grep -v “” | awk ‘{print $1“:”$2}’ |
xargs docker rmi で少しずつ削除
Jenkins
Docker
Kubernetes
52. ビルド時にtoo many linksエラー
• cronで定期的にDocker Image削除を実施
– docker image prune
• Overlay2ドライバを使用(未実施)
– 当時はOverlayドライバを使用していた
– Overlay2ドライバを使用することで解消するかも
– https://docs.docker.com/storage/storagedriver/overlayfs
-driver/#how-the-overlay2-driver-works
Jenkins
Docker
Kubernetes
58. Jenkinsファイルの文法チェックをしたい
• curlでチェックできるようにした
• curl -X POST -H $JENKINS_CRUMB -F
"jenkinsfile=<Jenkinsfile" $JENKINS_URL/pipeline-
model-converter/validate
• 詳細は下記参照
• https://jenkins.io/doc/book/pipeline/development/
#linter
Jenkins
Docker
Kubernetes