使用GitLab CI构建持续集成案例

1. 部署GitLab

(1)基础准备

解压软件包并导入镜像:

[root@master ~]# curl -O http://mirrors.douxuedu.com/competition/Gitlab-CI.tar.gz
[root@master ~]# tar -zxvf Gitlab-CI.tar.gz
[root@master ~]# ctr -n k8s.io image import gitlab-ci/images/images.tar
[root@master ~]# docker load < gitlab-ci/images/images.tar
(2)部署GitLab服务

新建命名空间gitlab-ci:

[root@master ~]# kubectl create ns gitlab-ci
namespace/gitlab-ci created

在gitlab-ci命名空间下部署GitLab,将80端口以NodePort方式对外暴露为30880,YAML资源文件如下:

[root@master ~]# cd gitlab-ci
[root@master gitlab-ci]# vi gitlab-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: gitlabnamespace: gitlab-cilabels:name: gitlab
spec:selector:matchLabels:name: gitlabtemplate:metadata:name: gitlablabels:name: gitlabspec:containers:- name: gitlabimage: gitlab/gitlab-ce:latestimagePullPolicy: IfNotPresentenv:- name: GITLAB_ROOT_PASSWORDvalue: Abc@1234- name: GITLAB_ROOT_EMAILvalue: 123456@qq.comports:- name: httpcontainerPort: 80volumeMounts:- name: gitlab-configmountPath: /etc/gitlab- name: gitlab-logsmountPath: /var/log/gitlab- name: gitlab-datamountPath: /var/opt/gitlabvolumes:- name: gitlab-confighostPath:path: /home/gitlab/conf- name: gitlab-logshostPath:path: /home/gitlab/logs- name: gitlab-datahostPath:path: /home/gitlab/data

创建service服务释放端口

[root@master gitlab-ci]# vi gitlab-svc.yaml
apiVersion: v1
kind: Service
metadata:name: gitlabnamespace: gitlab-cilabels:name: gitlab
spec:type: NodePortports:- name: httpport: 80targetPort: httpnodePort: 30880selector:name: gitlab

创建资源:

[root@master gitlab-ci]# kubectl apply -f gitlab-deploy.yaml
deployment.apps/gitlab created
[root@master gitlab-ci]# kubectl apply -f gitlab-svc.yaml
service/gitlab created

查看Pod:

[root@master gitlab-ci]# kubectl -n gitlab-ci get pods
NAME                      READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp    1/1     Running   0          45s
(3)自定义hosts

查看GitLab Pod的IP地址:

[root@master gitlab-ci]# kubectl -n gitlab-ci get pods -owide
NAME                      READY   STATUS    RESTARTS   AGE    IP            NODE               NOMINATED NODE   READINESS GATES
gitlab-7b54df755-6ljtp    1/1     Running   0          50s   10.244.1.43   k8s-worker-node1   <none>           <none>

在集群中自定义hosts添加gitlab Pod的解析:

