当前位置 : 主页 > 操作系统 > centos >

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境

来源:互联网 收集:自由互联 发布时间:2023-08-21
Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境 一.环境说明 机器名称 系统版本 IP地址 k8s版本 docker版本 k8s-rancher-205-10 ubuntu 22.04 192.168.205.10 1.25.2 20.10.18 k8s-master-205-11 ubuntu 22.04 192.168.20

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境

一.环境说明

机器名称

系统版本

IP地址

k8s版本

docker版本

k8s-rancher-205-10

ubuntu 22.04

192.168.205.10

1.25.2

20.10.18

k8s-master-205-11

ubuntu 22.04

192.168.205.11

1.25.2

20.10.18

k8s-worker01-205-12

ubuntu 22.04

192.168.205.12

1.25.2

20.10.18

k8s-worker02-205-13

ubuntu 22.04

192.168.205.13

1.25.2

20.10.18

备注说明: 1.这4个机器均是在vmware上的虚拟机,虚拟机的网络模式均为nat模式 2.虚拟机开机之后,需要执行命令:apt-get update && apt-get upgrade -y && apt install net-tools openssh-server -y 3.修改root用户密码,命令为:passwd root 4.修改ssh配置文件/etc/ssh/sshd_config中的“#PermitRootLogin prohibit-password”,修改为“PermitRootLogin yes”,然后执行命令systemctl restart ssh,使其能够使用root账户,进行ssh登录 5.使用命令sudo apt install docker.io -y安装docker

1 基础设置(所有节点均操作)

1.1 关闭防火墙

ufw disable

1.2 关闭swap

#临时关闭
swapoff -a
#永久关闭,这个需要重启生效
sed -i 's#\/swap.img#\#\/swap.img#g' /etc/fstab

1.3 修改hostname 、hosts文件增加域名通信

hostnamectl set-hostname k8s-rancher-205-10
hostnamectl set-hostname k8s-master-205-11
hostnamectl set-hostname k8s-worker01-205-12
hostnamectl set-hostname k8s-worker01-205-13

echo 192.168.205.10 k8s-rancher-205-10 >> /etc/hosts
echo 192.168.205.11  k8s-master-205-11 >> /etc/hosts
echo 192.168.205.12 k8s-worker01-205-12 >> /etc/hosts
echo 192.168.205.13 k8s-worker02-205-13 >> /etc/hosts

1.4 Docker 安装

#删除之前残留的docker
sudo apt-get remove docker docker-engine docker.io containerd runc

# step 1: 安装必要的一些系统工具

sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl gnupg lsb-core software-properties-common

# step 2: 安装GPG证书

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 写入软件源信息

sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4: 更新并安装Docker-CE

sudo apt-get -y update
#sudo apt-get -y install docker-ce=18.06.3~ce~3-0~ubuntu  #指定版本安装方式
sudo apt-get -y install docker-ce docker-ce-cli containerd.io

