Jenkins+K8s实现持续集成

 一、Docker容器

1、Docker介绍

(1)Docker的介绍

  • Docker是一种容器技术。
  • 容器是什么-容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
  • 开发在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

(2)Docker的由来

  • 容器来源于集装箱,二者的英文都是Container,集装箱解决了运输的难题。
  • Docker的中文意思是码头工人。
  • Docker的图标是集装箱。

(3)容器 VS 虚拟机

 (4)Docker的特点

  • Docker的特点:轻量级、可移植、资源占用少。
  • 对于开发人员-Build Once,Run Anywhere。
  • 对于运维人员-Configure Once,Run Anything。

2、Docker安装配置

(1)Docker安装

  • apt-get update
  • apt-get install -y docker.io

(2)Docker配置

  • 阿里云加速器配置(https://cr.console.aliyun.com/)

3、Docker基本使用

(1)Docker基本使用

docker pull mysql:5.6

docker run -p 3306:3306 --name mymysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

(2)Docker架构

 (3)Docker基本概念

  • 镜像(image)、容器(container)、仓库(registry)。
  • 仓库分公有和私有两种。Docker hub是默认的仓库。

 docker pull nginx

 docker rmi nginx

 (4)Docker基本使用

  • 版本查看、镜像拉取、镜像查询、镜像删除。
  • 容器运行、端口映射、挂存储卷、进入容器、查看容器日志、查询容器、设置环境变量、容器停止、容器删除。
  • 仓库登录。
  • 镜像构建、镜像打tag、镜像推送。
  • Dockerfile基本语法(FROM、RUN、CMD/ENTRYPOINT、EXPOSE)

docker run -p 3306:3306 --name mymysql -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

docker logs -f ce5307fc90b6

docker ps -a

docker stop ce5307fc90b6

docker rm ce5307fc90b6

 

docker push myregistry/mymysql:1.0

 

 二、必知必会的K8s

1、k8s介绍

Kubectl cerate -f test.yaml

Kubectl apply -f /root/kube.yaml

kubectl get services --all-namespaces

  •  基于容器技术的分布式架构领先方案。它是google严格保密十几年的秘密武器-Borg的一个开源版本。
  • Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

2、k8s能做什么

  • 容器的自动化复制和部署。随时扩展或收缩容器规模,并提供负载均衡。
  • 方便地容器升级。
  • 提供容器弹性,如果失效就替换它。

K8s对于测试能做什么

  • 测试服务器的集中化、自动化管理。将各种平台的服务器加入集群,按需部署或销毁。
  • 持续集成时方便地自动部署。

k8s架构

 k8s基本概念

  • Master是主服务器,node是用于部署应用容器的服务器。
  • Pod基本操作单元,也是应用运行的载体。整个Kubernetes系统都是围绕着Pod展开的,比如如何部署运行Pod、如何保证Pod的数量、如何访问Pod等。
  • Deployment定义了pod部署的信息。
  • 若干个pod副本组成一个service,对外提供服务。
  • 副本是指一个pod的多个实例。
  • Namespace用于多租户的资源隔离。在测试环境中可以根据namespace划分成多套测试环境。默认有2个namespace:kubu-system/default

k8s调度过程

  • Kubernetes Client将请求发送给API server。
  • API Server根据请求的类型,将处理的结果存入高可用键值存储系统Etcd中。
  • Scheduler将未分发的Pod绑定(bind)到可用的Nod节点上,存到etcd中。
  • Controller Manager根据etcd中的信息,调用node中的kubelet创建pod。
  • Controller Manager监控pod的运行状况并确保运行正常。

3、k8s的安装

k8s安装前的准备

准备ke xue上网。在主机上安装,并配好服务器(服务器地址、密码需要自己想办法哦)

 k8s安装说明

  • 2台主机上都要安装docker。
  • 2台主机上都要安装kubeadm、kubelet和kubectl。
  • 2台主机上都要禁用虚拟内存。

k8s安装以及配置

安装kubeadm,kubelet和kubectl(一)

apt-get update && apt-get install -y apt-transport-https curl

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - 

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb
http://apt.kubernetes.io/ kubernetes-xenial main
EOF apt
-get update && apt-get install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl

注意:curl如果连不上,则需要设置一下ke xue上网:export http_proxy=10.10.10.94:1087 && export https_proxy=10.10.10.94.1087

操作步骤

在ubuntu主机上:

swapoff -a

apt-get install apt-transport-https

apt-get install curl

在ubuntu-node主机上:

swappff -a

apt-get update

apt-get install -y apt-transport-https

apt-get install -y curl

4、k8s的设置ke xue上网

vim /etc/apt/source.list.d/kubernetes.list

export http_proxy=192.168.0.186:1087 && export https_proxy=192.168.0.186:1087

echo $http_proxy

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -


cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF

5、k8s配置

 vim apt_proxy_conf

 apt-get -c apt_proxy_conf update

 apt-get -c apt_proxy_conf install -y kubelet kubeadm kubectl

apt-mark hold kubelet kubeadm kubectl

安装kubeadm、kubelet和kubectl(二)

Apt安装这3个东东时,可能需要翻墙。Apt翻墙安装使用如下方式:

 初始化master(一)

  1. swapoff -a (禁用虚拟内存)
  2. kubeadm init --pod-network-cidr=10.244.0.0/16

 注意:这一步因为连不上Google的镜像库,会导致失败。记录下载失败的镜像,下一页中会告诉大家如何处理。

6、k8s初始化master

kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

 注意:这一步因为连不上Google的镜像库,会导致失败。记录下载失败的镜像,下一页中会告诉大家如何处理。

 初始化master(二)

  1. 可以从keveon或mirrorgooglecontainers镜像库中下载,当其中一个镜像库找不到时,尝试另外一个。
  2. 再手工设置tag。

7、k8s安装和配置

docker pull mirrorgooglecontainers/kube-apiserver:v1.13.2

docker tag mirrorgooglecontainers/kube-apiserver:v1.13.2 k8s.gcr.ioi/kube-apiserver:v1.13.2

docker images | grep kube-apiserver

docker rmi mirrorgooglecontainers/kube-apiserver:v1.13.2
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.2

docker tag mirrorgooglecontainers/kube-controller-manager:v1.13.2 k8s.gcr.ioi/kube-controller-manager:v1.13.2

docker rmi mirrorgooglecontainers/kube-controller-manager:v1.13.2

docker images | grep kube-controller
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.2

docker tag mirrorgooglecontainers/kube-scheduler:v1.13.2 k8s.gcr.ioi/kube-scheduler:v1.13.2

docker rmi mirrorgooglecontainers/kube-scheduler:v1.13.2

docker images | grep kube-scheduler
docker pull mirrorgooglecontainers/kube-proxy:v1.13.2

docker tag mirrorgooglecontainers/kube-proxy:v1.13.2 k8s.gcr.ioi/kube-proxy:v1.13.2

docker rmi mirrorgooglecontainers/kube-proxy:v1.13.2

docker images | grep kube-proxy
docker pull mirrorgooglecontainers/pause:3.1

docker tag mirrorgooglecontainers/pause:3.1 k8s.gcr.ioi/pause:3.1

docker rmi mirrorgooglecontainers/pause:3.1

docker images | grep pause
docker pull mirrorgooglecontainers/etcd:3.2.24

docker tag mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.ioi/etcd:3.2.24

docker rmi mirrorgooglecontainers/etcd:3.2.24

docker images | grep etcd
docker pull keveon/coredns:1.2.6

docker tag keveon/coredns:1.2.6 k8s.gcr.ioi/coredns:1.2.6

docker rmi keveon/coredns:1.2.6

docker images | grep coredns

 初始化master(三)

  1. 重新执行kubeadm init --pod-network-cidr=10.244.0.0/16。
  2. 记录下最后一条kubeadm join命令。

kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=NumCPU

 初始化master(四)

  1.  mkdir -p $HOME/.kube
  2. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  3. sudo chown $(id -u):$(id -g) $HOME/.kube/config

8、k8s安装网络插件

安装网络插件(只在master上执行)(一)

  •  sysctl net.bridge.bridge-nf-call-iptables=1
  • curl -O https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

安装网络插件(只在master上执行)(二)

  • 修改kube-flannel.ym文件,增加下图中红色的部分。

  • kubectl apply -f kube-flannel.yml

添加node(只在node上执行)

  • 将之前记录下来的kubeadm join 命令执行。
  • swapoff -a
  • sysctl net.bridge.bridge-nf-call-iptables=1

k8s检查安装配置

  • 检查node是否ready:kubectl get node

  •  检查所有pod是否正常:kubectl get pod --all-namespaces -o wide

 

9、k8s安装异常处理

 

  •  在node上执行kubeadm reset可以断开node,然后重新join。
  • 在master上执行kubeadm reset后可以重新init。
  • 重新启动后,要执行如下命令:
  1. swapoff -a
  2. systemctl daemon-reload
  3. systemctl restart kubelet

10、k8s基本使用

k8s基本使用-Deployment创建、删除

  • kubectl create -f test.yaml
  • kubectl delete -f test.yaml

 k8s基本使用-Service创建及查看

  • kubectl create -f test.yaml
  • kubectl get service --all-namespaces

 k8s基本使用-Pod查看、删除

  • kubectl get pod --all-namespaces -o wide
  • kubectl describe pod xxxxxx -n kube-system
  • kubectl delete pod xxxxxx -n kube-system

三、持续集成与Jenkins

1、持续集成

  • 持续集成(CI)是一种软件开发实践。
  • 团队开发成员经常集成他们的工作,每个成员每天至少集成一次。
  • 每天可能会发生多次集成。
  • 每次集成都通过自动化的构建(包括编译、打包、部署、自动化测试)来验证。
  • 从而尽早地发现集成错误。

持续集成过程

 持续集成优势

  • 快速集成、快速反馈、快速解决。
  • 团队信心更强。
  • 发布效率更高

2、Jenkins介绍

  • 持续集成工具
  • 任务调度平台

 

 

3、Jenkins安装以及配置

Jenkins安装

  • jdk安装以及配置环境变量

 

 

  •  tomcat下载并解压

 

 

 

  •  jenkins war包下载,并放到tomcat的app目录,启动tomcat。

 

 

 

 

 

 

 jenkins服务器安装

  • 安装git

  •  安装maven

 

 

 

 

 

  • 修改maven镜像,使用阿里云镜像,修改maven的conf目录下的settings.xml文件。

 

 jenkins配置

  • 浏览器访问Jenkins url:xxx.xxx.xxx.xxx:8080/jenkins
  • 按提示创建用户

  • 按提示安装插件:ssh/publish over ssh/git parameter/Maven Integration

 

 

 

 

 Jenkins配置

  • Jenkins全局工具配置,配置jdk/git/maven

 

 

四、Jenkins+k8s发布实例

1、Jenkins+k8s发布实例

2、registry安装配置和使用

Registry安装配置

  • docker pull registry
  • docker run -p 5000:5000 -v /home/registry_images:/var/lib/registry -d registry

Registry使用

  • 修改/etc/docker/daemon.json文件
  • docker pull nginx
  • docker tag nginx 10.10.10.71:5000/nginx:test
  • docker pull 10.10.10.71:5000/nginx:test

 

 

 

 

 

3、Jenkins项目创建与配置

Jenkins项目创建

  • 创建maven项目

 

 

  • 设置参数化构建

  •  Jenkins项目配置-设置代码源

当前使用的是github上的一个public项目,你也可以使用

  •  设置maven构建命令

  •  设置构建后操作,将jar包打包成docker镜像,并推送registry

注意:对应脚本要放到对应目录。

 

 

 

 

 

 

4、Jenkins项目构建

 Jenkins项目配置

  • 设置jenkins服务器到k8s master ssh 免密登录

 

 

 

 

  •  设置构建后操作,将yaml文件拷贝到k8s master上并运行应用。

 

 Jenkins项目构建-参数化构建

Jenkins查看日志

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

jenkins访问验证

  • 浏览器访问任一node的IP加上nodePort。

 

总结

  • Registry安装配置和使用(使用docker安装)
  • Jenkins项目创建与配置
  • Jenkins项目构建

来源:慕课网免费课程地址:http://www.imooc.com/learn/1112

原文地址:https://www.cnblogs.com/it-deepinmind/p/13229234.html