从零开始搭建一个电商项目-流水线(九)

  1. 前言

    我们部署项目的事情,之前是要运维人员手动传包到服务器,然后备份、运行。如果是微服务的话,手动要重复很多次。流水线自动化部署可以简化手动部署的流程,大大缩短部署时间。本次搭建的流水线部署是由K8s+Docker+Jenkins。流水线插件尚未安装成功,由于电脑内存不够用,插眼后续有机会在安装。

  2. 搭建

  • 创建三台虚拟机,内存大于2G,磁盘大于30G,Cpu4核。我这里之前已经搭建过三个虚拟机,如果不知道如何搭建的,请问度娘。

  • 关闭 selinux (全部执行)

    1
    2
    sed -i 's/enforcing/disabled/' /etc/selinux/config 
    setenforce 0
  • 关闭swap(全部执行)

    1
    2
    3
    swapoff -a 临时
    sed -ri 's/.*swap.*/#&/' /etc/fstab 永久
    free -g 验证,swap 必须为 0;
  • 修改Host(全部执行)

    1
    2
    3
    4
    5
    6
    7
    8
    vi /etc/hosts  #添加以下内容,根据自身的ip设置

    192.168.202.130 k8smaster
    192.168.202.131 k8s-node1
    192.168.202.132 k8s-node2

    #hostnamectl set-hostname :指定新的 hostname
    #su 切换过来
  • 将桥接的 IPv4 流量传递到 iptables 的链 (全部执行)

    1
    2
    3
    4
    5
    6
    cat > /etc/sysctl.d/k8s.conf << EOF 
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF

    sysctl --system #立刻生效
  • 若遇到只读文件系统

    1
    mount -o remount rw /  
  • 安装 docker

    • 卸载本机的docker

      1
      2
      3
      4
      5
      6
      7
      8
      yum remove docker \
      docker-client \
      docker-client-latest \
      docker-common \
      docker-latest \
      docker-latest-logrotate \
      docker-logrotate \
      docker-engine
    • 添加yum镜像源

      1
      2
      3
      yum-config-manager \
      --add-repo \
      http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    • 安装docker(建议别用)

      1
      yum install docker-ce docker-ce-cli containerd.io  #建议不要用这个,安装制定版本的docker
    • 安装制定版本的docker

      1
      2
      3
      4
      5
      6
      yum list docker-ce --showduplicates | sort -r   #列出可以安装的docker列表

      #然后通过以下命令进行安装 建议 19.03.4,需要与k8s版本兼容
      #yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
      #通过其完整的软件包名称安装特定版本,该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如:docker-ce-18.09.1。

    • 配置镜像源

      1
      2
      3
      4
      5
      6
      7
      8
      vi  /etc/docker/daemon.json

      # 添加以下内容
      {
      "registry-mirrors": ["https://ukdgcz5v.mirror.aliyuncs.com"]
      }

      systemctl daemon-reload #立即生效
    • 启动docker

      1
      systemctl start docker 
    • 测试 hello-world 镜像,是否安装成功

      1
      docker run hello-world
    • 卸载

      1
      2
      3
      4
      5
      yum remove docker-ce   #第一种方法

      yum list installed | grep docker-ce #第二种
      yum -y remove # 安装包
      rm -rf /var/lib/docker #删除镜像
    • 删除镜像

      1
      rm -rf /var/lib/docker
    • 可能遇到的问题,若出现再重启电脑之后,docker无法正常启动,则停掉容器在重启。

      1
      systemctl stop containerd && systemctl start containerd && systemctl start docker.service
    • 补充

      1
      2
      docker container prune   #删除启动失败的容器

    • 安装 kubeadm(安装K8S集群的工具),kubelet(管理Pod) , kubectl (可以发送命令给集群)

      1
      2
      3
      4
      yum list|grep kube   # 可以查看有哪些版本可以下载
      yum install -y kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
      systemctl enable kubelet
      systemctl start kubelet
    • master节点初始化

      注意:需要下载相应镜像,我们可以先pull下来,init的时候默认的镜像地址是 k8s.gcr.io 国内无法访问,也可以修改镜像地址为阿里云:
      registry.aliyuncs.com/google_containers (没试过)
      先pull相应的镜像镜像(可以写一个shell脚本)

