【devops】十、Kubernetes编排工具

准备工作

  • 至少2台 2核4G 的服务器
服务器IP要求
k8s-master192.168.2.212docker、kubectl、kubeadm、kubelet
k8s-worker192.168.2.213docker、kubectl、kubeadm、kubelet

十、Kubernetes编排工具

在这里插入图片描述
Jenkins通知目标服务器执行脚本文件后,目标服务器通过ssh登录k8s-master服务器,调用k8s集群编排docker。

10.1 Kubernetes介绍

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着,管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes也系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。

Kubernetes主要能帮助我们完成:

  • 服务发现和负载均衡
    Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

  • 存储编排
    Kubernetes 允许你自动挂载你选择的存储系统,比如本地存储,类似Docker的数据卷。

  • 自动部署和回滚
    你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。Kubernetes 会自动帮你根据情况部署创建新容器,并删除现有容器给新容器提供资源。

  • 自动完成装箱计算
    Kubernetes 允许你设置每个容器的资源,比如CPU和内存。

  • 自我修复
    Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的容器,并运行状况检查的容器。

  • 秘钥与配置管理
    Kubernetes 允许你存储和管理敏感信息,例如密码、OA uth 令牌和 ssh 密钥。你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

10.2 Kubernetes架构

各组件之间的关系图:
在这里插入图片描述

Kubernetes 搭建需要至少两个节点,一个Master负责管理,一个Slave搭建在工作服务器上负责分配。
kubernetes架构
在这里插入图片描述

从图中可以看到各个组件的基本功能:

  • API Server:作为K8s通讯的核心组件,K8s内部交互以及接收发送指令的组件。
  • controller-manager:控制器。作为K8s的核心组件,主要做资源调度,根据集群情况分配资源
  • etcd:一个key-value的数据库,存储存储集群的状态信息
  • scheduler:负责调度每个工作节点, 负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行
  • cloud-controller-manager:负责调度其他云服务产品
  • kubelet:管理Pods上面的容器。
  • kube-proxy:负责处理其他Slave或客户端的请求。
  • Pod:可以理解为就是运行的容器

10.3 Kubernetes安装

这里会采用https://kuboard.cn/提供的方式安装K8s,安装单Master节点

准备好服务器后开始安装,这里安装kubernetes1.19版本

  • 检查 centos 版本
# 在 master 节点和 worker 节点都要执行
cat /etc/redhat-release

# 此处 hostname 的输出将会是该机器在 Kubernetes 集群中的节点名字
# 不能使用 localhost 作为节点的名字,用以下命令查看
hostname

# 请使用 lscpu 命令,核对 CPU 信息
lscpu
# Architecture: x86_64    本安装文档不支持 arm 架构
# CPU(s):       2         CPU 内核数量不能低于 2
  • 重新设置hostname,不允许为localhost
# 修改 hostname,名字不允许使用下划线、小数点、大写字母,不能叫master
hostnamectl set-hostname your-new-host-name
# 查看修改结果
hostnamectl status
# 设置 hostname 解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts
  • 要求2台服务之间可以相互通讯

  • 安装软件

# 阿里云 docker hub 镜像
export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.com
curl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5

首先初始化Master节点

关于初始化时用到的环境变量
APISERVER_NAME 不能是 master 的 hostname
APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号
POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.0/16 命令,不做修改

  • 设置ip,域名,网段并执行初始化操作
# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=192.168.2.212
# 替换 apiserver.demo 为 您想要的 dnsName
export APISERVER_NAME=apiserver.demo
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
curl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
  • 检查Master启动状态
# 只在 master 节点执行

# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide

# 查看 master 节点初始化结果
kubectl get nodes -o wide

Ps:如果出现NotReady的情况执行(最新版本的BUG,1.19一般没有)

