k8s 使用配合Jenkins CICD 方案

環境描述:
192.168.0.63爲k8s集羣主節點,保證你的集羣裏dns與ingress已經安裝了

編譯打包就不敘述了,主要流程就是:
編譯打包-> build鏡像 -> 上傳鏡像到私服 -> 使用ansible-playbook拷貝模板文件到集羣主節點 -> 更改模板文件 -> create pod,service,ingress
#
#
k8s 使用配合Jenkins CICD 方案
#
#
#
k8s 使用配合Jenkins CICD 方案

#
#
k8s 使用配合Jenkins CICD 方案
#
#
k8s 使用配合Jenkins CICD 方案

#
#
docker images | grep ${projectname}-${environment} | gawk '{print $3}' | xargs docker rmi;
docker images | grep none | gawk '{print $3}' | xargs docker rmi;docker build -t registry.skong.com/${projectname}-${environment}:${branch} .;
docker push registry.xxxx.com/${projectname}-${environment}:${branch};
cp /data/source/templet/templet.yaml .; cp /data/source/templet/ingress_templet.yaml .;
sed -i ‘s/projectname/${projectname}/’ templet.yaml;
sed -i ‘s/environment/${environment}/’ templet.yaml;
sed -i ‘s/branch/${branch}/’ templet.yaml;
sed -i ‘s/projectname/${projectname}/’ ingress_templet.yaml;
sed -i ‘s/environment/${environment}/’ ingresstemplet.yaml;
sed -i ‘s/
/-/’ ingresstemplet.yaml; sed -i ‘s//-/’ templet.yaml;
sed -i ‘s/projectname1/${projectname}/’ templet.yaml
ansible-playbook /data/ansible/playbook/linux/install_docker_service.yml --extra-vars 'hosts=192.168.0.63 Jenvironment=${environment} sourcepath=${projectname} warpath=/data/jenkins/workspace/${environment}-${projectname}';
#
#
#
Ansible-playbook文件

[root@jenkins-master templet]# pwd
/data/source/templet
[root@jenkins-master templet]# cat install_docker_service.yml

  • name: send {{sourcepath}}_{{Jenvironment}}
    hosts: '{{hosts}}'
    tasks:

    • name: check pod {{sourcepath}}-{{Jenvironment}}
      shell: source /etc/profile && kubectl get po |grep {{sourcepath}}_{{Jenvironment}} |wc -l
      register: checkpod
      ignore_errors: True

    • name: remove {{sourcepath}}{{Jenvironment}}
      file: path=/data/source/{{sourcepath}}
      {{Jenvironment}} state=absent

    • name: mkdir {{sourcepath}}{{Jenvironment}}
      file: path=/data/source/{{sourcepath}}
      {{Jenvironment}} state=directory

    • name: copy {{warpath}}/ingresstemplet.yaml to {{sourcepath}}{{Jenvironment}}
      copy: src={{warpath}}/ingresstemplet.yaml dest=/data/source/{{sourcepath}}{{Jenvironment}}/

    • name: copy {{warpath}}/{{sourcepath}}.yaml to {{sourcepath}}{{Jenvironment}}
      copy: src={{warpath}}/{{sourcepath}}.yaml dest=/data/source/{{sourcepath}}
      {{Jenvironment}}/

    • name: restart {{sourcepath}}_{{Jenvironment}}
      shell: source /etc/profile && kubectl set image deployment/{{sourcepath}}-{{Jenvironment}}-deployment {{sourcepath}}-{{Jenvironment}}-pod=registry.xxxx.com/{{sourcepath}}-{{Jenvironment}}:master && kubectl rollout history deployment/{{sourcepath}}-{{Jenvironment}}-deployment
      when: checkpod.stdout == "1"

    • name: start {{sourcepath}}{{Jenvironment}}
      shell: cd /data/source/{{sourcepath}}
      {{Jenvironment}}/ && source /etc/profile && kubectl create -f ingress_templet.yaml && kubectl create -f {{sourcepath}}.yaml --record
      when: checkpod.stdout == "0"
      [root@jenkins-master templet]#
      [root@jenkins-master templet]#

#
#
#