1
2
3
4
5
6
7
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.3
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
  • 使用kubeadm 进行初始化

    1
    2
    3
    kubeadm init  --apiserver-advertise-address=192.168.202.130  \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
    --kubernetes-version v1.17.3 --service-cidr=10.96.0.0/16 --pod-network-cidr=10.244.0.0/16

    注意:
    第一行的api的地址必须为master节点主机的地址,
    第二行设置镜像,需要设置成初始化之前 pull 的那个镜像,到时候初始化的时候,会找到此镜像前缀的镜像。
    第三行就是 kub的版本,以及要和pull的镜像本部一致, 下面就是service的地址,pod的地址

  • 等待执行,执行完成先不要关闭控制台,需要执行控制台显示的命令(一定要看控制台)

    1
    2
    3
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 安装网络插件 cni

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

    # 注意:这个配置文件可能访问不到,需要翻墙。
  • 查看集群 的命名空间 kube-system 的节点,是否都处于running

    1
    2
    3
    watch kubectl get pod -n kube-system -o wide #实时 监听节点状态  

    kubectl get pods –A #获取所有的pod
  • 加入到集群,还是控制台上显示的命令(需要在子节点上执行)

    1
    2
    kubeadm join 192.168.202.130:6443 --token qgppem.4wqaw804dga9un6i \
    --discovery-token-ca-cert-hash sha256:900d6b4e8173a650c9d7488a19c8ab4aabd2081edceaecb849bd7e1265720dfe

    注意,若Token过期,则使用以下命令再次生成

    1
    2
    kubeadm token create --print-join-command  
    kubeadm token create --ttl 0 --print-join-command

    注意:可能网络节点CNI启动不起来,可以使用docker ps -a 去查看容器启动情况,其实所有的k8s集群搭建,都是需要创建docker容器的,我当时的解决办法:
    下载的文件:cni-plugins-linux-amd64-v0.8.6.tgz
    网上搜 cni 插件(会是一个tar.gz 文件),到时候使用wget命令下载,解压放到 /opt/cni/bin,等会网络会自动处于running

  • 安装图形化界面(我这里没有安装默认的 dashboard ,而是安装了 Kubesphere,还是需要等到所有的pod处于running,如果不算running要解决掉,其实这些pod就是docker下载下来的镜像 )

    网址:https://kubesphere.io/,我这里安装的是 2.1.1

1
2
3
4
wget -O helm.tar.gz https://get.helm.sh/helm-v2.16.2-linux-amd64.tar.gz  #载安装包
tar -zxvf helm.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm #命令查看, 安装是否完成
  • 创建权限(master 执行) 创建helm-rbac.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1 
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
1
kubectl apply -f helm-rbac.yaml   #(可以使用 kubectl  delete -f 卸载)
  • 安装Tiller(master)

添加helm的镜像:(二选一)(jessestuart/tiller:v2.16.3其实可以通过 docker pull先下载下来)

1
2
3
4
helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo add stable http://mirror.azure.cn/kubernetes/charts)
helm repo update
helm init --service-account=tiller --tiller-image=jessestuart/tiller:v2.16.3 --history-max 300