docker pull quay.io/coreos/flannel:v0.10.0-amd64 
mkdir -p /etc/cni/net.d/
cat <<EOF> /etc/cni/net.d/10-flannel.conf
{"name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}
EOF
mkdir /usr/share/oci-umount/oci-umount.d -p
mkdir /run/flannel/
cat <<EOF> /run/flannel/subnet.env
FLANNEL_NETWORK=172.100.0.0/16
FLANNEL_SUBNET=172.100.1.0/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true
EOF
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.9.1/Documentation/kube-flannel.yml

安装网络服务插件

export POD_SUBNET=10.100.0.0/16
kubectl apply -f https://kuboard.cn/install-script/v1.22.x/calico-operator.yaml
wget https://kuboard.cn/install-script/v1.22.x/calico-custom-resources.yaml
sed -i "s#192.168.0.0/16#${POD_SUBNET}#" calico-custom-resources.yaml
kubectl apply -f calico-custom-resources.yaml

初始化worker节点

  • 获取Join命令参数,在Master节点执行
# 只在 master 节点执行
kubeadm token create --print-join-command

在这里插入图片描述

  • 在worker节点初始化
# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=192.168.2.213
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.demo
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts

# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.demo:6443 --token 5b9jll.il82u79npx3kbkwn     --discovery-token-ca-cert-hash sha256:0931226114f8f574a43d8f86eb5183ea89b2a72767f751dde1e8de1819263abd

检查最终运行效果

[root@k8smaster ~]# kubectl get nodes

搭建成功效果:
在这里插入图片描述

安装Kuboard管理K8s集群

  • 安装Kuboard
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 您也可以使用下面的指令,唯一的区别是,该指令使用华为云的镜像仓库替代 docker hub 分发 Kuboard 所需要的镜像
# kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml
  • 查看启动情况
watch kubectl get pods -n kuboard

查看效果:
在这里插入图片描述

在浏览器中打开链接 http://your-node-ip-address:30080
首页
在这里插入图片描述

  • 输入初始用户名和密码,并登录
    用户名: admin
    密码: Kuboard123
    首页效果
    在这里插入图片描述

10.4 Kubernetes操作

首先我们要了解Kubernetes在运行我们的资源时,关联到了哪些内容

  • 资源的构建方式:
    • 采用kubectl的命令方式
    • yaml文件方式
10.4.1 Namespace
  • 命名空间:主要是为了对Kubernetes中运行的资源进行过隔离, 但是网络是互通的,类似Docker的容器,可以将多个资源配置到一个NameSpace中。而NameSpace可以对不同环境进行资源隔离,默认情况下Kubernetes提供了default命名空间,在构建资源时,如果不指定资源,默认采用default资源。

命令方式:

# 查看现有的全部命名空间
kubectl get ns

# 创建命名空间
kubectl create ns 命名空间名称

# 删除现有命名空间, 并且会删除空间下的全部资源
kubectl delete ns 命名空间名称

yaml文件方式:(构建资源时,设置命名空间)

apiVersion: v1
kind: Namespace
metadata:
  name: test
10.4.2 Pod
  • Pod:Kubernetes运行的一组容器,Pod是Kubernetes的最小单位,但是对于Docker而然,Pod中会运行多个Docker容器
    命令方式:
# 查看所有命名空间下运行的pod,不加-A表示default命名空间下
kubectl get pods -A

# 查看指定Namespace下的Pod
kubectl get pod [-n 命名空间]    #(默认default)

# 创建Pod
kubectl run pod名称 --image=镜像名称

# 查看Pod详细信息
kubectl describe pod pod名称

# 删除pod
kubectl delete pod pod名称 [-n 命名空间]  #(默认default)

# 查看pod输出的日志
kubectl logs -f pod名称

# 进pod容器内部
kubectl exec -it pod名称 -- bash

# 查看kubernetes给Pod分配的ip信息,并且通过ip和容器的端口,可以直接访问
kubectl get pod -owide

yaml方式(推荐)

**apiVersion: v1
kind: Pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称

# 启动Pod:kubectl apply -f yaml文件名称
# 删除Pod:kubectl delete -f yaml文件名称**

Pod中运行多个容器

**apiVersion: v1
kind: Pod
metadata:
  labels:
    run: 运行的pod名称
  name: pod名称
  namespace: 命名空间
spec:
  containers:
  - image: 镜像名称
    name: 容器名称
  - image: 镜像名称
    name: 容器名称
…………**
# 部署一个nginx-tomcat的pod,一个pod中可以运行多个容器
apiVersion: v1
kind: Pod
metadata:
  name: nginx-tomcat
  namespace: test
spec:
  containers:
  - image: nginx
    name: nginx
  - image: tomcat
    name: tomcat 

启动后可以查看到
Kuboard效果:
在这里插入图片描述

10.4.3 Deployment

部署时,可以通过Deployment管理和编排Pod
Deployment部署实现
命令方式:

# 基于Deployment启动容器
kubectl create deployment deployment名称 --image=镜像名称
# ex:在test命名空间下创建一个deployment类型的pod
kubectl create deployment deploy-nginx --image=nginx -n test

# 用deployment启动的容器会在被删除后自动再次创建,达到故障漂移的效果
# 需要使用deploy的方式删除deploy
# 查看现在的deployment
kubectl get deployment

# 删除deployment
kubectl delete deployment deployment名称
# ex:删除test命名空间下的pod:deploy-nginx
kubectl delete pod deploy-nginx --image=nginx -n test

# 基于Deployment启动容器并设置Pod副本数
kubectl create deployment deployment名称 --image=镜像名称 --replicas 集群个数

配置文件方式:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

kubectl apply -f deployment-nginx.yml
正常使用kubectl运行yaml即可

弹性伸缩功能

# 基于scale实现弹性伸缩
kubectl scale deploy/Deployment名称 --replicas 集群个数
# 或者修改yaml文件
kubectl edit deploy Deployment名称

图形化页面修改:
在这里插入图片描述

灰度发布
Deploy可以在部署新版本数据时,成功启动一个pod,才会下线一个老版本的Pod

kubectl set image deployment/Deployment名称 容器名=镜像:版本
10.4.4 Service

可以将多个Pod对外暴露一个Service,让客户端可以通过Service访问到这一组Pod,并且可以实现负载均衡

ClusterIP方式:
ClusterIP是集群内部Pod之间的访问方式
命令实现效果:

# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口

之后通过kubectl get service查看Service提供的ip,即可访问
在这里插入图片描述

也可以通过Deployment名称.namespace名称.svc作为域名访问
在服务容器内执行:
在这里插入图片描述

NodePort方式:
ClusterIP的方式只能在Pod内部实现访问,但是一般需要对外暴露网关,所以需要NodePort的方式Pod外暴露访问
命令实现方式:

# 通过生成service映射一个Deployment下的所有pod中的某一个端口的容器
kubectl expose deployment Deployment名称 --port=Service端口号 --target-port=Pod内容器端口 --type=NodePort

查看Service效果:
**加粗样式**
在这里插入图片描述

Service也可以通过yaml文件实现:

apiVersion: v1
kind: Service
metadata:
  labels
    app: nginx
  name: nginx
  spec:
    selector:
      app: nginx
    ports:
    - port: 8888
     protocol: TCP
     targetPort: 80

通过apply启动就也可以创建Service
测试效果Deployment部署,通过Service对外暴露端口

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test
  labels:
    app: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-deployment
  namespace: test
  labels:
    app: nginx-deployment
spec:
  selector:
    app: nginx
  ports:
  - port: 8888
    protocol: TCP
    targetPort: 80
  type: NodePort

可以查看到暴露的信息
Service信息

10.4.5 Ingress

Kubernetes推荐将Ingress作为所有Service的入口,提供统一的入口,避免多个服务之间需要记录大量的IP或者域名,毕竟IP可能改变,服务太多域名记录不方便。

Ingress底层其实就是一个Nginx, 可以在Kuboard上直接点击安装:
Kuboard安装
**加粗样式**
因为副本数默认为1,但是k8s整体集群就2个节点,所以显示下面即为安装成功
在这里插入图片描述

可以将Ingress接收到的请求转发到不同的Service中。
推荐使用yaml文件方式

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress
  namespace: test
spec:
  ingressClassName: ingress
  rules:
  - host: nginx.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-deployment
            port:
              number: 8888

启动时问题:
在这里插入图片描述

Kuboard安装的Ingress有admission的校验配置,需要先删除配置再启动
找到指定的ingress的校验信息,删除即可
删除信息

# 查看校验webhook的配置
kubectl get -A ValidatingWebhookConfiguration

# 删除指定的校验
kubectl delete ValidatingWebhookConfiguration ingress-nginx-admission-my-ingress-controller

配置本地hosts文件:
在这里插入图片描述

接下来就可以访问在Service中暴露的Nginx信息
注意:必须是域名+IP才能访问,只用域名访问会报错。
在这里插入图片描述

10.5 Jenkins集成Kubernetes

10.5.1 gitlab上准备部署的yml文件

在gitlab上创建一个pipeline.yml文件,供Jenkins拉取并通知目标服务器执行

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: 192.168.2.211:80/repo/pipeline:v3.0.0   # 在harbor仓库中复制一个镜像取得
        command: ["/bin/bash", "-ce", "tail -f /dev/null"]   # 保持容器持续运行,而不是一致重启
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  namespace: test
  labels:
    app: pipeline
  name: pipeline
spec:
  selector:
    app: pipeline
  ports:
  - port: 8081
    targetPort: 8080
  type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: test
  name: pipeline
spec:
  ingressClassName: ingress
  rules:
  - host: ingress.pipeline.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: pipeline
            port:
              number: 8081

10.5.2 Harbor私服配置

在尝试用kubernetes的yml文件启动pipeline服务时,会出现Kubernetes无法拉取镜像的问题,这里需要在kubernetes所在的Linux中配置Harbor服务信息,并且保证Kubernetes可以拉取Harbor上的镜像

  • 设置Master和Worker的私服地址信息
    在这里插入图片描述

  • 在Kuboard上设置私服密文信息
    在这里插入图片描述

按照复制指令的位置测试认证,效果如下 :
在这里插入图片描述

10.5.3 测试使用效果

执行kubectl命令,基于yml启动服务,并且基于部署后服务的提示信息以及Ingress的设置,直接访问
在这里插入图片描述
在这里插入图片描述
修改Windows的hosts表后访问,注意"/test’’

10.5.3 Jenkins远程调用
  • 将pipeline.yml配置到Gitlab中
    配置yml文件

  • 配置Jenkins的目标服务器,可以将yml文件传输到K8s的Master上
    设置目标服务器

  • 修改Jenkinsfile,重新设置流水线任务脚本,并测试效果
    自动生成脚本

修改Jenkinsfile文件内容

立即构建查看效果

查看k8smaster上是否接收到文件:
在这里插入图片描述

  • 设置Jenkins无密码登录k8s-master
    将Jenkins中公钥信息复制到k8s-master的~/.ssh/authorized_keys中,保证远程连接无密码
    远程执行命令无需密码

  • 设置执行kubectl的脚本到Jenkinsfile,要写pipeline.yml的绝对路径
    在这里插入图片描述
    红框里的路径一定要写绝对路径,否则会默认去找root所在目录下的pipeiline.yml文件。

  • 执行查看效果
    执行流水线

可以查看到yml文件是由变化的, 这样k8s就会重新加载

  • 查看效果
    效果

Ps:这种方式更适应与CD操作,将项目将基于某个版本部署到指定的目标服务器

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:${tag} .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
            }
        }
         stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh 'ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml'
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}

