阿里雲Kubernetes實戰2–搭建基礎服務
在系列的第一篇文章中,我已經介紹過如何在阿里雲基於kubeasz搭建K8S叢集,通過在K8S上部署gitlab並暴露至叢集外來演示服務部署與發現的流程。文章寫於4月,忙碌了小半年後,我才有時間把後續部分補齊。系列會分為三篇,本篇將繼續部署基礎設施,如jenkins、harbor、efk等,以便為第三篇專案實戰做好準備。
需要說明的是,阿里雲迭代的實在是太快了,2018年4月的時候,由於SLB不支援HTTP跳轉HTTPS,迫不得已使用了Ingress-Nginx來做跳轉控制。但在4月底的時候,SLB已經在部分地區如華北、國外節點支援HTTP跳轉HTTPS。到了5月更是全節點支援。這樣以來,又簡化了Ingress-Nginx的配置。
一、Jenkins
一般情況下,我們搭建一個Jenkins用於持續整合,那麼所有的Jobs都會在這一個Jenkins上進行build,如果Jobs數量較多,勢必會引起Jenkins資源不足導致各種問題出現。於是,對於專案較多的部門、公司使用Jenkins,需要搭建Jenkins叢集,也就是增加Jenkins Slave來協同工作。
但是增加Jenkins Slave又會引出新的問題,資源不能按需排程。Jobs少的時候資源閒置,而Jobs突然增多仍然會資源不足。我們希望能動態分配Jenkins Slave,即用即拿,用完即毀。這恰好符合K8S中Pod的特性。所以這裡,我們在K8S中搭建一個Jenkins叢集,並且是Jenkins Slave in Pod.
1.1 準備映象
我們需要準備兩個映象,一個是Jenkins Master,一個是Jenkins Slave:
Jenkins Master
可根據實際需求定製Dockerfile
FROM jenkins/jenkins:latest USER root # Set jessie source RUN cecho '' > /etc/apt/sources.list.d/jessie-backports.list \ && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free"> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \ && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list # Update RUN apt-get update && apt-get install -y libltdl7 && apt-get clean # INSTALL KUBECTL RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && \ chmod +x ./kubectl && \ mv ./kubectl /usr/local/bin/kubectl # Set time zone RUN rm -rf /etc/localtime && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo 'Asia/Shanghai' > /etc/timezone # Skip setup wizard、 TimeZone and CSP ENV JAVA_OPTS="-Djenkins.install.runSetupWizard=false -Duser.timezone=Asia/Shanghai -Dhudson.model.DirectoryBrowserSupport.CSP=\"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';\""
Jenkins Salve
一般來說只需要安裝kubelet就可以了
FROM jenkinsci/jnlp-slave USER root # INSTALL KUBECTL RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl && \ chmod +x ./kubectl && \ mv ./kubectl /usr/local/bin/kubectl
生成映象後可以push到自己的映象倉庫中備用
1.2 部署Jenkins Master
為了部署Jenkins、Jenkins Slave和後續的Elastic Search,建議ECS的最小記憶體為8G
在K8S上部署Jenkins的yaml參考如下:
apiVersionv1 kindNamespace metadata namejenkins-ci --- apiVersionv1 kindServiceAccount metadata namejenkins-ci namespacejenkins-ci --- apiVersionrbac.authorization.k8s.io/v1beta1 kindClusterRoleBinding metadata namejenkins-ci roleRef apiGrouprbac.authorization.k8s.io kindClusterRole namecluster-admin subjects kindServiceAccount namejenkins-ci namespacejenkins-ci --- # 設定兩個pv,一個用於作為workspace,一個用於儲存ssh key apiVersionv1 kindPersistentVolume metadata namejenkins-home labels releasejenkins-home namespacejenkins-ci spec # workspace 大小為10G capacity storage10Gi accessModes ReadWriteMany persistentVolumeReclaimPolicyRetain # 使用阿里雲NAS,需要注意,必須先在NAS建立目錄 /jenkins/jenkins-home nfs path/jenkins/jenkins-home serverxxxx.nas.aliyuncs.com --- apiVersionv1 kindPersistentVolume metadata namejenkins-ssh labels releasejenkins-ssh namespacejenkins-ci spec # ssh key 只需要1M空間即可 capacity storage1Mi accessModes ReadWriteMany persistentVolumeReclaimPolicyRetain # 不要忘了在NAS建立目錄 /jenkins/ssh nfs path/jenkins/ssh serverxxxx.nas.aliyuncs.com --- apiVersionv1 kindPersistentVolumeClaim metadata namejenkins-home-claim namespacejenkins-ci spec accessModes ReadWriteMany resources requests storage10Gi selector matchLabels releasejenkins-home --- apiVersionv1 kindPersistentVolumeClaim metadata namejenkins-ssh-claim namespacejenkins-ci spec accessModes ReadWriteMany resources requests storage1Mi selector matchLabels releasejenkins-ssh --- apiVersionextensions/v1beta1 kindDeployment metadata namejenkins namespacejenkins-ci spec replicas1 template metadata labels namejenkins spec serviceAccountjenkins-ci containers namejenkins imagePullPolicyAlways # 使用1.1小結建立的 Jenkins Master 映象 imagexx.xx.xx/jenkins1.0.0 # 資源管理,詳見第二章 resources limits cpu1 memory2Gi requests cpu0.5 memory<