kubectl get pods –A 查看节点状态,是否处于 running
kubectl logs -n kube-system kube-flannel-ds-amd64-4wh2x(安装的pod) 可以查看日志

  • 安装 OpenEBS(master,建议安装NTFS当做存储插件,因为我安装了OpendEBS出现节点异常的情况)

    1. 查看是否有污点

      1
      2
      kubectl describe node k8s-master | grep Taint  #(k8s-master 主节点的主机名)
      #会显示 Taints: node-role.kubernetes.io/master:NoSchedule 则代表有
    2. 去掉污点

      1
      kubectl taint nodes k8s-master node-role.kubernetes.io/master:NoSchedule-
    3. 开始安装

      1
      2
      kubectl apply -f https://openebs.github.io/charts/openebs-operator-1.5.0.yaml
      kubectl get sc #查看是否安装成功(需要running)
    4. 设置默认的 StorageClass:

      1
      kubectl patch storageclass openebs-hostpath -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-    class":"true"}}}'
    5. 查看是否安装成功

      1
      kubectl get pod -n openebs
    6. 添加污点(注意红色部分,可以先不执行这一步,因为执行这一步Pod节点运行状态会异常)

      1
      kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule 

      注意这里,先别添加污点,官方文档这样写的,但是实践之后,不能正确安装Kubesphere,所以安装完成之后再去添加污点,在这卡了很久。

  • 开始最小化安装Kubesphere

    • 使用yaml进行安装

      1
      kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/v2.1.1/kubesphere-minimal.yaml

      若以上命令执行不成功,可以先访问地址,创建对应的本地文件,复制内容,到本地执行

    • 查看安装进度 (可能报错,因为需要创建下载的容器,容器创建好之后就可以执行以下命令)

      1
      kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

      kubectl get pod -A 查看 KubeSphere 相关的命名控制是否都处于 running,记得设置污点
      然后就可以通过账号密码访问了(安装完成后控制台会有路径,换成虚拟机的Ip访问即可)

  • 拔插式的添加 DevOps

    • 使用命令 kubectl edit cm -n kubesphere-system ks-installer 修改文件,打开devops

目前安装的流水线无法正常运行,因为我本地内存不够,所以暂时搁置到了这里,等后续有机会继续安装。如果大家内存够,访问浏览器的地址,就能创建DevOps的项目

  1. 流水线流程
    1. 传统K8S集群部署
    • 编写Dockerfile文件,将项目打包成镜像。然后登录镜像仓库,使用docker push命令将镜像上传到镜像仓库,推荐使用阿里云镜像仓库,这样推送下载都快。
    • 编写Deploy文件,手动执行将应用部署到K8s集群。
    • 编写Service文件,手动执行文件暴露访问接口。
    • 外部访问或内部调用。
    1. 流水线一站式部署
    • 在每个微服务的目录中添加Dockerfile文件,用于打包镜像。
    • 在每个微服务的目录中添加K8S的部署文件,配置deploy、service内容。
    • 编写Jenkins的配置文件
      • 首先从gitee拉取代码配置
      • Sonar代码质量分析
      • Docker 的build以及push,将镜像打包放到仓库中
      • 部署应用到K8s集群
      • 发布版本,将部署的镜像打包到仓库,用于记录版本信息。

踩坑日记
安装 kubesphere的时候一定要确保 存储类型 才可以安装,多使用 describe 查看原因
问题一:kubesphere 插件方式安装 devops的时候,出现 ks-jenkins has no deployed releases
解决:
使用 helm list -a 查看安装的 release
使用 helm install stable/jenkins –name ks-jenkins 安装,会显示已经存在
使用 helm del –purge XXX 删除安装包
helm repo list 查看镜像,记得要安装镜像

问题二:若出现 ks-jenkins 容器启动失败,
解决:
kubectl edit cm -n kubesphere-system ks-installer 命令,修改插件安装的配置文件,先 false 掉 devops
删除 helm 的 ks-jenkins 包
kubectl edit cm -n kubesphere-system ks-installer命令,在Ture 回来
使用 kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath=’{.items[0].metadata.name}’) -f 查看 安装进度

问题三:如何删除不需要的组件?(xxx 改成你的命名空间 pod pvc namespace都可以用此方法删除,建议 pvc->pod->ns)
解决:
kubectl delete ns xxx

kubectl delete ns xxx –force –grace-period=0

前两个会出现无法删除的情况,阻塞住,则使用以下方法:
kubectl get namespace xxx -o json > xxx .json
获取JSON文件,然后将 spec 里面的 finalizers 下的 kubernetes 删除就好
然后执行
kubectl replace –raw “/api/v1/namespaces/ xxx /finalize” -f ./ xxx .json

问题四:kubesphere重新安装可能出现让你删除安装包的问题
解决:
helm del –purge openebs 移除 并重新下载

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信