#配置阿里云镜像加速 这里的地址写自己的阿里云地址,并且设置docker默认cgroup为systemd  
#具体查看https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,下面列举出多个镜像源,一般只用第一个就可以
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "registry-mirrors": [
         "https://registry.cn-hangzhou.aliyuncs.com",
         "https://fz5yth0r.mirror.aliyuncs.com",
         "https://dockerhub.mirrors.nwafu.edu.cn/",
         "https://mirror.ccs.tencentyun.com",
         "https://docker.mirrors.ustc.edu.cn/",
         "https://reg-mirror.qiniu.com",
         "http://hub-mirror.c.163.com/",
         "https://registry.docker-cn.com"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
#########################################################################

二、Rancher安装(仅在Rancher节点操作)

2.1 设置Rancher部署目录

先创建Rancher映射目录(如果不想指定到其他目录,这步骤可以忽略)

#mkdir -p /data/rancher/rancher   #rancher 运行目录映射到了 /data/rancher/rancher 
#mkdir -p /data/rancher/auditlog   #日志映射到 /data/rancher/auditlog

2.2 安装启动Rancher(这里用RKE1的方式部署,通过Docker 直接部署)

RKE1必须应用以下 sysctl 设置

sysctl -w net.bridge.bridge-nf-call-ip6tables=1
sysctl -w net.bridge.bridge-nf-call-iptables=1
sysctl -w net.bridge.bridge-nf-call-arptables=1 
sysctl -w net.ipv4.ip_forward=1
sysctl -p
#如果有报错,先执行
modprobe br_netfilter
然后再执行上述命令

或者使用下列命令 设置

vim /etc/sysctl.conf

net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
sysctl -p
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

我这里将 运行目录制定到 /var/lib/rancher/ 日志指定到 /var/log/rancher/auditlog

sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 -v /var/lib/rancher:/var/lib/rancher -v  /var/log/rancher/auditlog:/var/log/auditlog rancher/rancher:stable

sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 -v /var/lib/rancher:/var/lib/rancher -v  /var/log/rancher/auditlog:/var/log/auditlog rancher/rancher:latest

sudo docker run --privileged -d --restart=unless-stopped -p 80:80 -p 443:443 -v /var/lib/rancher:/var/lib/rancher -v  /var/log/rancher/auditlog:/var/log/auditlog rancher/rancher:v2.6.8

2.3 Rancher相关设置

2.3.1 设置密码登陆

等rancher启动后,访问进入Rancher管理界面(初次登陆需要设置默认的密码,需要先读取一个TOCKEN,具体在登陆界面有操作提示以及命令)

2.3.2 创建集群

进入Rancher,先创建一个集群(创建节点使用RKE模式,选择自定义)

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_docker

填写完名字下一步即可

2.3.3 添加 master 节点

先搭建master,然后再添加worker,切记master不要勾选worker(如果资源是实在不够或者部署pod较少可勾选)

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_nginx_02

如图,勾选ETCD 和 Control Plane 不要勾选Worker 然后复制下面的注册命令,在Master 服务器上指向刚才复制的命令即可

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_ubuntu_03

当运行完成后,后台会自动去拉取k8s镜像以及初始化

2.3.4 添加worker(Node)节点

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_nginx_04

如图,只勾选Worker ,然后复制下面的命令在NODE节点服务器上执行

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_nginx_05

执行好后等集群初始化完成。时间会比较长,因为要拉取镜像

都执行完毕后可以在 对应的服务器上执行 docker images 命令,查看到拉取了好多镜像

在Rancher里查看所有节点都active后,集群就搭建完成了,然后我们拷贝config文件到master机器。后续通过kubectl命令行工具操作集群和部署pod。

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_docker_06

2.4 集群config文件拷贝:

点击cluster,然后点击kubeconfig File。

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_ubuntu_07

点击复制

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_nginx_08

然后去master机器创建文件 ~/.kube/config ,将复制的config内容写在~/.kube/config里面。 ~/为当前用户目录。 .kube是隐藏文件,执行ll -a查看或者ls -la查看。 在.kube文件里新建config文件,将上面复制的kubeconfig File信息粘贴到config里,然后保存退出。

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_ubuntu_09

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_ubuntu_10

2.5 Kubectl工具安装:

然后我们在master机器上安装kubectl工具:

sudo apt install kubectl=v1.24.4

或者

wget https://storage.googleapis.com/kubernetes-release/release/v1.24.4/bin/linux/amd64/kubectl

如果被墙了,可以从这下载: https://download.csdn.net/download/qq_25591191/17805854

将下载的kubectl 工具复制到/usr/bin/目录下

cp kubectl /usr/bin/

给kubectl添加执行权限

chmod +x /usr/bin/kubectl

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_docker_11

然后执行kubectl get node -owide 查看集群node信息。

Docker+Rancher + Harbor + GitLab + Jenkins 搭建CI/CD环境_docker_12

到此,我们的k8s集群就搭建完成了。

2.6、节点或者集群的删除

2.6.1 删除节点或者集群

登陆Rancher直接选中要删除的节点,后面的三个点,点开删除即可,同理集群操作也一样

2.6.2 Rancher中删除完毕后需要登陆各节点服务器进行下表面的操作,清理掉历史缓存文件

docker stop $(docker ps -a -q)
docker system prune -f
docker volume rm $(docker volume ls -q)
docker rm -f $(docker ps -a -q)

rm -rf /etc/ceph \
       /etc/cni \
       /etc/kubernetes \
       /opt/cni \
       /opt/rke \
       /run/secrets/kubernetes.io \
       /run/calico \
       /run/flannel \
       /var/lib/calico \
       /var/lib/etcd \
       /var/lib/cni \
       /var/lib/kubelet \
       /var/lib/rancher/rke/log \
       /var/log/containers \
       /var/log/pods

部分目录如果无法删除,先卸载挂载点
umount $(df -HT | grep '/var/lib/kubelet/pods' | awk '{print $7}')

2.7、常见异常处理

2.7.1 etcd证书异常

等待一段时间后页面一直提示etcd不健康

查询etcd日志

[root@master ~]# docker ps |grep etcd
88e02203bbc8   rancher/coreos-etcd:v3.4.15-rancher1   "/usr/local/bin/etcd…"   17 minutes ago   Up 17 minutes         etcd
[root@master ~]# docker logs -f -n 400 88e02203bbc8

日志显示如下错误

2021-07-16 16:57:36.412660 I | embed: rejected connection from "10.101.40.205:38284" (error "tls: failed to verify client's certificate: x509: certificate signed by unknown authority (possibly because of \"crypto/rsa: verification error\" while trying to verify candidate authority certificate \"kube-ca\")", ServerName "")

由于这里证书都是rancher自动生成的,经过查询怀疑是服务器时间差异过大问题导致证书验证失败 修改服务器时间(所有节点)

#根据真实时间设置

ntpdate time.aliyun.com
hwclock -w

然后根据第三节清理rancher集群重新部署

2.7.2 ingress服务异常

集群顺利部署完成后,发现ingress处于CrashLoopBackOff状态服务无法正常启动

[root@master ~]# kubectl get pods --all-namespaces                           
NAMESPACE       NAME                                      READY   STATUS             RESTARTS   AGE
cattle-system   cattle-cluster-agent-59c458d4cf-kttlx     1/1     Running            0          23m
cattle-system   cattle-node-agent-4plkx                   1/1     Running            0          23m
cattle-system   cattle-node-agent-ddxrd                   1/1     Running            0          20m
cattle-system   kube-api-auth-4mcw6                       1/1     Running            0          23m
ingress-nginx   default-http-backend-598b7d7dbd-p9475     1/1     Running            0          24m
ingress-nginx   nginx-ingress-controller-pbkjh            0/1     CrashLoopBackOff   6          6m42s
ingress-nginx   nginx-ingress-controller-z5l8n            0/1     CrashLoopBackOff   8          24m
kube-system     coredns-849545576b-gt86z                  1/1     Running            0          20m
kube-system     coredns-849545576b-pkgb4                  1/1     Running            0          24m
kube-system     coredns-autoscaler-5dcd676cbd-zsrrs       1/1     Running            0          24m
kube-system     kube-flannel-f7vpp                        2/2     Running            0          20m
kube-system     kube-flannel-z6vgp                        2/2     Running            0          25m
kube-system     metrics-server-697746ff48-q6s79           1/1     Running            0          24m
kube-system     rke-coredns-addon-deploy-job-vh24p        0/1     Completed          0          24m
kube-system     rke-ingress-controller-deploy-job-bkqnr   0/1     Completed          0          24m
kube-system     rke-metrics-addon-deploy-job-ts6hx        0/1     Completed          0          24m
kube-system     rke-network-plugin-deploy-job-v2ld4       0/1     Completed          0          26m
[root@master ~]#

查看ingress启动日志,其中可以看到关键信息 port 443 is already in use, 443端口被占用

[root@master ~]# kubectl logs nginx-ingress-controller-sx5d9  -n ingress-nginx          
-------------------------------------------------------------------------------

NGINX Ingress controller
  Release:       nginx-0.35.0-rancher2
  Build:         git-ba9a25e23
  Repository:    https://github.com/rancher/ingress-nginx.git
  nginx version: nginx/1.19.2

-------------------------------------------------------------------------------

I0717 09:42:39.553978       7 flags.go:205] Watching for Ingress class: nginx
W0717 09:42:39.554022       7 flags.go:210] Ingresses with an empty class will also be processed by this Ingress controllernginx
F0717 09:42:39.554259       7 main.go:68] port 443 is already in use. Please check the flag --https-port
goroutine 1 [running]:
k8s.io/klog/v2.stacks(0xc00000e001, 0xc0003f2000, 0x69, 0xa1)
        k8s.io/klog/v2@v2.1.0/klog.go:996 +0xb8