10.6 基于GitLab的WebHooks

这里要实现自动化的一个CI操作,也就是开发人员Push代码到Git仓库后,Jenkins会自动的构建项目,将最新的提交点代码构建并进行打包部署,这里区别去上述的CD操作,CD操作需要基于某个版本进行部署,而这里每次都是将最新的提交点集成到主干上并测试。

10.6.1 WebHooks通知
  1. 开启Jenkins的自动构建
    构建触发器:
    下载插件GitLab
    在这里插入图片描述

配置构建触发器
在这里插入图片描述

  1. 设置Gitlab的Webhooks
    设置network可以访问本地
    在这里插入图片描述

输入URL,测试报错403
在这里插入图片描述

  1. 关闭Jenkins的Gitlab认证
    关闭Jenkins的Gitlab认证,需要插件[GitLab Authentication]
    在这里插入图片描述

  2. 再次测试Gitlab
    再次测试

10.6.2 修改配置

修改Jenkinsfile实现基于最新提交点实现持续集成效果,将之前引用${tag}的全部替换成latest

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:latest .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''
            }
        }
         stage('任务6:将pipeline.yml文件通过publish over ssh传到k8smaster上') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh 'ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml'
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}

修改pipeline.yml,更改镜像版本

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: test
  name: pipeline
  labels:
    app: pipeline
