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