k8s自动部署教程
文章目錄
- 缺陷記錄
- 參考文章
- 實(shí)戰(zhàn)命令
- k8s自動(dòng)部署教程
- 代碼分析
- 打包成docker鏡像
- k8s+jenkins+git
缺陷記錄
參考文章
JENKINS沒(méi)有執(zhí)行SHELL權(quán)限問(wèn)題
實(shí)戰(zhàn)命令
kubectl get pods -o wide 節(jié)點(diǎn)名
netstat -tlunp
kubectl get pods,svc
curl -I localhost:19999
k8s自動(dòng)部署教程
systemctl start | stop | restart | status jenkins
代碼分析
先運(yùn)行jenkins腳本代碼(1. 拉代碼,2. mvn將代碼打成jar包,3. 執(zhí)行腳本build.sh–將jar包打成鏡像,4. 執(zhí)行deploy.sh將鏡像丟到k8s中運(yùn)行)
拉代碼,代碼變jar包,jar變鏡像,k8s命令啟動(dòng)鏡像。
打包成docker鏡像
vi Dockerfile
沒(méi)有jdk:8-jdk-alpine鏡像的話首次運(yùn)行會(huì)自動(dòng)進(jìn)行下載拷貝到要制作的鏡像里面
k8s+jenkins+git
jenkins的pipeline如下:
pipeline {//說(shuō)明流水線哪一個(gè)節(jié)點(diǎn)運(yùn)行agent anyoptions {// 默認(rèn)15分鐘 timeout (15)timeout(time: 13, unit: 'MINUTES')}environment {build_dir="/opt/k8s-cicd/build-workspace"project_name="hello-world"host="k8s-web.muoo.com"}stages {stage('build') {steps{git 'https://gitee.com/goodshred/k8s-hello-world.git'sh "mvn -Dmaven.test.failure.ignore=true clean package"sh 'echo "curUser=${USER}"'//script {//本質(zhì)還是不應(yīng)該寫(xiě)在這里,碰到無(wú)權(quán)限問(wèn)題應(yīng)該手動(dòng)去操作linux機(jī)器,比如配置兩臺(tái)機(jī)器的免密登陸,使用root權(quán)限給某個(gè)文件賦予允許jenkins執(zhí)行的權(quán)限//chmod: changing permissions of ‘/opt/k8s-cicd/script/build.sh’: Operation not permitted//我是用的root創(chuàng)建的腳本文件,因此jenkins用戶(hù)無(wú)法更改其權(quán)限//sh "chmod +x /opt/k8s-cicd/script/build.sh"//sh "chmod +x /opt/k8s-cicd/script/deploy.sh"// }sh "${build_dir}/script/build.sh"sh "${build_dir}/script/deploy.sh"}}}post {success {script {echo "post==success"}}failure {script {echo "post==failure"}}//構(gòu)建不穩(wěn)定時(shí)//隨著項(xiàng)目的開(kāi)發(fā)和持續(xù)擴(kuò)展,使用Jenkins構(gòu)建(build)項(xiàng)目越來(lái)越多,Jenkins服務(wù)器的磁盤(pán)可能被大日志文件占滿造成無(wú)法繼續(xù)構(gòu)建項(xiàng)目的異常(一般會(huì)出現(xiàn)構(gòu)建按鈕為黃色)unstable {script {echo "post==unstable "}}} }創(chuàng)建目錄結(jié)構(gòu)如下:
Dockerfile文件
FROM openjdk:8-jdk-alpine COPY hello-world-0.0.1-SNAPSHOT.jar /hello-world-0.0.1-SNAPSHOT.jar ENTRYPOINT ["java", "-jar","/hello-world-0.0.1-SNAPSHOT.jar"]build.sh文件:
#!/bin/bashif [ "${build_dir}" == "" ];thenecho "env 'build_dir' is not set"exit 1 fi# 構(gòu)建時(shí)候的工作名,比如Jenkins自動(dòng)構(gòu)建個(gè)項(xiàng)目,取名叫k8s-cicd,那么${JOB_NAME}=k8s-cicd,它是Jenkins自帶的全局變量 # /opt/k8s-cicd/build-workspace/k8s-web-demodocker_dir=${build_dir}/${JOB_NAME}if [ ! -d ${docker_dir} ];thenmkdir -p ${docker_dir} fiecho "docker workspace: ${docker_dir}"# ${WORKSPACE}/${MODULE}=/var/lib/jenkins/workspace/k8s-web-demo/ jenkins_dir=${WORKSPACE}/${MODULE} export jenkins_dir=${jenkins_dir}echo "jenkins_dir is ${jenkins_dir}"if [ ! -f ${jenkins_dir}target/*jar ];thenecho "target file not found ${jenkins_dir}target/*jar"exit 1 fi\cp ${jenkins_dir}target/*jar ${docker_dir} cd ${docker_dir}# VERSION=$(date + %y%m%d%H%M%S%) VERSION=$(date "+%y-%m-%d_%H-%M-%S") IMAGE_NAME=goodshred/${project_name}:${VERSION} echo ${IMAGE_NAME}echo "${IMAGE_NAME}" > ${WORKSPACE}/IMAGE echo "workspave is : ${WORKSPACE}======================" cat ${WORKSPACE}/IMAGE echo "build image ${IMAGE_NAME}"docker build -t ${IMAGE_NAME} . docker push ${IMAGE_NAME}deploy.sh文件如下:
#!/bin/bashname=${JOB_NAME} image=$(cat ${WORKSPACE}/IMAGE)\cp ${build_dir}/template/web.yaml ${build_dir}/script/web.yamlsed -i "s,{{name}},${name},g" ${build_dir}/script/web.yamlsed -i "s,{{image}},${image},g" ${build_dir}/script/web.yamlkubectl apply -f ${build_dir}/script/web.yamlcat ${build_dir}/script/web.yamlweb.yaml如下:
apiVersion: v1 kind: Service metadata:name: {{name}}namespace: defaultlabels:app: {{name}} spec:type: NodePortports:- port: 30009targetPort: 19999# type: NodePort # 在主機(jī)上暴露端口nodePort: 19999 #service對(duì)外開(kāi)放端口selector:app: {{name}}--- apiVersion: extensions/v1beta1 #apps/v1,extensions/v1beta1需要根據(jù)自己k8s的版本選擇 kind: Deployment #對(duì)象類(lèi)型 metadata:name: {{name}} #名稱(chēng)labels:app: {{name}} #標(biāo)注 spec:replicas: 1 #運(yùn)行容器的副本數(shù),修改這里可以快速修改分布式節(jié)點(diǎn)數(shù)量selector:matchLabels:app: {{name}}template:metadata:labels:app: {{name}}spec:containers: #docker容器的配置# {{name}}- name: {{name}}#image: goodshred/hello-world:latest## 192.168.1.253:8081/pasq/dockertest:0.0.1 # pull鏡像的地址 ip:prot/dir/images:tag # {{image}}image: {{image}}imagePullPolicy: IfNotPresent #pull鏡像時(shí)機(jī),ports:- containerPort: 19999 #容器對(duì)外開(kāi)放端口總結(jié)
- 上一篇: java接口源码_java collec
- 下一篇: 接口自动化测试 返回html,接口自动化