Jenkins-部署到 kubernetes
Posted shark_西瓜甜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins-部署到 kubernetes相关的知识,希望对你有一定的参考价值。
一、概述
Kubernetes Continuous Deploy
一个Jenkins插件,用于将资源配置部署到Kubernetes集群。
它提供以下功能:
- 通过 SSH 从主节点获取群集凭据。您也可以手动配置它。
- 资源配置的变量替换,使您可以进行动态资源部署。
- 私有 Docker 注册表的 Docker 登录凭证管理。
- 无需在 Jenkins 从节点上安装该 kubectl 工具。
插件支持以下资源类型:
- Deployment
- Replica Set
-Replication Controller - 不支持滚动更新。如果需要,可以考虑使用部署。 - Daemon Set
- Pod
- Job
- Service
- Ingress
- Secret - 插件还提供秘密配置。
注意:
在持续集成和持续部署的环境中,只有那些需要定期更新的资源应该放在Jenkins部署中。所以大多数时候插件应该主要处理 Deployment 类型的资源。
二、Pipeline 的支持
1 脚本式 Pipeline
kubernetesDeploy(kubeconfigId: 'kubeconfig-credentials-id', // REQUIRED
configs: '<ant-glob-pattern-for-resource-config-paths>', // REQUIRED
enableConfigSubstitution: false,
secretNamespace: '<secret-namespace>',
secretName: '<secret-name>',
dockerCredentials: [
[credentialsId: '<credentials-id-for-docker-hub>'],
[credentialsId: '<credentials-id-for-other-private-registry>', url: '<registry-url>'],
]
)
下面是部署的最基本配置
kubernetesDeploy(
...
configs: '部署资源的 YML 文件,比如*.yml',
enableConfigSubstitution: true, // 这个默认值就是 true
...
)
配置文件绑定
假如 kubernetes 的配置文件以凭据的方式保存在 Jenkins 中的时候,可以利用 credentials binding插件将kubeconfig内容绑定到变量。可以将变量中的内容保存到本地文件中,该文件可用于调用kubectl命令(使用–kubeconfig参数)
以下是以 Pipeline 方式的配置绑定
withCredentials([kubeconfigContent(credentialsId: '6710f45-5f4c-4ddb-8bfc-c41e810be1cc', variable: 'KUBECONFIG_CONTENT')]) {
sh '''echo "$KUBECONFIG_CONTENT" > kubeconfig && cat kubeconfig && rm kubeconfig'''
}
版本不兼容解决方案
pipeline {
// 设置全局环境变量
environment {
url = 'git@gitee.com:xiguatian/simple-java-maven-app.git'
}
// 全局代理是 none,表示全局上不设置任何代理,需要在每个步骤中设置代理
agent none
stages {
// 拉取代码并构建
stage('pull code and build') {
// 此阶段的代理: docker 容器
agent {
docker {
image 'maven:3-alpine'
args '-v $HOME/.m2:/root/.m2'
// 自定义的工作空间
customWorkspace "/opt/"
}
}
steps {
// 拉取代码
git(url: env.url, branch: 'master', credentialsId: 'gitlab')
// 构建
sh 'mvn -B clean package'
}
}
// 构建镜像
stage("build image"){
agent {
node {
label 'master'
customWorkspace "/opt/"
}
}
steps {
script {
docker.withRegistry('http://192.168.122.100:80', 'harbor') {
docker.build('app-java/myapp').push('6.9')
}
}
}
}
stage("deploy app"){
agent {
node {
label 'master'
customWorkspace "/opt/"
}
}
steps {
kubernetesDeploy(
kubeconfigId: 'k8s-auth', // REQUIRED
configs: 'myapp.yml', // REQUIRED
enableConfigSubstitution: true,
secretName: 'harbor-auth',
dockerCredentials: [[credentialsId: 'harbor', url: 'http://192.168.122.100:80']]
)
}
}
}
}
将上面最后部分修改为
stage("deploy app"){
agent {
node {
label 'master'
customWorkspace "/opt/"
}
}
steps {
sh 'kubectl apply -f myapp.yml'
}
}
使用到的 myapp.yml
文件是 kubernetes 的部署文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
selector:
matchLabels:
app: myapp
replicas: 2
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: 192.168.122.100:80/app-java/myapp:v5.0
imagePullSecrets:
- name: harbor-auth // 用于harbor 仓库的认证密钥
192.168.122.100:80/app-java/myapp:v5.0
是私有仓库,需要进行认证
kubernetes 中给 Docker 的私有仓库创建认证,使用如下命令
kubectl create secret docker-registry harbor-auth --docker-username=harbor仓库的用户名 --docker-password=密码 --docker-server=http://192.168.122.100:80
docker-registry
是密钥类型
harbor-auth
是密钥的名称
以上是关于Jenkins-部署到 kubernetes的主要内容,如果未能解决你的问题,请参考以下文章
聊聊代码 | 基于Shell,Jenkins+Docker+Kubernetes的持续集成与部署
kubernetes:无法使用具有 RW 访问权限的持久卷部署 jenkins 映像
Jenkins + Gitlab + harbor + Kubernetes实现CI/CD