wsl2+docker+gitlab+Jenkins+k8s CICD流程构建

安装wsl2

wsl --install
# wsl --install -d <DistroName> 指定发行版本

固定IP地址

在windows下创建一个bat文件

@echo off
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
wsl -d Ubuntu-20.04 -u root ip addr del $(ip addr show eth0 ^| grep 'inet\b' ^| awk '{print $2}' ^| head -n 1) dev eth0
wsl -d Ubuntu-20.04 -u root ip addr add 192.168.8.2/24 broadcast 192.168.8.255 dev eth0
wsl -d Ubuntu-20.04 -u root ip route add 0.0.0.0/0 via 192.168.8.1 dev eth0
powershell -c "Get-NetAdapter 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False; New-NetIPAddress -IPAddress 192.168.8.1 -PrefixLength 24 -InterfaceAlias 'vEthernet (WSL)'; Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False; New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix 192.168.8.0/24;"
exit

进入到wsl内 修改~/.bashrc 添加下面代码到最后

if [ `hostname -I` != 192.168.8.2 ]; then
     cmd.exe /c "刚刚创建的bat文件的位置" 1>nul
fi

修改DNS

  • 禁止自动生成 /etc/resolv.conf 添加一个文件 /etc/wsl.conf
# wsl.conf
[network]
generateResolvConf = false
  • 创建一个 /etc/resolv.conf
nameserver 192.168.8.1

配置system

执行命令

sudo apt-get update && apt install -yqq fontconfig daemonize

创建配置文件 00-wsl2-systemd.sh
位置:/etc/profile.d/

SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')

if [ -z "$SYSTEMD_PID" ]; then
   sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
   SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi

修改网络映射

# 删除当前所有映射
netsh interface portproxy reset

# 映射windows 192.168.66.157的80端口到WS2的ip的80端口:
netsh interface portproxy add v4tov4 listenaddress=192.168.66.157 listenport=80 connectaddress=192.168.8.2 connectport=80

# 设置Windows的防火墙,允许监听端口的对内连接
netsh advfirewall firewall add rule name="Open Port 80 for WSL2" dir=in action=allow protocol=TCP localport=80

# 显示当前所有映射关系
netsh interface portproxy show all

安装docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
#or 国内源
curl -sSL https://get.daocloud.io/docker | sh
# 查看版本
docker -v #Docker version 20.10.14, build a224086
#启动docker
systemctl start docker
#查看docker状态
systemctl status docker
image.png

安装docker-compose

下载需要docker-compose版本
地址 github.com/docker/compose/releases

# 下载
sudo curl -L https://github.com/docker/compose/releases/download/v2.3.4/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose

#创建软连接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

#添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 查看版本
docker-compose --version    # Docker Compose version v2.3.4

安装harbor

官网地址:https://github.com/goharbor/harbor/releases

image.png

这里我们选择在线安装

# 切换目录
cd /usr/local
# 下载文件
wget https://github.com/goharbor/harbor/releases/download/v2.4.2/harbor-online-installer-v2.4.2.tgz
# 解压文件
tar zxvf harbor-online-installer-v2.4.2.tgz
image.png
# 进入解压出来的文件的目录
cd harbor
image.png
# 复制一份配置文件
cp harbor.yml.tmpl harbor.yml
# 编辑配置文件
vi harbor.yml

修改hostname和harbor_admin_password,我这里将hostname改为ip地址


image.png
# 安装前准备工作
./prepare
# 配置/etc/docker/daemon.json
vi /etc/docker/daemon.json
# 内容
{
  "registry-mirrors": ["https://0nth4654.mirror.aliyuncs.com","http://ef017c13.m.daocloud.io"],
  "insecure-registries": ["192.168.8.2"]
}
# 重启docker
systemctl restart docker
# 安装horbar
./install.sh

安装完成 浏览器打开我们配置好的地址验证


image.png

新建一个项目


image.png

现在我们去拉一个镜像来上传到我们的仓库


image.png
#拉去镜像
docker pull alpine
#打上我们自己的tag
docker tag alpine:latest 192.168.8.2:80/test/alpine:latest
#登录我们自己的仓库
docker login ip:prot
#上传我们的镜像
docker push 192.168.8.2:80/test/alpine:latest

去仓库验证镜像是否上传成功


image.png

安装Jenkins

# 安装jdk
sudo apt install default-jdk
#创建文件夹
mkdir /var/jenkins_home
#修改文件夹权限
chmod 777  /var/jenkins_home
# 创建docker-compse 文件
vim /var/jenkins_home/docker-compose.yml
#内容
version: '3'
services:
  jenkins:
    image: 'jenkinsci/blueocean'
    container_name: jenkins
    restart: always
    ports:
      - '9000:8080'
      - '9001:50000'
    volumes:
      - '/var/jenkins_home:/var/jenkins_home'

# 安装jenkins
cd /var/jenkins_home
docker-compose up -d
# 查看初始密码
cat /var/jenkins_homesecrets/secrets/initialAdminPassword
# 修改源 换成国内的
vi vim hudson.model.UpdateCenter.xml
# 内容 替换成下面的url
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

登录网站 ip:prot
跟随指引安装完毕

k8s 安装

这里我们使用Kind 来创建k8s集群

# 下载安装 kubectl 二进制文件
curl -LO "[https://storage.googleapis.com/kubernetes-release/release/$](https://storage.googleapis.com/kubernetes-release/release/$)(curl -s [https://storage.googleapis.com/kubernetes-release/release/stable.txt](https://storage.googleapis.com/kubernetes-release/release/stable.txt))/bin/linux/amd64/kubectl"
# chmod 
chmod +x ./kubectl
mv kubectl /usr/local/bin/
#使用命令kubectl version --client确认是否安装成功。
kubectl version --client

# 下载 KinD 二进制文件
curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.8.1/kind-$(uname)-amd64
# 标记为可执行文件
chmod +x ./kind
# 移动到 PATH 目录下去
mv ./kind /usr/local/bin/


# 使用 kind 命令创建一个名为 xxx 的集群
kind create cluster --name xxx

# 检查节点
kubectl get nodes
# 获取所有 namespace 下面的资源对象
kubectl get all --all-namespaces

# 在集群中安装 Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml
# 获取 dashboard 的资源对象
kubectl get all -n kubernetes-dashboard
#创建一个临时的代理
kubectl get all -n kubernetes-dashboard

浏览器中我们可以通过如下地址来访问 Dashboard 服务:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

使用官方推荐的 RBAC 方式来创建一个 Token 进行登录,执行如下所示命令:
# 创建一个新的 ServiceAccount
kubectl apply -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF
# 将上面的 SA 绑定到系统的 cluster-admin 这个集群角色上
kubectl apply -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

#接下来我们可以通过上面创建的 ServiceAccount 来获取 Token 信息:
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
# 拷贝上面命令获取到的 Token 数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容