itlab→jenkins→registry→kubernetes→docker

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

 

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

 

 

 

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

 

 

 

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

 

首先我们需要做一个registry私有仓库,可以选择任意一台服务器都可以,这里我们选择kubernetes-master作为registry私有仓库。

 

在kubernetes-master上进行操作:

先去阿里云下载个镜像链接,创建自己的镜像仓库

 

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

 

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

在”/etc/docker/“目录下的"daemon.json"文件里,如果没有则创建”daemon.json“文件。在文件中写入:

{ "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 模板, 这些都是功能很强大的集群调度模板。 还有更多功能待开发。。。。

 

转载于:https://my.oschina.net/u/4135913/blog/3054619

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值