[root@master gitlab-ci]# kubectl edit configmap coredns -n kube-system
........
apiVersion: v1
data:Corefile: |.:53 {errorshealth {lameduck 5s}readykubernetes cluster.local in-addr.arpa ip6.arpa {pods insecurefallthrough in-addr.arpa ip6.arpattl 30}
## 添加以下字段hosts {10.244.1.43 gitlab-7b54df755-6ljtpfallthrough}prometheus :9153
##删除以下三行字段forward . /etc/resolv.conf {max_concurrent 1000}cache 30loopreloadloadbalance}
........
[root@master gitlab-ci]# kubectl -n kube-system rollout restart deploy coredns
deployment.apps/coredns restarted

进入gitlab pod中

[root@master gitlab-ci]# kubectl exec -ti -n gitlab-ci gitlab-7b54df755-6ljtp bash
root@gitlab-7b54df755-6ljtp:/# vi /etc/gitlab/gitlab.rb 

在首行添加(ip为pod IP地址)

external_url 'http://10.244.1.43:80'
root@gitlab-7b54df755-6ljtp:/# reboot
root@gitlab-7b54df755-6ljtp:/# exit
(4)访问GitLab

查看Service:

[root@master gitlab-ci]# kubectl -n gitlab-ci get svc
NAME     TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
gitlab   NodePort   10.96.108.3   <none>        80:30880/TCP   3m33s

通过http://10.24.2.14:30880访问GitLab,用户名123456@qq.com,密码Abc@1234,如图1所示:

1 devops

图1

(5)上传项目包

点击“Create a project”按钮,如图2所示:

2 devops

图2

点击“Create blank project”创建项目demo-2048,可见等级选择“Public”,如图3所示:

3 devops

图3

点击“Create project”,进入项目,如图4所示:

4 devops

图4

将源代码推送到项目中:

[root@master gitlab-ci]# cd /root/gitlab-ci/demo-2048
[root@master demo-2048]# git config --global user.name "administrator"
[root@master demo-2048]# git config --global user.email "admin@example.com"
[root@master demo-2048]# git remote remove origin
[root@master demo-2048]# git remote add origin http://10.24.2.14:30880/root/demo-2048.git
[root@master demo-2048]# git add .
[root@master demo-2048]# git commit -m "initial commit"
[master (root-commit) 105c032] initial commit
[root@master demo-2048]# git push -u origin drone
Username for 'http://10.24.2.14:30880': root
Password for 'http://root@10.24.2.14:30880':              #输入密码Abc@1234
Counting objects: 189, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (137/137), done.
Writing objects: 100% (189/189), 43.35 KiB | 0 bytes/s, done.
Total 189 (delta 40), reused 0 (delta 0)
remote: Resolving deltas: 100% (40/40), done.
To http://10.24.2.14:30880/root/cloud-manager.git* [new branch]      master -> master
Branch master set up to track remote branch master from origin.

刷新页面如图5、图6所示:

5 devops

图5

6 devops

图6

2. 部署GitLab CI Runner
(1)获取 GitLab CI Register Token

登录GitLab管理界面(http://10.24.2.14:30880/admin),然后点击左侧菜单栏中的CI/CD下的Runners,如图7所示:

7 devops

图7

点击右侧按钮,如图8所示:

8 devops

图8

记录下参数Registration token的值,后续注册Runners时会用到该参数。

(2)修改GitLab Runner配置清单

首先创建一个名为gitlab-ci的serviceAccount:

[root@master ~]# cd /root/gitlab-ci/
[root@master gitlab-ci]# cat runner-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: gitlab-cinamespace: gitlab-ci
[root@master gitlab-ci]# cat runner-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: gitlab-cinamespace: gitlab-ci
rules:- apiGroups: [""]resources: ["*"]verbs: ["*"]
[root@master gitlab-ci]# cat runner-rb.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: gitlab-cinamespace: gitlab-ci
subjects:
- kind: ServiceAccountname: gitlab-cinamespace: gitlab-ci
roleRef:kind: Rolename: gitlab-ciapiGroup: rbac.authorization.k8s.io
[root@master gitlab-ci]# kubectl apply -f runner-sa.yaml 
serviceaccount/gitlab-ci created
[root@master gitlab-ci]# kubectl apply -f runner-role.yaml 
role.rbac.authorization.k8s.io/gitlab-ci created
[root@master gitlab-ci]# kubectl apply -f runner-rb.yaml 
rolebinding.rbac.authorization.k8s.io/gitlab-ci created
[root@master gitlab-ci]# kubectl -n gitlab-ci get sa
NAME        SECRETS   AGE
default     1         10m
gitlab-ci   1         21s

给default用户赋权:

[root@master gitlab-ci]# vi default.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: defaultlabels:k8s-app: gitlab-default
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: defaultnamespace: gitlab-ci
[root@master gitlab-ci]# kubectl apply -f default.yaml 
clusterrolebinding.rbac.authorization.k8s.io/default created

修改values.yaml文件

[root@master gitlab-ci]# tar -zxvf gitlab-runner-0.43.0.tgz
[root@master gitlab-ci]# vi gitlab-runner/values.yaml
...## Use the following Kubernetes Service Account name if RBAC is disabled in this Helm chart (see rbac.create)### serviceAccountName: defaultserviceAccountName: gitlab-ci   #添加,注意缩进格式
... 
## The GitLab Server URL (with protocol) that want to register the runner against
## ref: https://docs.gitlab.com/runner/commands/index.html#gitlab-runner-register
##
# gitlabUrl: http://gitlab.your-domain.com/
gitlabUrl: http://10.24.2.14:30880/      #添加,缩进顶格
...
## The Registration Token for adding new Runners to the GitLab Server. This must
## be retrieved from your GitLab Instance.
## ref: https://docs.gitlab.com/ce/ci/runners/index.html
##
# runnerRegistrationToken: ""
runnerRegistrationToken: "riU8c4D2SNkKAv8GS9q_"    #添加,缩进顶格
...config: |[[runners]][runners.kubernetes]namespace = "{{.Release.Namespace}}"image = "ubuntu:16.04"privileged = true     #添加,注意缩进格式
...
## For RBAC support:
rbac:create: true		#修改为true

在进行maven/npm等构建工具打包时所依赖的包默认会从私服获取,为了加快构建速度可以在本地缓存一份,在此,需要创建PVC来持久化构建缓存,加速构建速度。为了节省存储空间决定不在每个项目中存储构建缓存,而是配置全局缓存。

创建一个PVC用于挂载到Pod中使用:

[root@master gitlab-ci]# cat gitlab-runner/templates/pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:name: ci-build-cache-pvnamespace: gitlab-cilabels:type: local
spec:storageClassName: manualcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/opt/ci-build-cache"
[root@master gitlab-ci]# cat gitlab-runner/templates/pvc.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: ci-build-cache-pvcnamespace: gitlab-ci
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 5Gi

编辑values.yaml文件,添加构建缓存信息配置:

[root@master gitlab-ci]# vi gitlab-runner/values.yaml
## configure build cache
cibuild:cache:pvcName: ci-build-cache-pvcmountPath: /home/gitlab-runner/ci-build-cache

使用官方提供的runner镜像注册runner,默认的runner配置文件在/home/gitlab-runner/.gitlab-runner/config.toml。编辑templates/configmap.yml文件,entrypoint部分添加runner配置。在start之前添加,这样runner在创建构建Pod的时候会根据配置挂载PVC:

[root@master gitlab-ci]# vi gitlab-runner/templates/configmap.yaml
cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
[[runners.kubernetes.volumes.pvc]]
name = "{{.Values.cibuild.cache.pvcName}}"
mount_path = "{{.Values.cibuild.cache.mountPath}}"
EOF# Start the runner
exec /entrypoint run --user=gitlab-runner \--working-directory=/home/gitlab-runner
### 注意缩进cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF[[runners.kubernetes.volumes.pvc]]name = "{{.Values.cibuild.cache.pvcName}}"mount_path = "{{.Values.cibuild.cache.mountPath}}"EOF# Start the runnerexec /entrypoint run --user=gitlab-runner \--working-directory=/home/gitlab-runner
(3)部署GitLab Runner

部署GitLab Runner:

[root@master gitlab-ci]# helm -n gitlab-ci install gitlab-runner gitlab-runner
NAME: gitlab-runner
LAST DEPLOYED: Wed Jul 27 11:17:11 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Your GitLab Runner should now be registered against the GitLab instance reachable at: "http://10.24.2.14:30880/"Runner namespace "gitlab-ci" was found in runners.config template.

查看Realse和Pod:

[root@master gitlab-ci]# helm -n gitlab-ci list
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
gitlab-runner   gitlab-ci       1               2022-07-27 11:17:11.456495093 +0800 CST deployed        gitlab-runner-0.43.0    15.2.0     
[root@master gitlab-ci]# kubectl -n gitlab-ci get pods
NAME                             READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp           1/1     Running   0          30m
gitlab-runner-5bc5578655-2ct85   1/1     Running   0          58s

返回Runners页面并刷新,如图9所示:

9 devops

图9

可以看到Runner状态为online,表明已经注册成功。

3. 配置GitLab
(1)添加Kubernetes集群

在GitLab Admin界面下,依次点击“Settings”→“Network”,展开“Outbound requests”,勾选“Allow requests to the local network from webhooks and integrations”,并保存。如图10所示:

10 devops

图10

进入demo-2048项目,新建配置文件(.gitlab/agents//config.yaml),此处为.gitlab/agents/kubernetes-agent/config.yaml,如图11所示:

11 devops

图11

config.yaml文件格式如下:

gitops:manifest_projects:- id: gitlab-org/cluster-integration/gitlab-agentdefault_namespace: my-nspaths:# Read all YAML files from this directory.- glob: '/team1/app1/*.yaml'# Read all .yaml files from team2/apps and all subdirectories.- glob: '/team2/apps/**/*.yaml'# If 'paths' is not specified or is an empty list, the configuration below is used.- glob: '/**/*.{yaml,yml,json}'reconcile_timeout: 3600sdry_run_strategy: noneprune: trueprune_timeout: 3600sprune_propagation_policy: foregroundinventory_policy: must_match

依次点击左侧菜单栏“Operate”→“Kubernetes clusters”,如图12所示:

12 devops

图12

点击“Connect a cluster”,并选择配置文件kubernetes-agent,如图13所示:

13 devops

图13

点击“Register”,如图14所示:

14 devops

图14

通过如下命令安装agent,将config.token和config.kasAddress的值修改为上一步页面显示的值:

[root@master gitlab-ci]# helm upgrade --install kubernetes-agent  gitlab-agent-1.1.0.tgz     --namespace gitlab-ci     --create-namespace     --set image.tag=v16.2.0     --set config.token=vTPAASMpwTW-tEQ3NHYc3y5YKCHCFep466q52dgaRCstXyXDzg     --set config.kasAddress=ws://10.244.0.23/-/kubernetes-agent/
NAME: kubernetes-agent
LAST DEPLOYED: Wed Jul 13 17:27:21 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@master gitlab-ci]# helm upgrade --install kubernetes-agent gitlab-agent-1.1.0.tgz--namespace gitlab-ci--create-namespace--set image.tag=v16.2.0--set config.token=vTPAASMpwTW-tEQ3NHYc3y5YKCHCFep466q52dgaRCstXyXDzg--set config.kasAddress=ws://10.244.0.23/-/kubernetes-agent/
NAME: kubernetes-agent
LAST DEPLOYED: Wed Jul 13 17:27:21 2022
NAMESPACE: gitlab-ci
STATUS: deployed
REVISION: 1
TEST SUITE: Nonehelm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install kubernetes-agent gitlab-agent-1.1.0.tgz \--namespace gitlab-ci \--create-namespace \--set image.tag=v16.2.0 \--set config.token=NgYd7JkZN4T1dcWpx9PCsTC3FgVx3MQAycyXQArAGukxn_ymwA \--set config.kasAddress=ws://192.168.100.3:30880/-/kubernetes-agent/helm install kubernetes-agent gitlab-agent-1.1.0.tgz \--namespace gitlab-ci \--create-namespace \--set image.tag=v16.2.0 \--set config.token=NgYd7JkZN4T1dcWpx9PCsTC3FgVx3MQAycyXQArAGukxn_ymwA \--set config.kasAddress=ws://192.168.100.3:30880/-/kubernetes-agent/

查看Release和Pod:

[root@ k8s-master-node1 gitlab-ci]# helm -n gitlab-ci list
NAME                    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
gitlab-runner           gitlab-ci       1               2022-07-27 11:17:11.456495093 +0800 CST deployed        gitlab-runner-0.43.0    15.2.0     
kubernetes-agent        gitlab-ci       1               2022-07-27 11:22:27.285028745 +0800 CST deployed        gitlab-agent-1.1.0      v15.0.0
[root@master gitlab-ci]# kubectl get pod -n gitlab-ci 
NAME                                             READY   STATUS    RESTARTS      AGE
gitlab-7665cf47c5-8ghbw                          1/1     Running   1 (89m ago)   96m
gitlab-runner-665f4647b9-zhrlh                   1/1     Running   0             18m
kubernetes-agent-gitlab-agent-6df7787756-b4rzx   1/1     Running   0             14s

点击“Close”并刷新界面,如图15所示:

15 devops

图15

可以看到,Kubernetes集群已连接成功。

(2)开启Container Registry

在GitLab中开启Container Registry,进入demo-2048项目,依次点击“Settings”→“CI/CD”,如图16所示:

16 devops

图16

展开“Variables”,配置镜像仓库相关的参数。

添加REGISTRY变量,其值为Harbor仓库地址,如图17所示:

17 devops

17图

添加完成后如图18所示:

18 devops

图18

然后继续添加变量REGISTRY_IMAGE(demo)、REGISTRY_USER(admin)、REGISTRY_PASSWORD(Harbor12345)、REGISTRY_PROJECT(demo)和HOST(10.24.2.14),添加完成后保存变量,如图19所示:

19 devops

图19

4. Harbor仓库配置
(1)更新Harbor仓库

修改harbor仓库的helm配置:

[root@master ~]# vi /opt/harbor/values.yaml#将127.0.0.1改为master节点实际IP地址
externalURL: http://10.26.7.197:80
…

修改完成后,更新harbor仓库:

[root@master ~]# helm -n harbor upgrade harbor /opt/harbor
(2)添加demo仓库

登录Harbor仓库新建一个公开项目demo,如图20所示:

20 devops

图20

将镜像tomcat:8.5.64-jdk8推送到该项目中:

[root@master gitlab-ci]# ctr -n k8s.io images tag docker.io/library/tomcat:8.5.64-jdk8 10.24.2.14/library/tomcat:8.5.64-jdk8
[root@master gitlab-ci]# ctr -n k8s.io images push  10.24.2.14/library/tomcat:8.5.64-jdk8   --plain-http=true  --user admin:Harbor12345 

修改containerd配置文件

[root@master ~]# vi /etc/containerd/config.toml 
•••[plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."harbor.com"]endpoint = ["http://harbor.com"][plugins."io.containerd.grpc.v1.cri".registry.mirrors."10.24.2.14"]endpoint = ["http://10.24.2.14"]
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart containerd
5. .gitlab-ci.yaml文件
(1).gitlab-ci.yaml文件简介

GitLab CI通过YAML文件管理配置job,定义了job应该如何工作。该文件存放于仓库的根目录,默认名为.gitlab-ci.yaml。

  • gitlab-ci.yml文件中指定了CI的触发条件、工作内容、工作流程,编写和理解此文件是CI实战中最重要的一步,该文件指定的任务内容总体构成了1个pipeline、1个pipeline包含不同的stage执行阶段、每个stage包含不同的具体job脚本任务。

当有新内容push到仓库,或者有代码合并后,GitLab会查找是否有.gitlab-ci.yml文件,如果文件存在,Runners将会根据该文件的内容开始build本次commit。

(2)Pipeline

一个.gitlab-ci.yml文件触发后会形成一个pipeline任务流,由gitlab-runner来运行处理。一次Pipeline其实相当于一次构建任务,里面可以包含很多个阶段(Stages),如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。任何提交或者Merge Request的合并都可以触发Pipeline构建。

(3)Stages

Stages表示一个构建阶段,也就是上面提到的一个流程。我们可以在一次Pipeline中定义多个Stages,这些Stages会有以下特点:

  • 所有Stages会按照顺序运行,即当一个Stage完成后,下一个Stage才会开始
  • 只有当所有Stages完成后,该构建任务(Pipeline)才会成功
  • 如果任何一个Stage失败,那么后面的Stages不会执行,该构建任务(Pipeline)失败
(4)Jobs

Jobs表示构建工作,表示某个Stage里面执行的工作。我们可以在Stages里面定义多个Jobs,这些Jobs会有以下特点:

  • 相同Stage中的Jobs会并行执行
  • 相同Stage中的Jobs都执行成功时,该Stage才会成功
  • 如果任何一个Job失败,那么该Stage失败,即该构建任务(Pipeline)失败

一个Job被定义为一列参数,这些参数指定了Job的行为。下表列出了主要的Job参数,见表2:

表2

参数是否必须描述
script由Runner执行的shell脚本或命令
image用于docker镜像
services用于docker服务
stages定义构建阶段
typesstages 的别名(已废除)
before_script定义在每个job之前运行的命令
after_script定义在每个job之后运行的命令
variable定义构建变量
cache定义一组文件列表,可在后续运行中使用
(5)编写流水线脚本

编写.gitlab-ci.yml:

stages:- build- release- reviewvariables:MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository"maven_build:image: maven:3.6-jdk-8stage: buildonly:- dronescript:- cp -r /opt/repository /opt/cache/.m2/- mvn clean install -DskipTests=true- cd target && jar -xf 2048.war- cp -rfv 2048 /home/gitlab-runner/ci-build-cacheimage_build:image: docker:18.09.7stage: releasevariables:DOCKER_DRIVER: overlayDOCKER_HOST: tcp://localhost:2375#CI_DEBUG_TRACE: "true"services:- name: docker:18.09.7-dindcommand: ["--insecure-registry=0.0.0.0/0"]script:- cp -rfv /home/gitlab-runner/ci-build-cache/2048 .- sed -i "s/10.24.2.3/$REGISTRY/g" ./Dockerfiles/Dockerfile- docker build -t "${REGISTRY_IMAGE}:latest" -f ./Dockerfiles/Dockerfile .- docker tag "${REGISTRY_IMAGE}:latest" "${REGISTRY}/${REGISTRY_PROJECT}/${REGISTRY_IMAGE}:latest"- docker login -u "${REGISTRY_USER}" -p "${REGISTRY_PASSWORD}" "${REGISTRY}"- docker push "${REGISTRY}/${REGISTRY_PROJECT}/${REGISTRY_IMAGE}:latest"deploy_review:image: kubectl:1.22stage: reviewonly:- dronescript:- sed -i "s/REGISTRY/$REGISTRY/g" template/demo-2048.yaml- kubectl apply -f template/
6. 构建CICD
(1)触发构建

流水线脚本编写完成后会自动触发构建,进入demo-2048项目,依次点击“build”→“Pipelines”,可以看到GitLab CI开始执行构建任务了,如图21所示:

21 devops

图21

点击“running”可查看构建详情,如图22所示:

22 devops

图22

点击流水线的任一阶段可查看构建详情,如图23所示:

23 devops

图23

此时Runner Pod所在的namespace下面也会出现1个新的Pod:

[root@master gpmall]# kubectl -n gitlab-ci get pods
NAME                                             READY   STATUS    RESTARTS   AGE
gitlab-7b54df755-6ljtp                           1/1     Running   0          3h6m
gitlab-runner-5dc59b5b77-x2vw8                   1/1     Running   0          129m
kubernetes-agent-gitlab-agent-64bf6d87f4-vgxbx   1/1     Running   0          151m
runner-x16szo9v-project-2-concurrent-0jzq5h      2/2     Running   0          8s

这个新Pod就是用来执行具体的Job任务的。

构建完成后如图24所示:

24 devops

图24

查看新发布的Pod:

[root@master manifests]# kubectl -n gitlab-ci get pods
NAME                                             READY   STATUS    RESTARTS   AGE
demo-2048-6bf767d4d4-kks65                       1/1     Running   0          2m22s
gitlab-7b54df755-6ljtp                           1/1     Running   0          3h8m
gitlab-runner-5dc59b5b77-x2vw8                   1/1     Running   0          132m
kubernetes-agent-gitlab-agent-64bf6d87f4-vgxbx   1/1     Running   0          153m
(2)查看Harbor

登录Harbor仓库,进入demo项目,如图25所示:

25 devops

图25

可以看到镜像已构建并上传成功。

(3)验证服务

查看Service:

[root@master gitlab-ci]# kubectl -n gitlab-ci get svc
NAME        TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
demo-2048   NodePort   10.96.222.104   <none>        8080:8889/TCP   3m14s

访问Service,如图26所示:

26 devops

图26

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/439148.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…

基于拥堵模型的轻量级平台公交室内情况监控系统

论文标题&#xff1a;Bus Indoor Situation Monitoring System Based on Congestion Model Using Lightweight Platform 作者信息&#xff1a;Dong Hyun Kim, Yun Seob Kim, 和 Jong Deok Kim* 所属机构&#xff1a;Pusan National University, Department of Computer Scienc…

网页打不开、找不到服务器IP地址

现象&#xff1a;网络连接ok&#xff0c;软件能正常使用&#xff0c;当网页打不开。 原因&#xff1a;DNS 配置错误导致网站域名无法正确解析造成。 影响DNS设置的&#xff1a;VPN软件、浏览器DNS服务选择、IPv4属性被修改。 1、VPN代理未关闭 2、浏览器DNS解析选择 3、以太…

Python | 使用Seaborn绘制KDE核密度估计曲线

核密度估计&#xff08;KDE&#xff09;图&#xff0c;一种可视化技术&#xff0c;提供连续变量概率密度的详细视图。在本文中&#xff0c;我们将使用Iris Dataset和KDE Plot来可视化数据集。 什么是KDE图&#xff1f; KDE图&#xff0c;全称核密度估计图(Kernel Density Est…

【JAVA开源】基于Vue和SpringBoot的旅游管理系统

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

k8s的学习和使用

为什么用k8s&#xff0c;不用docker&#xff1f; k8s更适合复杂的微服务架构和大规模的容器应用。 Pods(Pod) Pod是k8s最小可部署单元&#xff0c;他包含一个或多个相关容器。这些容器共享网络命名空间和存储卷&#xff0c;他们通常协同工作来构成一个应用程序。 Serv…

微信小程序处理交易投诉管理,支持多小程序

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

哪款百元头戴式耳机性价比高?四款大火爆全网的机型盘点推荐!

在繁忙的生活节奏中&#xff0c;寻找一片属于自己的宁静空间&#xff0c;成为了许多人的内心渴望。头戴式降噪耳机&#xff0c;正是那把打开音乐世界的钥匙。它不仅能够隔绝外界的喧嚣&#xff0c;还能将您带入一个纯净无瑕的音乐世界。无论是沉浸在古典乐的悠扬旋律中&#xf…

66 使用注意力机制的seq2seq_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录动机加入注意力总结代码定义注意力解码器训练小结练习 我们来真的看一下实际应用中&#xff0c;key&#xff0c;value&#xff0c;query是什么东西&#xff0c;但是取决于应用场景不同&#xff0c;这三个东西会产生变化。先将放在seq2seq这个…

平面电磁波的电场能量磁场能量密度相等,能量密度的体积分等于能量,注意电场能量公式也没有复数形式(和坡印廷类似)

1、电场能量密度和磁场能量密度相等(实数场算的) 下面是电场能量密度和磁场能量密度的公式&#xff0c;注意这可不是坡印廷定理。且电场能量密度没有复数表达式&#xff0c;即不是把E和D换成复数形式就行的。注意&#xff0c;一个矢量可以转化为复数形式&#xff0c;两个矢量做…

深入计算机语言之C++:C到C++的过度

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、什么是C C&#xff08;c plus plus&#xff…

使用NumPy进行线性代数的快速指南

介绍 NumPy 是 Python 中用于数值计算的基础包。它提供了处理数组和矩阵的高效操作&#xff0c;这对于数据分析和科学计算至关重要。在本指南中&#xff0c;我们将探讨 NumPy 中可用的一些基本线性代数操作&#xff0c;展示如何通过运算符重载和内置函数执行这些操作。 元素级…

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

Linux 文件 IO 管理&#xff08;第四讲&#xff1a;软硬链接和动静态库&#xff09; 软硬链接操作与现象软链接硬链接 解释软链接硬链接作用 动静态库初识静态库怎么做库&#xff08;开发角度&#xff09;怎么用库&#xff08;使用角度&#xff09;安装当前目录直接使用 动态库…

打卡第一天 B2005 字符三角形

今天是我打卡第一天&#xff0c;就做个水题吧(#^.^#) 题目描述 给定一个字符&#xff0c;用它构造一个底边长 55 个字符&#xff0c;高 33 个字符的等腰字符三角形。 输入格式 输入只有一行&#xff0c;包含一个字符。 输出格式 该字符构成的等腰三角形&#xff0c;底边长…

全新一区PID搜索算法+TCN-LSTM+注意力机制!PSA-TCN-LSTM-Attention多变量时间序列预测(Matlab)

全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09; 目录 全新一区PID搜索算法TCN-LSTM注意力机制&#xff01;PSA-TCN-LSTM-Attention多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本…

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面

今日凌晨&#xff0c;ChatGPT重磅更新&#xff01;—— 我心目中的终极AGI界面 我心目中的终极 AGI 界面是一张空白画布&#xff08;canvas&#xff09;。 今日凌晨&#xff0c;OpenAI 发布 canvas&#xff0c;一个与 ChatGPT 合作写作和编程的新界面&#xff01; canvas&…

MySQL 启动失败 (code=exited, status=1/FAILURE) 异常解决方案

目录 前言1. 问题描述2. 查看错误日志文件2.1 确认日志文件路径2.2 查看日志文件内容 3. 定位问题3.1 问题分析 4. 解决问题4.1 注释掉错误配置4.2 重启 MySQL 服务 5. 总结结语 前言 在日常运维和开发过程中&#xff0c;MySQL数据库的稳定运行至关重要。然而&#xff0c;MySQ…

Leetcode—148. 排序链表【中等】

2024每日刷题&#xff08;171&#xff09; Leetcode—148. 排序链表 C实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo

森林火灾检测数据集 7400张 森林火灾 带标注 voc yolo 森林火灾检测数据集 名称 森林火灾检测数据集 (Forest Fire Detection Dataset) 规模 图像数量&#xff1a;共7780张图像。类别&#xff1a;仅包含一种类别——火源。 数据划分 训练集 (Train)&#xff1a;通常占总数据…