相对于基于控制器文件部署的方式有哪些优点:
- 利于形成DEVOPS标准化;
- 控制器方式需要维护大量的yaml文件;
- 相对于helm方式,控制器方式低效且不够灵活;
当前环境环境基于控制器文件部署:
//定义git相关数据
def git_address = "http://gitlab.kubernets.cn/demoteam/java_kubernetes.git"
def git_auth = "59d88ee6-8c38-4116-948d-66d812799c63"
//构建版本的名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "harbor-local.kubernets.cn"
//Harbor的项目名称
def harbor_project_name = "demo"
//Harbor的凭证
def harbor_auth = "6d2ada67-9f69-4f79-85e8-c76a0b9e0564"
//启动时间
def start = new Date().format('yyyy-MM-dd HH:mm:ss')
//创建一个Pod的模板,label为jenkins-slave
podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [
containerTemplate(
name: 'jnlp',
image: "harbor-local.kubernets.cn/library/jenkins-slave-maven",
ttyEnabled: true
),
containerTemplate(
name: 'docker',
image: "harbor-local.kubernets.cn/library/docker:stable",
ttyEnabled: true,
command: 'cat'
),
],
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
],
)
{
node("jenkins-slave-java"){
// 第一步
stage('Pull'){
checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
stage('BuildDescription') {
// 自定义设置构建历史显示的名称和描述信息
// 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法
script {
//设置buildName
wrap([$class: 'BuildUser']) {
//修改Description
buildDescription "${BUILD_USER} > ${project_name} > ${branch}"
}
}
}
// 第二步
stage('Build&Tag&Push&Deploy'){
//把选择的项目信息转为数组
def selectedProjects = "${project_name}".split(',')
for(int i=0;i<selectedProjects.size();i++){
//取出每个项目的名称
def currentProjectName = selectedProjects[i];
//定义镜像名称
def imageName = "${currentProjectName}:${tag}"
//定义newTag
def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim()
//编译,构建本地镜像
//sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile"
sh "mvn clean package -Dmaven.test.skip=true"
container('docker') {
//镜像编译
sh "docker build -t ${imageName} ."
//给镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
//登录Harbor,并上传镜像
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
{
//登录
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
}
//删除本地镜像
sh "docker rmi -f ${imageName}"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
}
def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
//基于控制器的方式部署到K8S
sh """
sed -i 's#\$IMAGE_NAME#${deploy_image_name}#' deployment.yaml
sed -i 's#\$APP_NAME#${currentProjectName}#' deployment.yaml
sed -i 's#\$APP_REPLICAS#${replicas}#' deployment.yaml
sed -i 's#\$NAMESPACE#${namespaces}#' deployment.yaml
sed -i 's#\$SPRINGENV#${springProfilesActive}#' deployment.yaml
sed -i 's#\$PODMEMORY#${podsMem}#' deployment.yaml
sed -i 's#\$PODCPU#${podsCpu}#' deployment.yaml
cat deployment.yaml
"""
//部署到K8S
kubernetesDeploy(kubeconfigId: "7ab1d5e8-0f10-4ca7-918a-f505b727c23d", configs: "deployment.yaml")
}
}
}
}
基于helm的部署方式:
//定义git相关数据
def git_address = "https://gitlab.zhoumx.net/kubernetes/springdemo.git"
def git_auth = "d94c267d-20be-4778-bfad-2a26f568a508"
//构建版本的名称
def tag = "latest"
//Harbor私服地址
def harbor_url = "harbor.zhoumx.cc"
//Harbor的项目名称
def harbor_project_name = "demo"
//Harbor的凭证
def harbor_auth = "e3ad80ae-89c8-428d-b8d4-4b25009fecc1"
//启动时间
def start = new Date().format('yyyy-MM-dd HH:mm:ss')
//创建一个Pod的模板,label为jenkins-slave
podTemplate(label: 'jenkins-slave-java', cloud: 'kubernetes', containers: [
containerTemplate(
name: 'jnlp',
image: "harbor.zhoumx.cc/library/jenkins-slave-maven:v1",
ttyEnabled: true
),
containerTemplate(
name: 'docker',
image: "harbor.zhoumx.cc/library/docker:stable",
ttyEnabled: true,
command: 'cat'
),
containerTemplate(
name: 'helm3',
image: "harbor.zhoumx.cc/library/k8s-helm:v3.12.3",
ttyEnabled: true,
command: 'cat'
),
],
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
],
)
{
node("jenkins-slave-java"){
// 第一步
stage('Pull'){
checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], extensions: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]])
}
stage('BuildDescription') {
// 自定义设置构建历史显示的名称和描述信息
// 不同的部署方式设置构建历史显示的名称和描述信息方式不一样,根据自己的部署方式自行百度找到设置方法
script {
//设置buildName
wrap([$class: 'BuildUser']) {
//修改Description
buildDescription "${BUILD_USER} > ${project_name} > ${branch}"
}
}
}
// 第二步
stage('Build&Tag&Push&Deploy'){
//把选择的项目信息转为数组
def selectedProjects = "${project_name}".split(',')
for(int i=0;i<selectedProjects.size();i++){
//取出每个项目的名称
def currentProjectName = selectedProjects[i];
//定义镜像名称
def imageName = "${currentProjectName}:${tag}"
//定义newTag
def newTag = sh(returnStdout: true,script: 'echo `date +"%Y%m%d%H%M"_``git describe --tags --always`').trim()
//编译,构建本地镜像
//sh "sed -i 's#ACTIVEPROFILE#${springProfilesActive}#g' Dockerfile"
sh "mvn clean package -Dmaven.test.skip=true"
container('docker') {
//镜像编译
sh "docker build -t ${imageName} ."
//给镜像打标签
sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
//登录Harbor,并上传镜像
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')])
{
//登录
sh "docker login -u ${username} -p ${password} ${harbor_url}"
//上传镜像
sh "docker push ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
}
//删除本地镜像
sh "docker rmi -f ${imageName}"
sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
}
def deploy_image_name = "${harbor_url}/${harbor_project_name}/${currentProjectName}:${newTag}"
//基于Helm的方式部署到K8S
container('helm3') {
withCredentials([usernamePassword(credentialsId: "${harbor_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
helm repo add --username=${username} --password=${password} devopsrepo https://harbor.zhoumx.cc/chartrepo/demo
"""
}
//需要使用secret类型凭据
withCredentials([file(credentialsId: 'ef9b5d86-d6f6-4079-941d-7a2bfec74b33', variable: 'KUBECONFIG')]) {
sh """
mkdir -p /root/.kube/ && echo $KUBECONFIG >/root/.kube/config
echo "Helm应用配置信息确认..."
helm upgrade --install --dry-run --debug ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \
--set replicaCount=${replicas} \
--set image.repository=${deploy_image_name} \
--set service.type=ClusterIP \
--set resources.limits.memory=${podsMem} \
--set resources.limits.cpu=${podsCpu} \
--set resources.requests.memory=${podsMem} \
--set resources.requests.cpu=${podsCpu} \
--set ingress.enabled=${isIngress}
echo "应用部署..."
helm upgrade --install ${currentProjectName} --namespace ${namespaces} devopsrepo/demohelm \
--set replicaCount=${replicas} \
--set image.repository=${deploy_image_name} \
--set service.type=ClusterIP \
--set resources.limits.memory=${podsMem} \
--set resources.limits.cpu=${podsCpu} \
--set resources.requests.memory=${podsMem} \
--set resources.requests.cpu=${podsCpu} \
--set ingress.enabled=${isIngress}
"""
}
}
}
}
}
}
k8s-helm容器Dockerfile文件
[root@master1 /tmp/charts]# cat Dockerfile
FROM alpine
# Metadata
LABEL org.opencontainers.image.title="lachlanevenson/k8s-helm" \
org.opencontainers.image.url="https://helm.sh/docs/"
ENV HELM_LATEST_VERSION="v3.12.3"
ARG TARGETARCH
ENV TARGETARCH=${TARGETARCH:-amd64}
RUN apk add --update ca-certificates \
&& apk add --update -t deps wget git openssl bash \
&& wget -q https://get.helm.sh/helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \
&& tar -xf helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz \
&& mv linux-${TARGETARCH}/helm /usr/local/bin \
&& apk del --purge deps \
&& rm /var/cache/apk/* \
&& rm -f /helm-${HELM_LATEST_VERSION}-linux-${TARGETARCH}.tar.gz
ENTRYPOINT ["helm"]
CMD ["help"]
编译及上传
$ docker build -t k8s-helm:v3.12.3 .
$ docker tag k8s-helm:v3.12.3 harbor.zhoumx.cc/library/k8s-helm:v3.12.3
$ docker push harbor.zhoumx.cc/library/k8s-helm:v3.12.3
编译结果

验证
$ helm list -n demo
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
spring-java-demo demo 1 2023-12-06 11:38:51.193517733 +0000 UTC deployed demohelm-0.2.0 1.16.0
$ kubectl get po -n demo
NAME READY STATUS RESTARTS AGE
spring-java-demo-844ff9f856-hjlmk 1/1 Running 0 4m5s
$ kubectl get svc -n demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
spring-java-demo ClusterIP 10.15.36.186 <none> 8080/TCP 52s
$ curl 10.15.36.186:8080/appone
appOne
$ curl 10.15.36.186:8080/apptwo
appTwo
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。