spec:
  replicas: 2
  selector:
    matchLabels:
      app: pipeline
  template:
    metadata:
      labels:
        app: pipeline
    spec:
      containers:
      - name: pipeline
        image: 192.168.2.211:80/repo/pipeline:latest   # 在harbor仓库中复制一个镜像取得
        command: ["/bin/bash", "-ce", "tail -f /dev/null"]   # 保持容器持续运行,而不是一致重启
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

# 省略其他内容…………
10.6.3 自动滚动更新

因为pipeline.yml文件没有改变时,kubectl每次不会重新加载apply,这样会导致Pod中的容器不会动态更新,这里需要使用kubectl的rollout restart命令滚动更新。代码一变化就会自动构建。

设置Jenkinsfle
在这里插入图片描述
在这里插入图片描述

// 所有脚本命令包含在pipeline{}中
pipeline {  
	// 指定任务在哪个节点执行(Jenkins支持分布式)
    agent any
    
    // 声明全局环境变量方便后面使用,key = 'value'形式,指定变量名=变量值信息
    environment{
        harborUser = 'admin'
        harborPassword = 'Harbor12345'
        harborAddress = '192.168.2.211:80'
        harborRepo = 'repo'
    }

    // 存放所有任务的合集
    stages {
    	// 单个任务
        stage('任务1:拉取git仓库代码') {
        	// 实现任务的具体流程
            steps {
                checkout([$class: 'GitSCM', branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.2.210/root/test.git']]])
            }
        }
		// 单个任务
        stage('任务2:通过maven构建项目') {
        	// 实现任务的具体流程
            steps {
                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTest'
            }
        }
         stage('任务3:通过sonarqube做代码质量检测') {
            steps {
                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=7e47cd48d08789e76ba106dd772f9bfaa15d46ff'
            }
        }
         stage('任务4:通过docker制作自定义镜像') {
            steps {
                sh '''mv ./target/*.jar ./
docker build -t ${JOB_NAME}:latest .'''
            }
        }
         stage('任务5:将自定义镜像推送到harbor') {
            steps {
                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborAddress}
docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''
            }
        }
         stage('任务6:将pipeline.yml文件通过publish over ssh传到k8smaster上') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
            }
        }
        stage('远程执行k8s-master的kubectl命令') {
            steps {
                sh '''ssh root@192.168.2.212 kubectl apply -f /usr/local/k8s/pipeline.yml
ssh root@192.168.2.212 kubectl rollout restart deployment pipeline -n test'''
            }
        }
    }
    post {
        success {
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
        failure{
            dingtalk(
                robot: 'Jenkins-DingDing',
                type: 'MARKDOWN',
                title: "success: ${JOB_NAME}",
                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:latest\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]
            )
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kubernetes是一种可扩展和便携式的容器编排系统,可以帮助开发人员和运维人员更轻松地管理和部署容器化应用程序。下面是Kubernetes DevOps搭建流程的步骤: 1. 安装Docker和Kubernetes CLI Docker是一种容器技术,可以在其中运行应用程序。Kubernetes CLI是Kubernetes的命令行工具,可以帮助您管理Kubernetes集群。在安装之前,请确保您的服务器版本符合要求。 2. 安装Kubernetes集群 您可以使用Kubeadm、Minikube或Kops等工具来安装Kubernetes集群。Kubeadm是官方推荐的安装工具,可以帮助您快速轻松地在本地或云服务器上安装Kubernetes集群。 3. 创建Kubernetes对象 Kubernetes对象是Kubernetes中的基本构建块,可以帮助您定义和管理应用程序的部署、服务、存储和网络等资源。您可以使用YAML文件创建Kubernetes对象。 4. 部署应用程序 使用Kubernetes对象和Docker镜像,您可以轻松地部署应用程序。您可以将应用程序部署为Pod、Deployment或Service等Kubernetes对象。 5. 监控和日志记录 Kubernetes提供了许多内置的监控和日志记录工具,例如Prometheus、Grafana和ELK等工具。您可以使用这些工具来监控和分析应用程序的性能和状态。 6. 自动化部署和测试 使用自动化工具(例如Jenkins、GitLab CI/CD等),您可以自动化部署和测试应用程序。这些工具可以帮助您更快地部署新功能和修复程序错误。 7. 安全和身份验证 Kubernetes提供了内置的安全和身份验证机制,例如RBAC(基于角色的访问控制)、TLS(传输层安全协议)和OAuth2等。您可以使用这些机制来保护应用程序和数据的安全性。 以上是Kubernetes DevOps搭建流程的基本步骤。在实际操作中,您可能需要根据自己的业务需求和实际情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是小bā吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值