闲聊 考虑了很久,打算写一篇保姆级部署从0-1构建企业级cicd流水线,把工作上面所用到的技术点分享给大家。从最k8s,harbor,jenkins,gitlab,docker的详细部署到集成。前后端流水线的构建,发布等…如果以下内容有不足的地方,请指出,我会第一时间更正。谢谢大家。
先上一下手绘导图,大致的流程图如下: 大致的部署流程是这样的:开发人员把做好的asp.net core项目代码通过git推送到gitlab,然后Jenkins通过 gitlab webhook (前提是配置好),自动从拉取gitlab上面拉取代码下来,然后进行build,编译、生成镜像、然后把镜像推送到Harbor仓库;然后在部署的时候通过k8s拉取Harbor上面的代码进行创建容器和服务,最终发布完成,然后可以用外网访问。
当然啦,上面只是粗略的,请看下图才更加形象。
一、前言 K8s 集群部署有多种方式,kubeadm 是 K8s 官方提供的集群部署工具,这种方法最为常用,简单快速,适合初学者。本文就使用 kubeadm 搭建集群演示。
二、主机准备 本次我们搭建一套 3 个节点的 K8s 集群,操作系统使用Ubuntu 22.04.4 LTS,配置2核4G,ip规划如下
主机名
ip地址
主机配置
master231
10.0.0.231
2核,4GiB,系统盘 20GiB
worker232
10.0.0.232
2核,4GiB,系统盘 20GiB
worker233
10.0.0.233
2核,4GiB,系统盘 20GiB
三、系统配置 关闭swap分区 1 2 swapoff -a && sysctl -w vm.swappiness=0 sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
确保各个节点MAC地址或product_uuid唯一 1 2 3 4 5 6 ifconfig ens33 | grep ether | awk '{print $2}' cat /sys/class/dmi/id/product_uuid 温馨提示: 一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装失败。
检查网络节点是否互通 1 2 3 简而言之,就是检查你的k8s集群各节点是否互通,可以使用ping命令来测试。 ping www.baidu.com -c 10 ping master231 -c 10
允许iptable检查桥接流量 1 2 3 cat <<EOF | tee /etc/modules-load.d/k8s.conf br_netfilter EOF
1 2 3 4 5 6 7 cat <<EOF | 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 sysctl --system
修改cgroup的管理进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 所有节点修改cgroup的管理进程为systemd==乌班图默认不用修改 [root@master231 ~]# docker info | grep "Cgroup Driver:" Cgroup Driver: systemd [root@master231 ~]# [root@worker232 ~]# docker info | grep "Cgroup Driver:" Cgroup Driver: systemd [root@worker232 ~]# [root@worker233 ~]# docker info | grep "Cgroup Driver:" Cgroup Driver: systemd [root@worker233 ~]# 温馨提示: 如果不修改cgroup的管理驱动为systemd,则默认值为cgroupfs,在初始化master节点时会失败
四、安装k8s管理工具 kubeadm:用来初始化K8S集群的工具。 kubelet:在集群中的每个节点上用来启动Pod和容器等。 kubectl:用来与K8S集群通信的命令行工具。
所有节点操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1.K8S所有节点配置软件源 apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF 2.获取最新软件包信息 apt-get update 3.查看一下当前环境支持的k8s版本 [root@master231 ~]# apt-cache madison kubeadm kubeadm | 1.28.2-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.28.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages kubeadm | 1.28.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages 4.安装 kubelet kubeadm kubectl apt-get -y install kubelet=1.23.17-00 kubeadm=1.23.17-00 kubectl=1.23.17-00 5.所有节点都要检查各组件版本 kubeadm version kubectl version kubelet --version
安装docker 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 1.编写docker安装脚本 [root@master231 docker]# cat install-docker.sh . /etc/os-release DOCKER_VERSION=20.10.24 DOCKER_COMPOSE_VERSION=2.23.0 FILENAME=docker-${DOCKER_VERSION} .tgz DOCKER_COMPOSE_FILE=docker-compose-v${DOCKER_COMPOSE_VERSION} URL=https://download.docker.com/linux/static/stable/x86_64 DOCKER_COMPOSE_URL=https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION} /docker-compose-linux-x86_64 DOWNLOAD=./download BASE_DIR=/softwares OS_VERSION=$ID function prepare (){ if [ ! -f ${DOWNLOAD} /${DOCKER_COMPOSE_FILE} ]; then wget -T 3 -t 2 ${DOCKER_COMPOSE_URL} -O ${DOWNLOAD} /${DOCKER_COMPOSE_FILE} fi if [ $? != 0 ];then rm -f ${DOWNLOAD} /${DOCKER_COMPOSE_FILE} echo "不好意思,由于网络波动原因,无法下载${DOCKER_COMPOSE_URL} 软件包,程序已退出!请稍后再试......" exit 100 fi chmod +x ${DOWNLOAD} /${DOCKER_COMPOSE_FILE} }function InstallDocker (){ if [ $OS_VERSION == "centos" ];then [ -f /usr/bin/wget ] || yum -y install wget rpm -qa |grep bash-completion || yum -y install bash-completion fi if [ $OS_VERSION == "ubuntu" ];then [ -f /usr/bin/wget ] || apt -y install wget fi if [ ! -f ${DOWNLOAD} /${FILENAME} ]; then wget ${URL} /${FILENAME} -O ${DOWNLOAD} /${FILENAME} fi if [ ! -d ${BASE_DIR} ]; then install -d ${BASE_DIR} fi tar xf ${DOWNLOAD} /${FILENAME} -C ${BASE_DIR} prepare cp $DOWNLOAD /${DOCKER_COMPOSE_FILE} ${BASE_DIR} /docker/docker-compose ln -svf ${BASE_DIR} /docker/* /usr/bin/ cp $DOWNLOAD /docker /usr/share/bash-completion/completions/docker source /usr/share/bash-completion/completions/docker install -d /etc/docker cp $DOWNLOAD /daemon.json /etc/docker/daemon.json cp download/docker.service /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl enable --now docker docker version docker-compose version tput setaf 3 echo "安装成功,欢迎使用cherry二进制docker安装脚本,欢迎下次使用!" tput setaf 2 }function UninstallDocker (){ systemctl disable --now docker rm -f /usr/lib/systemd/system/docker.service rm -rf ${BASE_DIR} /docker rm -rf /var/lib/{docker,containerd} rm -f /usr/bin/{containerd,containerd-shim,containerd-shim-runc-v2,ctr,docker,dockerd,docker-init,docker-proxy,runc} tput setaf 5 echo "卸载成功,欢迎再次使用cherry二进制docker安装脚本哟~" tput setaf 7 }function main (){ case $1 in install|i) InstallDocker ;; remove|r) UninstallDocker ;; *) echo "Invalid parameter, Usage: $0 install|remove" ;; esac } main $1 [root@master231 docker]# ll total 16 drwxr-xr-x 3 root root 4096 Dec 10 05:49 ./ drwx------ 6 root root 4096 Dec 10 05:49 ../ drwxr-xr-x 2 root root 4096 May 9 2024 download/ -rwxr-xr-x 1 root root 3497 Dec 10 05:49 install-docker.sh* 2.安装docker [root@master231 docker]# ./install-docker.sh install'/usr/bin/containerd' -> '/softwares/docker/containerd' '/usr/bin/containerd-shim' -> '/softwares/docker/containerd-shim' '/usr/bin/containerd-shim-runc-v2' -> '/softwares/docker/containerd-shim-runc-v2' '/usr/bin/ctr' -> '/softwares/docker/ctr' '/usr/bin/docker' -> '/softwares/docker/docker' '/usr/bin/docker-compose' -> '/softwares/docker/docker-compose' '/usr/bin/dockerd' -> '/softwares/docker/dockerd' '/usr/bin/docker-init' -> '/softwares/docker/docker-init' '/usr/bin/docker-proxy' -> '/softwares/docker/docker-proxy' '/usr/bin/runc' -> '/softwares/docker/runc' Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service. Client: Version: 20.10.24 API version: 1.41 Go version: go1.19.7 Git commit: 297e128 Built: Tue Apr 4 18:17:06 2023 OS/Arch: linux/amd64 Context: default Experimental: true Server: Docker Engine - Community Engine: Version: 20.10.24 API version: 1.41 (minimum version 1.12) Go version: go1.19.7 Git commit: 5d6db84 Built: Tue Apr 4 18:23:02 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.6.20 GitCommit: 2806fc1057397dbaeefbea0e4e17bddfbd388f38 runc: Version: 1.1.5 GitCommit: v1.1.5-0-gf19387a6 docker-init: Version: 0.19.0 GitCommit: de40ad0 Docker Compose version v2.23.0 安装成功,欢迎使用cherry二进制docker安装脚本,欢迎下次使用!
初始化master组件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1.导入镜像 [root@master231 ~]# docker load -i master-1.23.17.tar.gz 2.使用kubeadm初始化master节点 [root@master231 ~]# kubeadm init --kubernetes-version=v1.23.17 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.100.0.0/16 --service-cidr=10.200.0.0/16 --service-dns-domain=cherry.com kubeadm join 10.0.0.231:6443 --token lzphw7.kc4iu4k0mswnpy7h \ --discovery-token-ca-cert-hash sha256:298393d4dc931d6d13ec2ec1aedd4295bcd143a84e78dfc5a82ec7e53210d511 -------------------------------------------------- 3.拷贝授权文件,用于管理K8S集群 [root@master231 ~]# mkdir -p $HOME /.kube [root@master231 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config [root@master231 ~]# sudo chown $(id -u):$(id -g) $HOME /.kube/config 4.查看集群节点 [root@master231 ~]# kubectl get cs Warning: v1 ComponentStatus is deprecated in v1.19+ NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-0 Healthy {"health" :"true" ,"reason" :"" } [root@master231 ~]# [root@master231 ~]# [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 NotReady control-plane,master 117s v1.23.1
部署worler组件,添加节点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1.导入镜像 [root@worker232 ~]# docker load -i slave-1.23.17.tar.gz [root@worker233 ~]# docker load -i slave-1.23.17.tar.gz 2.在worker节点输入刚刚的token [root@worker232 ~]# kubeadm join 10.0.0.231:6443 --token lzphw7.kc4iu4k0mswnpy7h \ --discovery-token-ca-cert-hash sha256:298393d4dc931d6d13ec2ec1aedd4295bcd143a84e78dfc5a82ec7e53210d511 [root@worker232 ~]# kubeadm join 10.0.0.231:6443 --token lzphw7.kc4iu4k0mswnpy7h \ --discovery-token-ca-cert-hash sha256:298393d4dc931d6d13ec2ec1aedd4295bcd143a84e78dfc5a82ec7e53210d511 3.master节点检查集群的worker节点列表 [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 NotReady control-plane,master 13m v1.23.17 worker232 NotReady <none> 3m19s v1.23.17 worker233 NotReady <none> 2m3s v1.23.17
部署CNI插件,打通网络 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 1.导入镜像 [root@master231 ~]# docker load -i flannel-cni-plugin-v1.5.1.tar.gz [root@master232 ~]# docker load -i flannel-cni-plugin-v1.5.1.tar.gz [root@master233 ~]# docker load -i flannel-cni-plugin-v1.5.1.tar.gz [root@worker231 ~]# docker load -i flannel.tar.gz [root@worker232 ~]# docker load -i flannel.tar.gz [root@worker233 ~]# docker load -i flannel.tar.gz 2.下载Flannel组件 [root@master231 ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 3.安装Flannel组件 [root@master231 ~]# kubectl apply -f kube-flannel.yml 4.查看版本,版本要一致不然会启动失败 [root@master231 ~]# grep image kube-flannel.yml 5.检查falnnel各组件是否安装成功 [root@master231 ~]# kubectl get pods -o wide -n kube-flannel NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kube-flannel-ds-ckkbk 1/1 Running 0 35s 10.0.0.233 worker233 <none> <none> kube-flannel-ds-kst7g 1/1 Running 0 35s 10.0.0.232 worker232 <none> <none> kube-flannel-ds-ljktm 1/1 Running 0 35s 10.0.0.231 master231 <none> <none> 6.测试各节点组件 [root@master231 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master231 Ready control-plane,master 37m v1.23.17 worker232 Ready <none> 27m v1.23.17 worker233 Ready <none> 26m v1.23.17
五、安装kubectl工具自动补全功能 1 2 3 4 5 6 7 8 9 10 1.临时补全生效 apt -y install bash-completionsource /usr/share/bash-completion/bash_completionsource <(kubectl completion bash) 2.永久补全生效需要写入环境变量 [root@master231 ~]# vim .bashrc ...source <(kubectl completion bash)
六、修改时区 1 2 3 4 5 1.修改时区 [root@master231 ~]# ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 2.验证 [root@master231 ~]# date -R
七、k8s基础巡检 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1.检查K8S集群的worker节点列表 [root@master231 ~]# kubectl get nodes 2.检查master组件 [root@master231 ~]# kubectl get cs 3.检查flannel网卡是否正常 [root@master231 ~]# kubectl get pods -o wide -n kube-flannel 4.检查各节点网卡 ifconfig - 如果有节点没有cni0网卡,建议大家手动创建相应的网桥设备,但是注意网段要一致: 1.假设 master231的flannel.1是10.100.0.0网段。 ip link add cni0 type bridge ip link set dev cni0 up ip addr add 10.100.0.1/24 dev cni0 2.假设 worker232的flannel.1是10.100.1.0网段。 ip link add cni0 type bridge ip link set dev cni0 up ip addr add 10.100.1.1/24 dev cni0 3.假设 worker233的flannel.1是10.100.2.0网段。 ip link add cni0 type bridge ip link set dev cni0 up ip addr add 10.100.2.1/24 dev cni0