K8S实战笔记--1(k8s安装 + kuboard安装 + Devops迁移ECS)

0. 引言

DevOps实战笔记–3,我们介绍了使用Jenkins流水线任务进行项目的自动化CI/CD,借助pipeline脚本(Jenkinsfile)可以方便地对项目进行统一的配置管理,并且将Jenkinsfile 存放在Gitlab中以便于后期维护。同时,我们对于K8S也有了初步的了解,限于实验机器的硬件条件,题主决定采用外部云服务器进行K8S的相关实验。本篇将从采购阿里云ECS服务器开始,对K8S集群的搭建进行讲解。

1. 搭建K8S集群并配置集群管理工具

1.1 Kuboard简介

Kuboard是一个K8S的多集群管理界面,在Github开源。使用Kuboard提供了多种认证方式,在Kuboard可以使用内建用户库、gitlab / github 单点登录或者 LDAP 用户库进行认证,避免管理员将 ServiceAccount 的 Token 分发给普通用户而造成的麻烦。使用内建用户库时,管理员可以配置用户的密码策略、密码过期时间等安全设置。并且,通过Kuboard可以使用图形界面进行工作负载的编辑,使用户从繁琐的YML文件中解放出来。

更多详情请见:Kuboard官网

1.2 购置ECS云服务器

国内主流的ECS供应商有:阿里云、华为云、腾讯云等。

阿里云:官网详情
华为云:官网详情
腾讯云:官网详情

读者可以根据自身条件选择合适的云服务器供应商,本次实验以阿里云服务器为例,通过阅读Kuboard官网的Kubernetes安装文档,根据其要求的规格进行服务器采购,具体的服务器规格为:2核4G的服务器至少两台(需要至少一台作为主节点、一台作为从节点)、CPU 必须为 x86架构、支持的操作系统为CentOS 7.8CentOS 7.9Ubuntu 20.04

购置完成后,从对应供应商的web控制台中查看已经创建好的实例,使用SSH服务利用公网IP对服务器进行远程连接(服务器默认开启22端口)。在远程连接服务器时,可能出现如下错误:No supported authentication methods available [preauth]。解决方法为:查看 /etc/ssh/sshd_config是否配置了参数PasswordAuthenticationno,将其改为yes后利用systemctl restart sshd重启SSH服务。

1.3 安装K8S集群并搭建集群管理工具

Kubernetes + Kuboard安装难度相对较低,在Kuboard官网中,我们可以详细查阅Kuboard的安装文档:《Kuboard安装手册》,对应此安装文档,可以完成对应版本kuboard的安装。查看Kuboard v3.x版本说明,对比Kuboard兼容性列表,观察到Kuboard v3对大多数Kubernetes版本都有支持。值得一提的是,最新版本的Kubernetes已经舍弃了Docker并使用了其他的容器技术,鉴于本实验更多侧重于Docker容器技术的使用,建议选择Kubernetes v1.19版本。

1.4 将CI/CD服务迁移至云服务器

现将如下服务流程迁移至云服务器:Gitlab -> Jenkins -> Sonarqube -> Harbor,除此之外,需要的支撑服务为:jdk + maven + docker等。

迁移CI/CD的工作流程为:

  1. 进行jdk + maven的安装,将其加入环境变量,运行source profile使配置生效,更改MAVEN_HOME/conf下的settings.xml文件,在其中配置国内镜像加速地址,并修改原有jdk编译插件为1.8版本。

  2. 在创建ECS实例时,若未选择在实例中添加自定义docker镜像,可选择手动安装docker。在使用docker20.10.9及以下版本时,经docker-compose命令创建并运行容器时可能出现线程创建错误,将docker升级后解决。

  3. 使用docker安装gitlab,在云控制台安全组中放行对应端口以从浏览器访问web管理界面。

  4. 使用docker安装Jenkins,将jdk + maven移入Jenkins数据卷目录下,或在docker-compose.yml文件中手动写入映射,以便在容器中使用jdk + maven服务。在安全组中开放端口并访问web管理界面,使用admin账户登录Jenkins,在全局工具配置中配置映射完成后的jdk + maven。

  5. 使用docker安装sonarqube + postgres,注意sonarqube版本与jdk1.8的对应关系,开放端口以访问web管理界面。

  6. 从官网下载sonarscanner,解压并移入数据卷,更改其conf/下配置文件的IP地址,并将UTF-8设置为开启。

  7. 在Jenkins中安装插件:sonarqube scanner,在全局工具配置中添加sonarqube,并将从sonarqube管理页面生成的密钥加入Jenkins全局凭证。

  8. 从github下载Harbor,修改yml文件中harbor的域名,注释掉Https证书与私钥,运行prepareinstall.sh安装harbor。

  9. etc/docker/daemon.json中配置docker镜像加速地址与harbor私库地址,配置完成后需要使用systemctl daemon-reload重新加载改文件,重启docker。

  10. 为在Jenkins容器内部也可使用docker服务,需要将docker可执行命令、私服配置与修改权限后的/var/run/docker.sock映射入容器内部。

  11. 在Jenkins的web管理界面中,需要安装的插件有:git parameterpublish over sshgitlab等。

  12. Jenkins使用账密凭证连接gitlab与目标服务器,在publish over ssh中测试服务器连接时,passphrase中填写目标服务器密码。且在构建项目时,考虑到docker容器名称不可大写,故制作镜像时需注意引用的项目名中是否包含大写字符,同时建议jenkins pipeline项目命名与构建项目名称相同,否则执行推送至私库时会出现无法识别的镜像或非法的镜像名。在流水线生成器sshpublisher中对应执行的ssh命令需要使用双引号来引用变量,默认生成的单引号只会将$引用的变量识别为字符串。

  13. 现总结因按量计费导致的公网IP变化后,需要调整IP地址的个别文件:
    a. 用于启动gitlab的docker-compose.yml
    b. sonarscanner安装目录下:/conf/sonar-scanner.properties
    c. harbor安装目录下的harbor.yml
    d. harbor安装目录下的/common/config/core/env
    e. /etc/docker/daemon.json,需要重新进行加载
    f. 在执行上述操作,并重启docker后,需要再次执行harbor下prepareinstall.sh来对harbor进行初始化,否则可能出现docker无法登入harbor服务的问题。

    使用sed -i 's/*原有内容/*修改后内容/g' 文件名来对文件内容进行快速修改。将重复的命令制作成脚本执行,以加快工作效率。