模板yaml文件
templet.yaml用來創建pod,service的文件,需要替換裏面的項目名和環境名(#不能出現下劃線)

[root@jenkins-master templet]# cat templet.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: projectname-environment-deployment
spec:
replicas: 2
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: projectname-environment-pod
spec:
terminationGracePeriodSeconds: 60
containers:

  • name: projectname-environment-pod
    image: basic-repository.xxxx.com/xxxx/projectname1-environment:branch
    ports:
    • containerPort: 80
      imagePullSecrets: //harbor鏡像倉庫密碼證書,沒使用harbor可以不寫
  • name: kubesystemsecret

apiVersion: v1
kind: Service
metadata:
name: projectname-environment-service
labels:
app: projectname-environment-service
spec:
type: NodePort
ports:

  • port: 80
    protocol: TCP
    targetPort: 80
    selector:
    app: projectname-environment-pod
    [root@jenkins-master templet]#
    #
    #
    k8s 使用配合Jenkins CICD 方案
    #
    \寫帖子讀代碼內容有偏差以圖片爲主
    #

Ingress文件是相當與nginx一樣的功能

[root@jenkins-master templet]# cat ingress_templet.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: projectname-environment-ingress
namespace: default
spec:
rules:

  • host: environment-projectname.xxxx.com
    http:
    paths:
    • path: /
      backend:
      serviceName: projectname-environment-service
      servicePort: 80

#
#
#
k8s 使用配合Jenkins CICD 方案
#
#
#
k8s 使用配合Jenkins CICD 方案

#
kubectl create -f test.yaml --record

#
#
k8s 使用配合Jenkins CICD 方案

#
kubectl create -f ingress-test.yaml

#

#
k8s 使用配合Jenkins CICD 方案

#
curl -v http://192.168.120.17 -H 'host: dev-platform-business.xxxx.com'

//如果是測試寫上host 192.168.120.17 dev-platform-business.xxxx.com

#
#
#

k8s 使用配合Jenkins CICD 方案

#
#
kubectl rollout history deployment //查看deployment更新記錄歷史
kubectl rollout history deployment/sk-platform-business-dev-deployment

#
#
kubectl set image deployment/sk-platform-business-dev-deployment sk-platform-business-dev-pod=basic-repository.xxxx.com/xxxx/sk_platform_center_dev:master
///更新指定deployment的鏡像,可以通過此命令來更新發版
#
#

k8s 使用配合Jenkins CICD 方案
#
#
kubectl rollout undo deployment/sk-platform-business-dev-deployment --to-revision=1
//undo參數爲回滾命令,所以在創建時--record參數很重要

#
#
//這個步驟在install_docker.yml已經添加此命令,但是Jenkins應該是不會顯示,應該通過ansible命令在最後執行:
ansible 192.168.0.63 -m shell -a '/data/kubernetes/bin/kubectl rollout history deployment/sk-platform-business-dev-deployment'

#
#
k8s 使用配合Jenkins CICD 方案

#
#
命令

create
通過文件名或標準輸入創建資源
expose
將一個資源公開爲一個新的Service
run
在集羣中運行一個特定的鏡像
set
在對象上設置特定的功能
get
顯示一個或多個資源
explain
文檔參考資料。
edit
使用默認的編輯器編輯一個資源。
delete
通過文件名、 標準輸入、 資源名稱或標籤選擇器來刪除資源。
rollout
管理資源的發佈
rolling-update
對給定的複製控制器滾動更新
scale
擴容或縮容Pod數量, Deployment、 ReplicaSet、 RC或Job
autoscale
創建一個自動選擇擴容或縮容並設置Pod數量
certificate
×××資源
cluster-info
顯示集羣信息
top
顯示資源(CPU/Memory/Storage) 使用。 需要Heapster運行
cordon
標記節點不可調度
uncordon
標記節點可調度
drain
維護期間排除節點
taint
命令

describe
顯示特定資源或資源組的詳細信息
logs
在一個Pod中打印一個容器日誌。 如果Pod只有一個容器, 容器名稱是
可選的
attach
附加到一個運行的容器
exec
執行命令到容器
port-forward
轉發一個或多個本地端口到一個pod
proxy
運行一個proxy到Kubernetes API server
cp
拷貝文件或目錄到容器中
auth
檢查授權
apply
通過文件名或標準輸入對資源應用配置
patch
使用補丁修改、 更新資源的字段
replace
通過文件名或標準輸入替換一個資源
convert
不同的API版本之間轉換配置文件
label
更新資源上的標籤
annotate
更新資源上的註釋
completion
用於實現kubectl工具自動補全
api-versions
打印受支持的API版本
config
修改kubeconfig文件(用於訪問API, 比如配置認證信息)
help
所有命令幫助
plugin
運行一個命令行插件
version
打印客戶端和服務版本信息
1、創建
kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80
2、查看
kubectl get deploy
kubectl get pods --show-labels
kubectl get pods -l app=example
kubectl get pods -o wide
3、發佈
kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service
kubectl describe service nginx-service
4、故障排查
kubectl describe TYPE NAME_PREFIX
kubectl logs nginx-xxx
kubectl exec –it nginx-xxx bash
5、 更新
kubectl set image deployment/nginx nginx=nginx:1.13
or
kubectl edit deployment/nginx
資源發佈管理:
kubectl rollout status deployment/nginx
kubectl rollout history deployment/nginx
kubectl rollout history deployment/nginx --revision=3
kubectl scale deployment nginx --replicas=10
6、 回滾
kubectl rollout undo deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=3
7、刪除
kubectl delete deploy/nginx
kubectl delete svc/nginx-service

k8s 使用配合Jenkins CICD 方案

樓鎮圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章