itlab→jenkins→registry→kubernetes→docker

发开人员→gitlab→jenkins→registry→kubernetes→dockerhtml

 

思路:从开发人员上传代码到gitlab托管代码之后,jenkins自动pull下来而后作成镜像上传至registry私有仓库,同时发指令给kubernetes使他关闭旧容器,而后从新启用新的docker镜像并作成容器对外提供服务。node

 

 

 

——————————————————————————————————python

 

 

 

秉着从下到上的顺序,咱们从kubernetes开始部署。kubernetes在这个架构里扮演者管理容器集群的角色,然而咱们所要作到的,就是让kubernetes可以自动控制并管理docker的容器集群。nginx

 

首先咱们须要作一个registry私有仓库,能够选择任意一台服务器均可以,这里咱们选择kubernetes-master做为registry私有仓库。git

 

在kubernetes-master上进行操做:web

先去阿里云下载个镜像连接,建立本身的镜像仓库docker

 

# docker run -d --restart=always -p 5000:5000 registry:2shell

 

#同时将全部节点的私有仓库指定到kubernetes-master上json

在”/etc/docker/“目录下的"daemon.json"文件里,若是没有则建立”daemon.json“文件。在文件中写入:vim

{ "insecure-registries":["192.168.1.103:5000"] }

# systemctl restart docker #这一步作好了之后就能够在私有仓库pull镜像了

能够作一个测试

 

 

tag 是给镜像打标记,打上标记之后才能够上传 ,上传了之后也能够在任意服务器上pull下载

 

而后重要的地方到了,创建 yaml配置文件让kubernetes本身控制容器集群。

vim nginx-rc.yaml

Version: v1 #版本

kind: ReplicationController #类型,是rc类型,控制pod模板

metadata: #标记,里面写的是这个rc的名字

name: nginx

spec: #rc的命名空间,里面包含全部pod

replicas: 2 #开启pod模板数量

template: #pod的配置

metadata: #pod的标记

labels: #用于集群内识别pod的暗号

name: nginx

spec: #pod的命名空间

containers: #容器配置

- name: nginx #容器的名字

image: 192.168.1.103:5000/nginx #容器的镜像,这里咱们用的是本身的私有仓库镜像

ports: #暴露的容器的端口,并非服务器的端口

- containerPort: 80

 

必定要注意缩进,由于是用python的语言编辑的,因此必定要注意缩进。

 

# kubectl create -f nginx-rc.yaml #建立rc模板。而后静静的等待5-10分钟或者更短。

# kubectl get rc

# kubectl get pod

# kubectl describe pod #这几条是查看命令,能够观察pod的状况

 

这个时候就已经能够去node节点上访问容器了,在节点上看看状态

而后访问容器

 

但是容器的ip只能在容器本机上访问,集群内的其余主机和集群外的主机都没办法访问,这个时候就须要将容器的端口映射到服务器上的端口了,因此须要作一个service的模板。service 模板能够将容器的端口映射到服务器的端口上,而且能够固定映射在服务器上的端口。

#vim nginx-service.yaml

apiVersion: v1

kind: Service #类型是service

metadata:

labels: #这里的标记必定要和nginx-rc的标记对照,由于kubernetes

name: nginx 靠这个识别身份

name: nginx

namespace: default

spec:

type: NodePort #类型是节点端口,就是映射的端口

ports:

- port: 80

targetPort: 80 #这个是容器的端口

nodePort: 31230 #这个是容器在服务器上映射的端口,能够经过这个端口访问

selector:

name: nginx #做用同上面的labels

 

# kubectl create -f nginx-service.yaml

# kubectl describe service #查看service的映射,以下图

 

这个时候就能够尝试访问node节点的31230端口了,同时咱们发现,这个service还有轮循的功能。自带负载均衡的效果。

 

ok kubernetes 完毕, 开始配置 jenkins+gitlab联动

 

——————————————————————————————————

 

jenkins:工具集成平台

gitlab: 软件托管平台

部署这两个服务的联动,须要通过ssh验证。

 

首先咱们须要在gitlab上绑定jenkins服务器的ssh公钥,由于是在同一台服务器上,因此就本身给本身绑定,这里咱们使用的是root用户的公私钥,切记生产环境是不容许随便用root的

# ssh-kengen -t rsa

而后不输入只回车会生成一对公私钥

默认在/root/.ssh/

 

复制这个公钥,而后登录gitlab,点击右上角的设置

在这里扔进去刚才拷贝的公钥保存就好了。

 

 

 