k8s.io/klog/v2.(*loggingT).output(0x2859d60, 0xc000000003, 0x0, 0x0, 0xc0003de9a0, 0x27b0aeb, 0x7, 0x44, 0xc00019e300)
        k8s.io/klog/v2@v2.1.0/klog.go:945 +0x19d
k8s.io/klog/v2.(*loggingT).printDepth(0x2859d60, 0x3, 0x0, 0x0, 0x1, 0xc00019bf28, 0x1, 0x1)
......

检查443端口占用情况

[root@node01 ~] yum install -y net-tools
[root@node01 ~]# netstat -ntlp |grep 443  
tcp        0      0 127.0.0.1:443           0.0.0.0:*               LISTEN      9852/sshd: root@pts 
tcp        0      0 0.0.0.0:6443            0.0.0.0:*               LISTEN      11818/nginx: master 
[root@node01 ~]#

可以看到443端口被进程号9852占用导致ingress无法启动,确认该进程无重大影响后干掉该进程,然后重启ingress服务即可

#干掉占用443端口的进程

kill -9 9852

#重启指定pod

kubectl delete pod nginx-ingress-controller-pbkjh -n ingress-nginx

三 、Harbor 安装

3.1 Harbor安装

通过在线安装包的形式,需要提前安装 docker-compose 如果没有执行 apt-get install -y docker-compose 命令安装

