[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

  • A+
所属分类:其他教程
摘要

DSC0000.png 下载附件 2021-12-15 16:08 上传DSC0001.png 下载附件 2021-12-15 16:08 上传DSC0002.png

K8s+Jenkins+GitLab-自动化部署项目
科技在进步,技术在更新,革命就不停止。

一、部署流程
开发人员把做好的项目代码通过git推送到gitlab,然后Jenkins通过 gitlab webhook (前提是配置好),自动从拉取gitlab上面拉取代码下来,然后进行build,编译、生成镜像、然后把镜像推送到Harbor仓库;然后在部署的时候通过k8s拉取Harbor上面的代码进行创建容器和服务,最终发布完成,然后可以用外网访问
部署流程如下:(大佬的图,大概这个过程)
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0000.png

2021-12-15 16:08 上传

环境准备:

IP 角色
172.25.0.30 master1、Jenkins
172.25.0.31 node1、Gitlab
172.25.0.32 node2、Harbor、Jenkins-slave

二、K8s 安装

1. 安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

²  一台或多台机器,操作系统 CentOS7.x-86_x64
²  硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多
²  可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
²  禁止swap分区

2. 准备环境

角色色 IP k8s版本
k8s-master 172.25.0.30 kubernetes1.21.0
k8s-node1 172.25.0.31 kubernetes1.21.0
k8s-node2 172.25.0.32 kubernetes1.21.0

# 关闭防火墙

systemctl stop firewalldsystemctl disable firewalld

# 关闭swap

swapoff -a  # 临时sed -ri 's/.*swap.*/#&/' /etc/fstab  # 永久

# 根据规划设置主机名

hostnamectl set-hostname <hostname>

# 在master添加hosts

hostnamectl set-hostname <hostname>

# 在master添加hosts

cat >> /etc/hosts << EOFEOF

# 将桥接的IPv4流量传递到iptables的链

cat > /etc/sysctl.d/k8s.conf << EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1vm.swappiness=0net.ipv4.ip_forward=1net.ipv4.tcp_tw_recycle=0EOF
sysctl --system  # 生效

# 时间同步

yum install ntpdate -yntpdate -u pool.ntp.org

添加定时

crontab  -l*/20 * * * * /sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1

3. 所有节点安装Docker/kubeadm/kubelet

Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。

3.1 安装Docker

#yum install -y yum-utils /       device-mapper-persistent-data /       lvm2
#yum-config-manager /  --add-repo /  https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
#yum install docker-ce -y
#cat > /etc/docker/daemon.json << EOF  {"registry-mirrors": ["https://h***3j.mirror.aliyuncs.com"]}EOF

3.2 添加阿里云YUM软件源

$ cat > /etc/yum.repos.d/kubernetes.repo << EOF[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgEOF

3.3 安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

$ yum install -y kubelet-1.21.0 kubeadm-1.21.0 kubectl-1.21.0$ systemctl enable kubelet

4. 部署Kubernetes Master
在172.25.0.30(Master)执行。

$ kubeadm init /  --apiserver-advertise-address=172.25.0.30 /  --image-repository registry.aliyuncs.com/google_containers /  --kubernetes-version v1.21.0 /  --service-cidr=10.96.0.0/12 /  --pod-network-cidr=10.244.0.0/16 --upload-certs

安装1.21版本时报错发现coredns,无法下载
手动拉取

docker  pull registry.aliyuncs.com/google_containers/coredns:1.8.0

重命名

docker  tag  registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

重新初始化

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

使用kubectl工具:

mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
$ kubectl get nodes

5. 加入Kubernetes Node

在172.25.0.31/32(Node)执行。

向集群添加新节点,执行在kubeadm init输出的kubeadm join命令:

$ kubeadm join 172.25.0.30:6443 --token amdbyn.a02my1ugmoblwy4q --discovery-token-ca-cert-hash sha256:18462463a7db86052399e97b18efe3f12edc5999293abdccf7529669df0ad3fa

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create --print-join-command

6. 部署CNI网络插件

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

默认镜像地址无法访问,sed命令修改为docker hub镜像仓库。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

查看k8spod状态

kubectl get pods -n kube-systemNAME              READY   STATUS  RESTARTS   AGEcoredns-545d6fc579-2cgr8    1/1   Running   0      72s

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0001.png

2021-12-15 16:08 上传

7. 测试kubernetes集群

在Kubernetes集群中创建一个pod,验证是否正常运行:

$ kubectl create deployment Nginx --image=nginx$ kubectl expose deployment nginx --port=80 --type=NodePort$ kubectl get pod,svc

访问地址:http://NodeIP:Port

三、部署gitlab
1、使用docker方式部署

docker run -d --hostname gitlab.xxx.cn /--publish 443:443 --publish 80:80 --publish 2222:22 /--name gitlab --restart always --volume /srv/gitlab/config:/etc/gitlab /--volume /srv/gitlab/logs:/var/log/gitlab /--volume /srv/gitlab/data:/var/opt/gitlab /gitlab/gitlab-ce:latest

2、配置gitlab
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb

vim  /srv/gitlab/config/gitlab.rb

# 配置http协议所使用的访问地址,不加端口号默认为80

external_url 'http://172.25.0.31'

# 配置ssh协议所使用的访问地址和端口

gitlab_rails['gitlab_ssh_host'] = '172.25.0.31'gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 此端口是run时22端口映射的2222端口

gitlab默认使用的内存越来越大,我们需要优化一下
减少数据库内存大小

sed -i 's/# puma['worker_processes'] = 2/puma['worker_processes'] = 2/g' /srv/gitlab/config/gitlab.rb

减少数据库并发数

sed -i 's/# postgreSQL['shared_buffers'] = "256MB"/postgresql['shared_buffers'] = "64MB"/g' /srv/gitlab/config/gitlab.rb
sed -i 's/# postgresql['max_worker_processes'] = 8/postgresql['max_worker_processes'] = 5/g' /srv/gitlab/config/gitlab.rb

配置sidekia并发数

sed -i 's/# sidekiq['max_concurrency'] = 50/sidekiq['max_concurrency'] = 10/g' /srv/gitlab/config/gitlab.rbsed -i 's/# sidekiq['min_concurrency'] = nil/sidekiq['min_concurrency'] = 5/g' /srv/gitlab/config/gitlab.rb

# 重启gitlab容器

$ docker restart gitlab

3、配置管理员passwd
默认管理员账号passwd:root 5iveL!fe,如果不过登陆,重新配置新passwd

1、进入容器

docker exec -it gitlab /bin/bash

启用gitlabruby

gitlab-rails console -e production

2、进入管理员用户

user = User.where(id: 1).first

3、更改password

user.password = 'abcd1234'user.password_confirmation = 'abcd1234'sxi

4、保存

user.save!

配置过程
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0002.png

2021-12-15 16:08 上传

4、访问gitlab
登陆,如下图所示:
账号:root  password:abcd1234
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0003.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0004.png

2021-12-15 16:08 上传

四、部署harbor镜像仓库
注意:额外的还需要 安装docker
1、docker-compose 安装
docker-compose安装

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose

赋予权限:

chmod a+x /usr/bin/docker-compose

2、Harbor配置、ssl证书生产
1、下载包,这里是v2.2.3:

wget https://github.com/goharbor/harbor/releases/download/v2.2.3/harbor-offline-installer-v2.2.3.tgz

其他版本 :https://github.com/goharbor/harbor/releases
2、解压harbor

tar -zxvf harbor-offline-installer-v2.2.3.tgz && mv harbor /usr/local/

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0005.png

2021-12-15 16:08 上传


3、配置并安装
准备配置文件:

cp harbor.yml.tmpl harbor.yml

配置harbor.yml

vim harbor.yml

配置域名

hostname: hub.sx.com #也可以是iphttp:  # port for http, default is 80. If https enabled, this port will redirect to https port  port: 80# https related confighttps:  # https port for harbor, default is 443  port: 443  # The path of cert and key files for nginx  certificate: /data/cert/server.crt  private_key: /data/cert/server.keyharbor_admin_password: harbor12345database:  # The password for the root user of Harbor DB. Change this before any production use.  password: root123 data_volume: /data/harbor #自定义路径

#创建目录

mkdir -p /data/{cert,harbor}

4、证书生成

mkdir -p /data/cert && cd /data/cert

生成ssl证书

openssl genrsa -des3 -out server.key 2048

输入两次相同的password即可:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0006.png

2021-12-15 16:08 上传

创建证书请求csr

openssl req -new -key server.key -out server.csr

按步骤 输入server.key password、国家如CN、省如BJ、城市如BJ、组织如sx、机构如:sx、hostname:hub.sx.com、邮箱123@qq.com。
备份ssl证书

cp server.key server.key.org

推出password,引导证书有password时,会有问题,需要解锁password

openssl rsa -in server.key.org -out server.key

证书请求签名

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

赋予权限

chmod a+x *

3、harbor安装
1、运行prepare文件

cd /usr/local/harbor./prepare

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0007.png

2021-12-15 16:08 上传

2、执行脚本安装

./install.sh

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0008.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC0009.png

2021-12-15 16:08 上传

4、登录访问
1、页面登录
域名绑定hosts
https://hub.**.com (hub.**.com为自己的机名harbor.yamlhostname) 。
管理员用户名/password为 admin / harbor12345
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00010.png

2021-12-15 16:08 上传

登录后如下:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00011.png

2021-12-15 16:08 上传

创建项目
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00012.png

2021-12-15 16:08 上传

项目ops主要是用来存放的jenkins镜像和jenkins-slave镜像;projectdemo主要存放部署项目的镜像,供k8s拉取。
如果你运行正常,查看容器会如下:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00013.png

2021-12-15 16:08 上传

2、docker登录
所以节点配置hosts

echo 172.25.0.32 hub.sx.com >> /etc/hosts

dokcer登录

docker login https://hub.sx.com

账号password:admin / harbor12345
从官方文档提示,客户端要使用tls与Harbor通信,使用的还是自签证书,那么必须建立一个目录:/etc/docker/certs.d
在这个目录下建立签名的域名的目录,比如域名为hub.sx.com, 那么整个目录为: /etc/docker/certs.d/hub.sx.com, 然后把harbor的证书拷贝到这个目录即可。
创建目录

mkdir -p /etc/docker/certs.d/hub.sx.com

复制证书到域名目录下

rsync -avz root@172.25.0.32:/data/cert/server.crt   /etc/docker/certs.d/hub.sx.com/

登录测试
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00014.png

2021-12-15 16:08 上传

五、部署Jenkins-slave分布式环境

Jenkins的Master-Slave分布式架构主要是为了解决Jenkins单点构建任务多、负载较高、性能不足的场景。Master-Slave相当于Server和Agent的概念。Master提供web接口让用户来管理job和Slave,job可以运行在Master本机或者被分配到Slave上运行构建。一个Master(Jenkins服务所在机器)可以关联多个Slave用来为不同的job或相同的job的不同配置来
这里可以直接使用我个人的slave镜像
xiaozhagn/jenkins-slave

一、Master-Slave文件下载:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00015.png

2021-12-15 16:08 上传

链接: https://pan.baidu.com/s/1Hu5iul1BYZNe7fWTBBn49A  password: sg9d

二、制作镜像
构建镜像

cd jenkins-docker
docker build -t jenkins-slave:latest .

构建成功
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00016.png

2021-12-15 16:08 上传

三、推送镜像到harbor
打标签

docker tag jenkins-slave  hub.sx.com/ops/jenkins-slave

开始推送:

docker push  hub.sx.com/ops/jenkins-slave

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00017.png

2021-12-15 16:08 上传

到了这里镜像推送已经完毕。

六、k8s部署Jenkins
1、创建nfs
master上操作:

yum install nfs-utils -ymkdir -p /data/nfs/jenkins
vim /etc/exports/data/nfs/jenkins 172.25.0.30/24(sync,rw,no_root_squash)
systemctl restart nfs rpcbindsystemctl enable nfs rpcbind

其他节点操作:

yum install nfs-utils -ysystemctl start nfs && systemctl enable nfs
showmount -e 172.25.0.30

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00018.png

2021-12-15 16:08 上传

2、yaml部署jenkins
1、创建namespace,用于安装jenkins

kubectl create namespace jenkins

查看已经创建的namespace

kubectl get namespace

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00019.png

2021-12-15 16:08 上传

2、创建 PV & PVC

vim jenkins-storage.yaml
apiVersion: v1kind: PersistentVolumemetadata:  name: jenkins  labels:  app: jenkinsspec:  capacity:        storage: 20Gi  accessModes:       - ReadWriteMany  persistentVolumeReclaimPolicy: Retain  mountOptions:     #NFS挂载选项  - hard  - nfsvers=4.1    nfs:          #NFS设置  path: /data/nfs/jenkins   # 根据上一步的地址来定  server: 172.25.0.30   # 根据nfs server ip实际来设置---kind: PersistentVolumeClaimapiVersion: v1metadata:  name: jenkins  namespace: jenkins spec:  accessModes:  - ReadWriteMany  resources:  requests:    storage: 20Gi   #存储空间大小  selector:  matchLabels:    app: jenkins

#创建
-n:指定 namespace
Yaml文件指定了namespce 运行时可以不指定namespce

kubectl apply -f jenkins-storage.yaml -n jenkins

查看pv 、pvc

kubectl get pvkubectl get pvc -n jenkins

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00020.png

2021-12-15 16:08 上传

3、创建 ServiceAccount & ClusterRoleBinding
Kubernetes 集群一般情况下都默认开启了 RBAC 权限,所以需要创建一个角色和服务账户,设置角色拥有一定权限,然后将角色与 ServiceAccount 绑定,最后将 ServiceAccount 与 Jenkins 绑定,这样来赋予 Jenkins 一定的权限,使其能够执行一些需要权限才能进行的操作。
这里为了方便,将 cluster-admin 绑定到 ServiceAccount 来保证 Jenkins 拥有足够的权限。

vim jenkins-rbac.yaml
apiVersion: v1kind: ServiceAccountmetadata:  name: jenkins-admin     #ServiceAccount用户名称,(注意不要改)  namespace: jenkins   #指定namespace,一定要修改成你自己的namespace  labels:  name: jenkins---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: jenkins-adminnamespace: jenkins  labels:  name: jenkinssubjects:  - kind: ServiceAccount  name: jenkins-admin  namespace: jenkins  #这里的表示在jenkins空间授予cluster-admin的权限roleRef:  kind: ClusterRole  name: cluster-admin  apiGroup: rbac.authorization.k8s.io

#创建 RBAC
创建时记得指定namespace

kubectl apply -f jenkins-rbac.yaml -n jenkins

4、创建 Service & Deployment
这里开始部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 8080 与 50000。而Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。
创建部署的yaml,对外暴露的端口是32000

vim jenkins-deployment.yaml
apiVersion: v1kind: Servicemetadata:  name: jenkinsnamespace: jenkins  labels:  app: jenkinsspec:  type: NodePort  ports:  - name: http  port: 8080            #服务端口  targetPort: 8080  nodePort: 32000         #NodePort方式暴露 Jenkins 端口  - name: jnlp  port: 50000           #代理端口  targetPort: 50000  nodePort: 32001  selector:  app: jenkins---apiVersion: apps/v1kind: Deploymentmetadata:  name: jenkins  namespace: jenkins  labels:  app: jenkinsspec:  selector:  matchLabels:    app: jenkins  replicas: 1  template:  metadata:    labels:    app: jenkins  spec:    nodeName: k8s-master  #是在运行在K8s-master上    serviceAccountName: jenkins-admin    containers:    - name: jenkins    image: jenkins/jenkins:lts    securityContext:                runAsUser: 0      #设置以ROOT用户运行容器      privileged: true          #拥有特权    ports:    - name: http      containerPort: 8080    - name: jnlp      containerPort: 50000    resources:      limits:      memory: 2Gi      cpu: "1000m"      requests:      memory: 512Mi      cpu: "500m"    env:    - name: LIMITS_MEMORY      valueFrom:      resourceFieldRef:        resource: limits.memory        divisor: 1Mi    - name: "java_OPTS"         #设置变量,指定时区和 jenkins slave 执行者设置      value: "          -Xmx$(LIMITS_MEMORY)m          -XshowSettings:vm          -Dhudson.slaves.NodeProvisioner.initialDelay=0           -Dhudson.slaves.NodeProvisioner.MARGIN=50           -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85           -Duser.timezone=Asia/Shanghai         "       - name: "JENKINS_OPTS"      value: "--prefix=/jenkins"     #设置路径前缀加上 Jenkins    volumeMounts:            #设置要挂在的目录    - name: data      mountPath: /var/jenkins_home    volumes:    - name: data    persistentVolumeClaim:      claimName: jenkins         #设置PVC

参数说明:

²  JAVA_OPTS JVM 参数设置
²  JENKINS_OPTS Jenkins 参数设置
²  其它参数: 默认情况下,Jenkins 生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins 确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以在 Jenkins 启动时候添加这些参数:
-Dhudson.slaves.NodeProvisioner.initialDelay=0
-Dhudson.slaves.NodeProvisioner.MARGIN=50
-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85
有了上面的部署文件后,再将 Jenkins 部署到 Kuberntes 中:
-n:指定应用启动的 namespace

部署

kubectl apply -f jenkins-deployment.yaml -n jenkins

部署发现pod一直为Pending

kubectl describe pod  $(kubectl get pods -n jenkins | awk '{print $1}' | grep jenkins) -n  jenkins

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00021.png

2021-12-15 16:08 上传

发现以下错误:
错误一:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00022.png

2021-12-15 16:08 上传

处理办法:
添加指定运行在node

nodeName: k8s-master

错误二:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00023.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00024.png

2021-12-15 16:08 上传

这个是我们的设置的资源过高导致,调整jenkins的资源大小设置

resources:      limits:      memory: 1Gi      cpu: "1000m"      requests:      memory: 512Mi      cpu: "500m"

5、配置私有仓库的镜像下载与访问
对私有仓库的镜像下载与访问
node1上操作(之前登陆过harbor仓库的节点)

docker login hub.sx.com

#查看登陆凭据

# cat .docker/config.json |base64 -w 0ewoJImF1dGhzIjogewoJCSJodWIuc3guY29tIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NmFHRnlZbTl5TVRJek5EVT0iCgkJfQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkiVXNlci1BZ2VudCI6ICJEb2NrZXItQ2xpZW50LzE5LjAzLjggKGxpbnV4KSIKCX0KfQ==

在Master上操作
#创建secret资源

vim registry-pull-secret.yaml
apiVersion: v1kind: Secretmetadata:  name: registry-pull-secret  namespace: jenkinsdata:  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJodWIuc3guY29tIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NmFHRnlZbTl5TVRJek5EVT0iCgkJfQoJfSwKCSJIdHRwSGVhZGVycyI6IHsKCQkiVXNlci1BZ2VudCI6ICJEb2NrZXItQ2xpZW50LzE5LjAzLjggKGxpbnV4KSIKCX0KfQ==type: kubernetes.io/dockerconfigjson
kubectl apply -f registry-pull-secret.yaml -n jenkins

#查看secret资源

kubectl get secret

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00025.png

2021-12-15 16:08 上传



3、获取 Jenkins 生成的 Token
在安装 Jenkins 时候,它默认生成一段随机字符串,用于安装验证。这里访问它的安装日志,获取它生成的 Token 字符串。
(1)、查看 Jenkins Pod 启动日志
注意:这里“-n”指的是要 namespace,后面跟的 namespace 请替换成你jenkins 启动的 namespace

kubectl logs $(kubectl get pods -n jenkins | awk '{print $1}' | grep jenkins) -n  jenkins

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00026.png

2021-12-15 16:08 上传

(2)、查看日志中生成的 Token 字符串
查看日志,默认给的token为:

bf0c6fcb10b845239a06ff9362a6843c

4、访问Jenkins
访问:集群ip+ Nodeport
​​http://172.25.0.30:32000/jenkins/​​
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00027.png

2021-12-15 16:08 上传

按提示输入token
配置管理员password:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00028.png

2021-12-15 16:08 上传

账号:admin password:admin
下一步,使用admin账号
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00029.png

2021-12-15 16:08 上传

保存完成
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00030.png

2021-12-15 16:08 上传

到这里已经进入jenkins
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00031.png

2021-12-15 16:08 上传

七、Jenkins、gitlab配置
一、安装k8s的相关插件
1、jenkins 设置中文显示
Plugin Manager,搜索 Localization: Chinese (Simplified),然后点击Install without restart
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00032.png

2021-12-15 16:08 上传

安装后如下:
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00033.png

2021-12-15 16:08 上传

2、安装项目插件
安装Kubernetes Continuous Deploy、Kubernetes、Gitlab Hook 、GitLab、Build Authorization Token、Pipeline: Stage Step、Pipeline: Basic Steps、Pipeline的插件

1、页面安装插件
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00034.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00035.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00036.png

2021-12-15 16:08 上传

2、手动上传安装

Gitlab 、gitlab hook安装不成功,手动安装
下载地址
​​https://updates.jenkins-ci.org/download/plugins/​​
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00037.png

2021-12-15 16:08 上传

Gitlab-hook Gitlab、下载最新的
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00038.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00039.png

2021-12-15 16:08 上传

浏览器下载地址
​​gitlab-hook.hpi​​
​​gitlab-plugin.hpi​​

进入jenkins的系统设置->插件管理->高级->上传插件,把下载到本地文件的插件上传到jenkins的服务器进行安装
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00040.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00041.png

2021-12-15 16:08 上传

上传文件安装
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00042.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00043.png

2021-12-15 16:08 上传

重启jenkins的容器

docker  restart (k8s_jenkins_jenkins容器)

二、构建项目
新建一个流水线
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00044.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00045.png

2021-12-15 16:08 上传

三、设置jenkins挂钩k8s的环境

“系统管理” -->“系统配置置”。找到cloud ,点击“separate configuration page.”,点击“新增一个云”,选择k8s,如果这边没有出现k8s,则代表你的插件没有安装成功,需要重新安装。
1、创建kubernets云
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00046.png

2021-12-15 16:08 上传

2、配置kubernets云
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00047.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00048.png

2021-12-15 16:08 上传

然后配置一下里面的内容,配置这Kubernetes 地址、空间名、Jenkins 地址两个地方。针对URL,可以采用kube-dns来做服务发现,(kube-dns默认已经安装),不需要实际的ip地址进行输入。不过还得配置一下SSH密钥。

  • ²  Kubernetes 地址:https://kubernetes.default 或者 k8s的地址https://172.25.0.30:6443
  • ²  空间名:jenkins (自己创建的空间名)
  • ²  Jenkins 地址:http://jenkins.jenkins.svc.cluster.local:8080

这里的格式为:服务名.namespace.svc.cluster.local:8080 或者你的jenkins IP地址 http://172.25.0.30:32000/
注意:这里的jenkins的地址,可以把开始配置Jenkins“实例配置”复制进去
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00049.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00050.png

2021-12-15 16:08 上传

我这里的镜像,它的访问地址是ip:port/jenkins
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00051.png

2021-12-15 16:08 上传

配置完毕后,测试链接k8s集群
结果Connected to Kubernetes v1.21.0
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00052.png

2021-12-15 16:08 上传

如果出现:
Error testing connection https://172.25.0.30:6443: java.io.FileNotFoundException: /root/.kube/config (No such file or directory)

那么你创建jenkins的认证的,并不是jenkins-admin
四、jenkins添加凭证
需要添加了两个凭证,一个是ssh,和k8s的凭证。这个可自行添加一下即可。这里要注意一下:凭证生成后,进入凭证里面会有一个自动生成的ID,此ID需要在asp.net core项目中的Jenkinsfile里面配置。

Dashboard-->系统管理-->Manage Credentials-->全局-->添加凭据
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00053.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00054.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00055.png

2021-12-15 16:08 上传

root中的密钥时私钥id_rsa,把对应公钥id_rsa.pub配置到gitlab上
查看本地的私钥,没有手动生成
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00056.png

2021-12-15 16:08 上传

1、添加私钥认证
注意:id会自动生成
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00057.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00058.png

2021-12-15 16:08 上传

2、添加k8s认证
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00059.png

2021-12-15 16:08 上传

查看配置好的凭据
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00060.png

2021-12-15 16:08 上传

五、gitlab添加凭证
创建一个项目demo
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00061.png

2021-12-15 16:08 上传

添加ssh key
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00062.png

2021-12-15 16:08 上传

查看jenkins的公钥
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00063.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00064.png

2021-12-15 16:08 上传

Gitlab添加公钥
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00065.png

2021-12-15 16:08 上传

八、jenkins+gitlab挂钩

jenkins配置任务里面的内容并且与gitlab挂钩
进入项目
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00066.png

2021-12-15 16:08 上传

1、test项目配置。
配置触发器
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00067.png

2021-12-15 16:08 上传

点击高级
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00068.png

2021-12-15 16:08 上传

生成token
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00069.png

2021-12-15 16:08 上传

流水线配置
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00070.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00071.png

2021-12-15 16:08 上传

当然deploy的目录必须存在你的代码根目录下

配完毕保存

2、配置gitlab
我的gitlab的最新的,界面配置不一样,所以我直接配置webooks
进入我demo项目
创建webhooks
Setting-->webhooks
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00072.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00073.png

2021-12-15 16:08 上传

添加URL、Secret token
哪里找,他们都在jenkins的test项目可以看到

URl:http://172.25.0.30:32000/jenkins/project/testSecret token:c07ebaae20ced8e74c8c0d93890708b0

3、配置添加webhook报错处理
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00074.png

2021-12-15 16:08 上传

处理

进入Menu-->Admin-->setting-->network--> Outbound requests
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00075.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00076.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00077.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00078.png

2021-12-15 16:08 上传

重新添加
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00079.png

2021-12-15 16:08 上传

测试是否成功
点击test-->Push events
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00080.png

2021-12-15 16:08 上传

九、部署代码

1、拉去测试代码,修改并推送到demo
测试项目地址
​​https://github.com/xiaozhagn/jenkinsfiles.git​​
注:Jenkinsfile里面这两个地方需要配置为你们在Jenkins里面创建的两个授权的ID,ID内容可以进入到凭证里面看。我这里使用sh代替 kubernetsconfig
拉去到代码到本地,deploy目录下

修改Jenkinsfile
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00081.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00082.png

2021-12-15 16:08 上传

deploy.yaml修改镜像地址(我这里是域名,如果jenkins访问不了,需要配置hosts)
查看deploy.yaml
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00083.png

2021-12-15 16:08 上传

推送到gitlab
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00084.png

2021-12-15 16:08 上传

2、查看jenkins任务是否已经触发并构建成功

可以发现都已经成功了
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00085.png

2021-12-15 16:08 上传

查看输入日志
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00086.png

2021-12-15 16:08 上传

查看pod是否已经起来了
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00087.png

2021-12-15 16:08 上传

3、访问测试
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00088.png

2021-12-15 16:08 上传

页面访问
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00089.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00090.png

2021-12-15 16:08 上传

到这里整个构建过程就完成了

十、jenkins报错以及处理

1、报错一:

Failed to connect to http://jenkins.jenkins.svc.cluster.local:8080/jenkins/tcpSlaveAgentListener/: jenkins.jenkins.svc.cluster.local
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00091.png

2021-12-15 16:08 上传

这里是kubernetss、cdns解析失败导致,重新构建flannel cni网络

kubectl delete -f kube-flannel.ymlkubectl create -f kube-flannel.yml

继续报错
直接删除cdns pod

kubectl get pods -n kube-system -oname |grep coredns |xargs kubectl delete -n kube-system

编辑coredns部署yaml文件

kubectl edit deploy  coredns -n kube-system

image: registry.aliyuncs.com/google_containers/coredns/coredns:v1.8.0

改为

image: registry.aliyuncs.com/google_containers/coredns:1.8.0

wq保存退出

2、报错二:
Illegal tunneling parameter: ​​http://jenkins.jenkins.svc.cluster.local:50000​​​​
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00092.png

2021-12-15 16:08 上传

解决办法:这个是配置Jenkins 通道导致的,说这个选择配置为空就好
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00093.png

2021-12-15 16:08 上传

3、报错三:
with name:[null] in namespace:[kube-ops] failed.
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00094.png

2021-12-15 16:08 上传

解决办法:这个需要看一下的rbac时是否给对应的account账号对应的namespace权限

4、报错四:
ERROR:ERROR:java.lang.RuntimeException:io.kubernetes.client.openapi.ApiException: Bad Request
Caused by: hudson.remoting.ProxyException: io.kubernetes.client.openapi.ApiException: Bad Request
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00095.png

2021-12-15 16:08 上传

[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00096.png

2021-12-15 16:08 上传

解决办法:
这个错误是通过config凭据无法调用kubernetes API接口,导致Bad request,所以在动态slave 里面挂在kubectl 与config文件,在pipfile文件里面,我们直接通过执行shell,来调用k8s创建pod。
各位客官,编写实在不易,点个赞再走呗
完~
[Linux] K8s+Jenkins+GitLab-自动化部署项目(详细讲解)

DSC00097.jpg

2021-12-15 16:08 上传


关注公众号,了解更多

关注下面的标签,发现更多相似文章
  • Jenkins
  • GitLab-
  • 部署
  • 自动化
  • K8s
  • 技术

  • 我的微信公众号
  • 扫一扫关注
  • weinxin
  • 我的新浪微博号
  • 扫一扫关注
  • weinxin
小辉博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: