k3s+docker+rancher+gitlab+gitlab-runner+jenkins 持续集成系统在容器集群下的搭建

文章来源bitllion的私人博客

生产环境 centos7

nfs服务器 centos7

管理服务器 ubuntu18.04

总的流程:安装k3s容器编排系统,使用docker安装rancher os,将k3s交给rancher管理(web可视化),再用rancher部署其他应用

安装K3S

选择k3s 而不是k8s:轻量,使用container而不是完全体的docker,加入SQLite原生支持,使用traefik原生支持k8s网络的负载均衡代替旧的nginx-ingress

服务和客户节点相同操作:

如果你的服务器在国外或者有代理代理,那么直接运行下面的命令:

wget -O k3s https://get.k3s.io && chmod +x k3s && ./k3s --no-deploy traefik
  • 1.使用代理下载好k3sairgap镜像

    ps:下面是我放在国内公有云存储的镜像,可能不是最新的,这样md5校验会出错

    wget https://k3s-images.oss-cn-qingdao.aliyuncs.com/k3s 
    wget https://k3s-images.oss-cn-qingdao.aliyuncs.com/k3s-airgap-images-amd64.tar
    
  • 2.赋予k3s可执行权限

    chmod +x k3s
    
  • 3.将airgap添加到k3s(airgap是k3s的容器系统

    mkdir -p /var/lib/rancher/k3s/agent/images/
    cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
    
  • 4.安装k3s不带traefik(还有bug,暂时用nginx-ingress)

    ./k3s --no-deploy traefik
    
  • 5.验证是否成功

    kubectl get node
    

    !如果无返回或返回错误,请设置hostname,k8s网络根据本机hostname的值确定name,如果hostname是原始的localhost值会报错

docker 安装和配置

new:

  • 0.0 snap 安装docker

19.09.08 update: 推荐使用snap包管理器,这是一个新的支持多种linux发行版的包管理器,利用了虚拟空间,所以解决了软件api的问题,让linux在软件安装方面变得像windows一样统一和方便~~~/手动滑稽

  • 0.1 ubuntu18.04之后自带snap 你可以使用如下命令直接安装docker : snap install docker
  • 0.2 centos平台:
    如果没有添加epel仓库,首先安装它
    yum install epel-release
    
    然后安装snapd
    yum install snapd
    
    使socket生效
    systemctl enable --now snapd.socket
    
    添加软连接
    ln -s /var/lib/snapd/snap /snap
    
    安装docker
    snap install docker
    

old:

  • 1.1 ubuntu:
    • 1.1.2 安装以支持https存储库传输
      apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
      
    • 1.1.3 安装公钥
      curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
      
    • 1.1.4 添加仓库源并更新源
      add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" && apt update
      
    • 1.1.5 安装docker
      apt install docker-ce docker-ce-cli containerd.io
      
  • 1.2 centos
    • 1.2.1 安装https支持
      yum install -y yum-utils device-mapper-persistent-data lvm2
      
    • 1.2.2 添加仓库
      yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
    • 1.2.3 安装docker
      yum install docker-ce docker-ce-cli containerd.io
      
  • 2.添加镜像加速源,这里我们用了阿里云容器镜像加速器:

rancher部署

Rancher 是 用来管理kubernetes集群的web端
官方DOC

  • 1.拉取并运行rancher

    docker run -d --restart=unless-stopped -p 8443:443 --name rancher -v /data/rancher/:/var/lib/rancher rancher/rancher
    

    打开 https://yourmaster_ip:18443 重置密码,登陆;注意!这里需要将IP替换成内网的ip(内部集群可访问的master_ip地址,当然如果你需要添加其他公网地址的集群,那么就使用默认的)

  • 2.部署k3s集群

    • 点击添加集群
    • 导入现有的kubernetes集群,创建
    • node节点执行最后一条命令

    稍微等待几分钟,状态变为Acitve部署完成

  • 3.应用商店添加helm国内源

名称 商店url 分支 作用范围
helm http://mirror.azure.cn/kubernetes/charts/ master global
incubator http://mirror.azure.cn/kubernetes/charts-incubator/ master global
  • 4.rancher的持久化配置

  • 4.1 nfs持久化
    nfs主机配置持久化目录/data,开启nfs服务端

    yum -y install rpcbind nfs-utils
    mkdir /data -p
    

    配置挂载目录,设置相应权限,这里加insecure是为了允许1024以上的端口

    echo "/data *(insecure,rw,no_root_squash,sync)" >> /etc/exports
    

    重载配置文件,重启nfs服务

    exportfs -r
    systemctl start rpcbind nfs-server
    systemctl enable rpcbind nfs-server
    

    使用showmount -e localhost 验证nfs服务端挂载情况:

    Export list for 192.168.6.39:
    /data *
    
  • 4.2示例:
    rancher中持久化流程

    ①所在集群中添加一个PV(持久卷);NFS插件(如果你没有配置nfs,也可以用别的方式,比如local node path/disk),访问模式多主机读写,下同

    ②Default:添加pvc,使用现有的PV

    ③Default:工作负载部署服务数据卷选择现有PVC

    总结:一个持久化的应用,必须有pv卷和pvc存储

网络优化NGINX-INGRESS

system项目中在应用商店安装NGINX-INGRESS

使用方法:非system项目中,

①工作负载的端口映射中网络模式选择集群IP

②添加对应应用的负载均衡,如果使用泛域名解析到管理节点ip,如在域名服务商dns解析你有 *.app.cloud.cn >> rancher_ip 这样的解析

假设有工作负载(应用)nginx,你可以添加这样的ingress负载均衡,域名nginx.app.cloud.cn,工作负载nginx,容器端口80

则访问 nginx.app.cloud.cn 会负载均衡到nginx服务上,同理你可以访问 wordpress.app.cloud.cn 解析到 wordpress 服务上

nginx-ingress使单ip节点的集群可以运行不同的web服务而不会有端口冲突的问题,你甚至可以在同一集群上部署多个nginx,而这些“相同”的nginx却可以”互相独立“的服务,这一点类似于BGP网络,即使一个服务gg了,但如果备份的服务还在运行,那么流量将会导入这个备份的服务,这样避免了单节点故障,使服务能长久地运行,而且服务升级时可以新老并行,这样可以给用户足够过渡到新服务地时间

部署gitlab社区版

  • 1.添加名称pv-gitlab(自定义)持久化存储PV,挂载点/data/pvgitlab,访问模式多主机读写(使用nfs方式)

  • 2.添加gitlab的PVC,名称pvc-gitlab,使用刚创建的PV

  • 3.添加gitlab-ce工作负载(应用):

    • 3.1 你可以直接导入一份制作好的YAML文件进行部署

    • 3.2 如果使用UI操作,请务必保证下列条件:

      ① 开放容器的80、22端口,映射到自定义的端口
      ② 数据卷的挂载:
      /var/log/gitlab   logs
      /var/opt/gitlab   data
      /etc/gitlab       config
      

      其中/data/pvgitlab/config/下的gitlab.rb这个文件为gitlab配置文件

  • 4.宿主机内修改gitlab配置:

    vim /data/gitlab/config/gitlab.rb
    

    添加:

    external_url 'http://yourgitlab_ip:port'
    nginx['listen_port'] = 80
    nginx['listen_https'] = false
    gitlab_rails['gitlab_shell_ssh_port'] = 32222
    

    这里有个两个小坑,nginx默认监听external_url的ip:port,所以我们需要重定义下nginx实际监听端口。gitlab_shell_ssh_port仅仅改变了ssh clone地址的前端,而实际的gitlab ssh 还在监听22端口,可以在gitlab容器中使用cat /var/log/gitlab/sshd/current验证这一点,所以你不能在rancher - gitlab 工作负载中把容器的22端口改为 32222,否则会被直接拒绝或者无法验证部署在gitlab上ssh公钥

集成jenkins

  • 1.添加工作负载
  • 2.获取登录密码:jenkins 工作负载,右侧三个点点击它,在这里你可以针对单个负载执行命令行,使用cat /var/jenkins_home/secrets/initialAdminPassword 获取相应密钥
  • 3.换源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  • 4.安装gitlabsshgitlab hookauthen插件

集成runner

gitlab-runner 的负载均衡执行命令行

注册一个runner

gitlab-runner register

按照提示依次填入http://your_gitlab_ip/admin/runners给出的url和token,其他根据个人需求填写,执行环境选择kubernetes

集成openldap

waiting。。。。

gitlab集成k3s网络(现在还有bug,gitlab需要独立于rancher才能安装helm,暂时不推荐~)

在gitlab 中添加kubernetes集群,我们需要补全信息

在Rancher Web中集群这里可以使用kubectl命令行和k3s交互

!注:新版本gitlab 默认禁止本地网络的webhook,所以我们要在Admin->settting->network->Outbound requests 中
勾选Allow requests to the local network from web hooks and services 或者添加本地ip白名单

  • 1.URL

    https://localhost:6443 将ip替换为node节点的ip

  • 2.获取CA
    先获取证书的name

    kubectl get secrets
    

    再解码,将下面的name替换成返回得到的name

    kubectl get secret name -o jsonpath="{['data']['ca\.crt']}" | base64 --decode
    
  • 3.获取服务令牌(toke)

    • 3.1创建一个服务账户并赋予它集群管理员角色
      cat <
    • 3.2检索密钥资源
      SECRET=$(kubectl -n kube-system get secret | grep gitlab-admin | awk '{print $1}')
      
    • 3.3提取token
       TOKEN=$(kubectl -n kube-system get secret $SECRET -o jsonpath='{.data.token}' | base64 --decode)
      
      echo $TOKEN
      

你可能感兴趣的:(#k3s#gitlab#运维,运维,rancher,k3s,gitlab,docker)