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模式,选择自定义)
填写完名字下一步即可
2.3.3 添加 master 节点
先搭建master,然后再添加worker,切记master不要勾选worker(如果资源是实在不够或者部署pod较少可勾选)
如图,勾选ETCD 和 Control Plane 不要勾选Worker 然后复制下面的注册命令,在Master 服务器上指向刚才复制的命令即可
当运行完成后,后台会自动去拉取k8s镜像以及初始化
2.3.4 添加worker(Node)节点
如图,只勾选Worker ,然后复制下面的命令在NODE节点服务器上执行
执行好后等集群初始化完成。时间会比较长,因为要拉取镜像。
都执行完毕后可以在 对应的服务器上执行 docker images
命令,查看到拉取了好多镜像
在Rancher里查看所有节点都active后,集群就搭建完成了,然后我们拷贝config文件到master机器。后续通过kubectl命令行工具操作集群和部署pod。
2.4 集群config文件拷贝:
点击cluster,然后点击kubeconfig File。
点击复制
然后去master机器创建文件 ~/.kube/config ,将复制的config内容写在~/.kube/config里面。 ~/为当前用户目录。 .kube是隐藏文件,执行ll -a查看或者ls -la查看。 在.kube文件里新建config文件,将上面复制的kubeconfig File信息粘贴到config里,然后保存退出。
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
然后执行kubectl get node -owide 查看集群node信息。
到此,我们的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私有仓库
- 将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]