咱们先在gitlab上建立一个代码仓库 点击 new project

 

输入一个仓库的名字 权限选择公共的(public)而后直接点击建立

点击新建一个new.file

 

写入代码,起一个名字而后保存

 

 

 

建立好了之后复制下面的ssh地址,而后在本地测试一下是否可用

# git clone git@192.168.1.101:root/test.git

 

 

若是能够用,则打开jenkins

点击新建

地址粘贴进去之后没有报错则没错

下面的这个插件很重要,就是他实现自动化更新的webhook插件,安装过了就会有这条,而后点击这条下面出来的这些东西保持默认就行。同时注意复制

 

这个里面写的是jenkins构建时候会执行的shell脚本,这个是最重要的,就是他实现了下端kubernetes自动更新容器的操做。

如下是里面的内容,若有不懂,请自行参考官方文档解读,上面黄色圈内的是对变量的解释能够参照

#!/bin/bash

backupcode="/data/backcode/$JOB_NAME/$BUILD_NUMBER"

mkdir -p $backupcode

chmod 644 "$JENKINS_HOME"/workspace/"$JOB_NAME"/*

rsync -acP "$JENKINS_HOME"/workspace/"$JOB_NAME"/* $backupcode

echo From 192.168.1.103:5000/nginx > "$JENKINS_HOME"/workspace/Dockerfile

echo COPY ./"$JOB_NAME"/* /usr/share/nginx/html/ >> "$JENKINS_HOME"/workspace/Dockerfile

docker rmi 192.168.1.103:5000/nginx

docker build -t 192.168.1.103:5000/nginx /"$JENKINS_HOME"/workspace/.

docker push 192.168.1.103:5000/nginx

ssh root@192.168.1.103 kubectl delete rc nginx

ssh root@192.168.1.103 kubectl create -f nginx.yaml

 

完事之后先别保存,首先复制一下上面的jenkins地址,而后去gitlab上绑定webhook

 

保存,登录gitlab,点击下图这个设置

 

点击下图这个,而后粘贴地址,保存

浏览区下拉,到这个位置,能够看到绑定了jenkins地址,而后点击test测试一下是否连通

 

测试显示下图 的蓝条说明jenkins 已经连通了gitlab

 

 

好了,jenkins和gitlab 都已经互相的ssh经过了,而后咱们最后须要作的一个ssh是关于jenkins对kubernetes-master的免密登录,由于咱们执行的jenkins 的shell里面有须要免密登录kubernetes-master的操做,因此仍是须要对jenkins作一个免密登录kubernetes的ssh验证。

 

首先咱们去kubernetes-master

# vim /etc/ssh/sshd_config

 

解除这个地方的 注释,而后写入可以访问到本机的地址 若是ssh不成功则把地址改成0.0.0.0。若是第59行原本就没有注释则不用重启服务

# systemctl restart sshd

 

而后去jenkins上复制以前已经有的 ssh公钥

 

复制 而后扔到kuernetes-master 的 /root/.ssh/authorized_keys 里面,若是没有这个文件则vim 写进去。注意路径!!( ssh 前面有个点)

 

而后从jenkins上测试一下(不要在意ip,由于我从新获取的ip,239是kubernetes-master)

 

一个小细节,测试一下jenkins 可不能够下载kubernetes-master 上面 registry的镜像(由于我从新获取的ip,因此jenkins+gitlab ip :192.168.1.101 master ip : 192.168.1.239 node ip : 192.168.1.64)

 

# docker pull 192.168.1.239:5000/nginx

好了,环境所有部署完毕!!!。开始测试

 

 

测试的方法很简单,就是在gitlab上新建代码,删除代码,修改代码,都会触发webhook进行自动部署。最终会做用在全部的nginx容器中,也就是咱们的web服务器。。

 

 

 

 

这里我修改了以前创建的 index.html文件 保存之后,就打开浏览器 一直访问kubernetes-node 里面的容器了

 

 

 

# firefox 192.169.1.64:31230

 

 

 

 

 

这个时候没变 仍是以前的, 按F5 多刷新几回之后就成了下图

 

 

 

 

 

 

 

 

再试一次

 

 

 

架构完成!

 

后记: 关于 kubernetes 还有好几种集群管理方法。咱们此次用的 rc模板 就是其中之一, 其余的还有pod 模板 和 deployment 模板, 这些都是功能很强大的集群调度模板。 还有更多功能待开发。。。。

相关文章
相关标签/搜索