wget https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-online-installer-v2.6.0.tgz

解压到指定的安装目录(这里指向到 /usr/lib下)

tar -zxf /harbor-online-installer-v2.6.0 -C /data/

进入文件夹

cd /data/harbor

拷贝

cp harbor.yml.tmpl harbor.yml

修改harbor.yml中按需修改或添加如下内容

## 修改hostname
hostname: 192.168.204.32
#port
port: 18080
## 修改admin密码
harbor_admin_password: xxxxxxx
## 暂时关闭https
#https:
  # https port for harbor, default is 443
  #  port: 443
  # The path of cert and key files for nginx
  #  certificate: /your/certificate/path
  # private_key: /your/private/key/path
## 指定数据目录,若无则手动创建该目录
data_volume: /data/harbor

安装Harbor指向下面的命令,具体路径根据实际调整

bash /usr/local/harbor/install.sh

默认是用docker 方式安装的 harbor,装完可以使用 docker 命令查看是否启动

3.2 常见操作

1. 查看
cd /usr/local/harbor 
docker-compose ps

2. 基本命令
 启动Harbor容器
docker-compose start

# 停止Harbor容器
docker-compose stop 

# 重启Harbor容器
docker-compose restart 

# 停止并删除Harbor容器,加上-v参数可以同时移除挂载在容器上的目录
docker-compose down

# 创建并启动Harbo容器,参数“-d”表示后台运行命令
docker-compose up -d

3.3 管理地址

http://192.168.205.10:18080/

3.4 请求harbor客户端设置harbor为Docker私有仓库

  1. 将harbor设为docker的私有仓库,需要在请求habor的节点设置Docker参数
cd /etc/docker
vi daemon.json
{
 "insecure-registries":["192.168.205.10:18080"]
}

3.5 解决其他客户端上传镜像到 Harbor报错

出现这问题的原因 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜

像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。

解决:vim /usr/lib/systemd/system/docker.service

添加:--insecure-registry 192.168.205.10:18080

保存后

systemctl daemon-reload
systemctl restart docker
docker start $(docker ps -aq)

3.6 测试访问

登录:docker login -u admin -p tyharbor http://192.168.205.10:18080

Pull:docker pull SOURCE_IMAGE[:TAG]
Tag:docker tag SOURCE_IMAGE[:TAG] 192.168.205.10:18080/fms/REPOSITORY[:TAG]
Push:docker push 192.168.204.32:18001/fms/REPOSITORY:[:TAG]
上一篇:openGauss索引优化以及虚拟索引
下一篇:没有了
网友评论