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 模板, 這些都是功能很強大的集羣調度模板。 還有更多功能待開發。。。。

相關文章
相關標籤/搜索