您好,登錄后才能下訂單哦!
這篇文章主要為大家分享Kubernetes和Jenkins的安裝部署以及github的集成。文中還介紹了Kubernetes的組件安裝、Kubernetes自動化部署以及pipeline 腳本的使用,希望大家通過這篇文章能有所收獲。
我們使用的是 AWS 的 EC2 來搭建我們的集群,安裝方式使用 kubeadm 來進行安裝,如果使用二進制安裝,可以參考我相關文檔。
名稱 | 配置 | 內網IP | 外網IP |
---|---|---|---|
k8s-master | 2核4GB | 172.31.20.184 | 54.226.118.74 |
k8s-node1 | 2核4GB | 172.31.27.69 | 52.90.221.230 |
k8s-node2 | 2核4GB | 172.31.30.9 | 3.85.219.119 |
安裝源大家可以參照官方文檔 https://docs.docker.com/install/linux/docker-ce/ubuntu/ ,我這里不再進行演示,如沒有特殊說明,操作將在三臺集群上面都要執行。
apt-get install docker-ce=18.06.3~ce~3-0~ubuntu
systemctl enable docker
安裝源文檔請參考官方文檔 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm ,詳細步驟我這里進行省略。
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
請參考文檔 https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ ,在 master 節點運行。
kubeadm init --kubernetes-version=v1.17.1 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12
在 node 節點上運行添加集群的命令。
kubeadm join 172.31.20.184:6443 --token w3fu9a.rs8eknt079n2e8r8 \
--discovery-token-ca-cert-hash sha256:7392d6f6576b3c9ba5f78d1c54d9a0b1369f77bd498da8104a096b62c6b14c06
以后的 kubectl 都是在 master 節點上進行操作,添加 cni 插件,我們這里選擇 flannel。
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml
到目前為止,我們的集群已經創建完成,參照官方文檔執行,過程很簡單。
root@ip-172-31-20-184:~# kubectl get no
NAME STATUS ROLES AGE VERSION
ip-172-31-20-184 Ready master 21m v1.17.1
ip-172-31-27-69 Ready <none> 16m v1.17.1
ip-172-31-30-9 Ready <none> 16m v1.17.1
整個 CI/CD 過程中我們用到了很多工具,比如 gitlab,jenkins,harbor,在生產環境,建議大家把 gitlab 和 harbor 放在獨立的機器上面,我這里為了簡便,直接放在 k8s 集群中。
請參見官方文檔 https://helm.sh/docs/intro/install/ 。
wget https://get.helm.sh/helm-v3.0.2-linux-amd64.tar.gz
tar xf helm-v3.0.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
chmod +x /usr/local/bin/helm
參見官方文檔 https://docs.gitlab.com/charts/installation/ 。
helm repo add gitlab https://charts.gitlab.io/
后來發現 gitlab 目前還不支持 helm3,那我就選擇了使用 EC2 來進行創建。
https://about.gitlab.com/install/#ubuntu?version=ce
訪問地址:gitlab.wzlinux.com
參見官方文檔 https://github.com/goharbor/harbor-helm/blob/master/README.md
helm repo add harbor https://helm.goharbor.io
helm install my-release harbor/harbor
安裝過程中還是出現了一些問題,是因為沒有 pv,懶得去設置了,后來還是選擇了單機進行安裝,因為 docker 的一些要求,harbor 倉庫配置了 https 證書。
參照下面文檔安裝 https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md 。
訪問地址:https://harbor.wzlinux.com
我們以云原生的方式,將jenkins master,jenkins slave全部部署于kubernetes之上,從而打造一個高可用,彈性伸縮的CI/CD管道。
因為 master 需要持久存儲,我們這里就簡單的選擇 nfs ,我們在 master 節點上進行創建服務。
創建過程請參照文檔 https://blog.csdn.net/qq_37860012/article/details/86717891 。
root@ip-172-31-20-184:/home/nfs# showmount -e 172.31.20.184
Export list for 172.31.20.184:
/home/nfs/jenkins *
master 節點目前授予權限。
chown ubuntu.ubuntu -R /home/nfs/jenkins
前面所需要的東西都已經配置好了,那我們開始安裝 jenkins,請應用我下面的 yaml 文件
kubectl apply -f https://raw.githubusercontent.com/wangzan18/jenkins-cicd/master/master/jenkins.yaml
關于動態創建 jenkins agent,具體使用方法請參照我的博文 https://blog.51cto.com/wzlinux/2467307 。
訪問地址:http://jenkins.wzlinux.com:30814/
首先為 jenkins 安裝 gitlab 插件。
創建一個 jenkins pipeline job,命名為 gitlab-pipeline
,選中 gitlab 觸發器。
記錄生成的數值,然后回到我們的 gitlab project 里面,填寫好 jenkins 的信息。
然后我們提交代碼到倉庫,可以看到 jenkins 被觸發了。
因為 jenkins 在構建的時候,會向 gitlab 拉取代碼,因為我們的 gitlab 是私有倉庫,所以需要為 jenkins 配置權限,同樣的,harbor 倉庫也是私有的,jenkins 在向 harbor 推鏡像的時候,也是需要相應的權限。
切換到 jenkins 憑據界面,創建我們需要的憑據,填寫你 gitlab 的賬戶密碼即可,你也可以單獨為這個倉庫創建一個用戶。
首先為 jenkins 在 harbor 中創建一個用戶 jenkins
,然后登陸用戶創建一個項目gitlab-pipeline
,這里我不再掩飾,然后同意的方式,在 jenkins 為其創建憑據。
最終生成的兩個憑據如下,記錄下各憑據的 ID,我們后面會引用到。
我們前面測試 gitlab 觸發 jenkins 的時候已經創建了一個 job,我們使用 SCM 的方式,我已經把我測試的倉庫同步到 github了,大家查看代碼可以去我的 github 地址:https://github.com/wangzan18/gitlab-jenkins-k8s-pipeline.git
出現一些錯誤,可能是 harbor 倉庫的問題,我單獨去 push 鏡像也是有問題的,目前這個問題我還不知道如何去解決。
那我們就直接測試上傳到阿里云的 docker hub 吧,首先我們去創建一個倉庫。
相關的憑據也需要在 jenkins 里面配置好,我這里不再掩飾,同樣的,job 我們也選擇 SCM 獲取,腳本路徑選擇 Jenkinsfile,然后我們選擇去執行,這時候就沒有錯誤了。
在 Jenkinsfile 中,我們用到的兩個容器,一個是 jenkins agent,用來連接 jenkins server,還有一個 docker,用來 build 鏡像,如果你有其他的需求,可以去找相應的鏡像,在特定的 stage 的時候去應用。
然后我們去阿里云的鏡像倉庫查看一下我們構建好的鏡像。
既然我們已經把鏡像打包構建好,那我們需要把它部署到 k8s 集群中。
我們需要告訴 jenkins ,我們的 k8s 集群在哪里,怎么去請求 api 創建 pod。因為我們為 serviceaccount jenkins 已經配置了 RBAC,所以我們可以為其創建一個 kubeconfig,這里我為了簡單,使用集群管理員的 config,也就是~.kube/config
。
同樣的,我們需要給 jenkins 安裝插件 Kubernetes Continuous Deploy
,然后創建對應的憑據。
記錄下憑據的 ID,稍后我們會在 pipeline 中使用。
在可以執行 kubectl 命令的服務器上面執行。
kubectl create secret docker-registry aliyun-pull-secret --docker-username=wangzan18@126.com \
--docker-password=YOUR_PASSWORD \
--docker-email=wangzan18@126.com \
--docker-server=registry.us-east-1.aliyuncs.com
大家可以查看我 github 倉庫 jenkins 的變化情況。
已經創建我們要部署的 deployment.yaml 文件,都可以在 github 上面看到 https://github.com/wangzan18/gitlab-jenkins-k8s-pipeline.git 。
我們可以看到 jenkins pipeline 都已經更新成功。
然后查看我的頁面是否正常。
那我們把代碼更新一下,然后我們可以看下 k8s 集群 pod 的變化情況。
wangzan:~ $ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
jenkins-5df4dff655-f4gk8 1/1 Running 0 26h
myapp1 1/1 Running 0 47h
web-5bd9f98844-622hn 1/1 Running 0 3m35s
web-5bd9f98844-dppvh 1/1 Running 0 4m30s
web-5bd9f98844-wp7g7 1/1 Running 0 3m58s
jenkins-agent-004xl-vdjjl 0/2 Pending 0 0s
jenkins-agent-004xl-vdjjl 0/2 Pending 0 0s
jenkins-agent-004xl-vdjjl 0/2 ContainerCreating 0 0s
jenkins-agent-004xl-vdjjl 2/2 Running 0 1s
web-559864cbd7-fj66t 0/1 Pending 0 0s
web-559864cbd7-fj66t 0/1 Pending 0 0s
web-559864cbd7-fj66t 0/1 ContainerCreating 0 0s
jenkins-agent-004xl-vdjjl 2/2 Terminating 0 30s
web-559864cbd7-fj66t 0/1 Running 0 3s
web-559864cbd7-fj66t 1/1 Running 0 30s
web-5bd9f98844-622hn 1/1 Terminating 0 4m45s
web-559864cbd7-jssmn 0/1 Pending 0 0s
web-559864cbd7-jssmn 0/1 Pending 0 0s
web-559864cbd7-jssmn 0/1 ContainerCreating 0 0s
web-5bd9f98844-622hn 0/1 Terminating 0 4m46s
jenkins-agent-004xl-vdjjl 0/2 Terminating 0 61s
jenkins-agent-004xl-vdjjl 0/2 Terminating 0 61s
web-559864cbd7-jssmn 0/1 Running 0 2s
jenkins-agent-004xl-vdjjl 0/2 Terminating 0 62s
web-5bd9f98844-622hn 0/1 Terminating 0 4m50s
web-5bd9f98844-622hn 0/1 Terminating 0 4m50s
jenkins-agent-004xl-vdjjl 0/2 Terminating 0 74s
jenkins-agent-004xl-vdjjl 0/2 Terminating 0 74s
web-559864cbd7-jssmn 1/1 Running 0 24s
web-5bd9f98844-wp7g7 1/1 Terminating 0 5m32s
web-559864cbd7-2jl6l 0/1 Pending 0 0s
web-559864cbd7-2jl6l 0/1 Pending 0 0s
web-559864cbd7-2jl6l 0/1 ContainerCreating 0 0s
然后再去查看我的頁面。
也去我們的倉庫看下各個版本的鏡像。
基本上整個 CI/CD 的過程已經比較完善。
最終的 pipeline 腳本如下,對其中語法不理解的,可以使用官網的流水線語法編輯器。
// 鏡像倉庫地址
def registry = "registry.us-east-1.aliyuncs.com"
// 命名空間
def namespace = "wzlinux"
// 鏡像倉庫項目
def project = "gitlab-pipeline"
// 鏡像名稱
def app_name = "citest"
// 鏡像完整名稱
def image_name = "${registry}/${namespace}/${project}:${app_name}-${BUILD_NUMBER}"
// git倉庫地址
def git_address = "http://gitlab.wzlinux.com/root/gitlab-jenkins-k8s-pipeline.git"
// fenzhi分支
def branch = "*/master"
// 認證
def aliyunhub_auth = "2187b285-f62e-437a-b6cf-d4a22c668891"
def gitlab_auth = "cca83969-0fe3-4aa8-9c37-172f19d7338f"
// K8s認證
def k8s_auth = "4fd99c44-2834-4aeb-9403-003ab579ad45"
// aliyun倉庫secret_name
def aliyun_registry_secret = "aliyun-pull-secret"
// k8s部署后暴露的nodePort
def nodePort = "30666"
podTemplate(
label: 'jenkins-agent',
cloud: 'kubernetes',
containers: [
containerTemplate(name: 'jnlp', image: "wangzan18/jenkins-agent:maven-3.6.3"),
containerTemplate(name: 'docker', image: 'docker:19.03.1-dind', ttyEnabled: true, command: 'cat')
],
volumes: [
hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')
]){
node('jenkins-agent'){
stage('拉取代碼') { // for display purposes
checkout([$class: 'GitSCM',branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: "${gitlab_auth}", url: "${git_address}"]]])
}
stage('代碼編譯') {
// sh "mvn clean package -Dmaven.test.skip=true"
sh "ls"
}
stage('構建鏡像') {
container('docker') {
stage('打包鏡像') {
withCredentials([usernamePassword(credentialsId: "${aliyunhub_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
sh """
docker build -t ${image_name} .
docker login -u ${username} -p '${password}' ${registry}
docker push ${image_name}
"""
}
}
}
}
stage('部署到K8s'){
sh """
sed -i 's#\$IMAGE_NAME#${image_name}#' deployment.yaml
sed -i 's#\$SECRET_NAME#${aliyun_registry_secret}#' deployment.yaml
sed -i 's#\$NODE_PORT#${nodePort}#' deployment.yaml
"""
kubernetesDeploy configs: 'deployment.yaml', kubeconfigId: "${k8s_auth}"
}
}
}
post {
failure {
mail to: 'team@example.com',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "Something is wrong with ${env.BUILD_URL}"
}
}
安裝插件GitHub Integration Plugin
。
在 pipeline 的 job里面,我們勾選下面選項:
這里主要也是去監控 github 的提交情況,發現有提交就去構建,相關憑證可以去申請 github access token。
更多相關內容:
以上就是Kubernetes和Jenkins的安裝部署以及github的集成的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。