1. 程式人生 > >阿里雲Kubernetes實戰2–搭建基礎服務

阿里雲Kubernetes實戰2–搭建基礎服務

前言:

在系列的第一篇文章中,我已經介紹過如何在阿里雲基於kubeasz搭建K8S叢集,通過在K8S上部署gitlab並暴露至叢集外來演示服務部署與發現的流程。文章寫於4月,忙碌了小半年後,我才有時間把後續部分補齊。系列會分為三篇,本篇將繼續部署基礎設施,如jenkins、harbor、efk等,以便為第三篇專案實戰做好準備。

需要說明的是,阿里雲迭代的實在是太快了,2018年4月的時候,由於SLB不支援HTTP跳轉HTTPS,迫不得已使用了Ingress-Nginx來做跳轉控制。但在4月底的時候,SLB已經在部分地區如華北、國外節點支援HTTP跳轉HTTPS。到了5月更是全節點支援。這樣以來,又簡化了Ingress-Nginx的配置。

1-1.png

一、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參考如下:

apiVersion: v1
kind: Namespace
metadata:
  name: jenkins-ci
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins-ci
  namespace: jenkins-ci
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: jenkins-ci
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: jenkins-ci
  namespace: jenkins-ci
---
# 設定兩個pv,一個用於作為workspace,一個用於儲存ssh key
apiVersion: v1
kind: PersistentVolume
metadata:
    name: jenkins-home
    labels:
      release: jenkins-home
    namespace: jenkins-ci
spec:
    # workspace 大小為10G
    capacity:
      storage: 10Gi
    accessModes:
      - ReadWriteMany
    persistentVolumeReclaimPolicy: Retain
    # 使用阿里雲NAS,需要注意,必須先在NAS建立目錄 /jenkins/jenkins-home
    nfs:
      path: /jenkins/jenkins-home
      server: xxxx.nas.aliyuncs.com
---
apiVersion: v1
kind: PersistentVolume
metadata:
    name: jenkins-ssh
    labels:
      release: jenkins-ssh
    namespace: jenkins-ci
spec:
    # ssh key 只需要1M空間即可
    capacity:
      storage: 1Mi
    accessModes:
      - ReadWriteMany
    persistentVolumeReclaimPolicy: Retain
    # 不要忘了在NAS建立目錄 /jenkins/ssh
    nfs:
      path: /jenkins/ssh
      server: xxxx.nas.aliyuncs.com
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-home-claim
  namespace: jenkins-ci
spec:
  accessModes:
    - ReadWriteMany
  resources:  
    requests:
      storage: 10Gi
  selector:
    matchLabels:
      release: jenkins-home
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jenkins-ssh-claim
  namespace: jenkins-ci
spec:
  accessModes:
    - ReadWriteMany
  resources:  
    requests:
      storage: 1Mi
  selector:
    matchLabels:
      release: jenkins-ssh
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: jenkins
 namespace: jenkins-ci
spec:
 replicas: 1
 template:
  metadata:
   labels:
    name: jenkins
  spec:
   serviceAccount: jenkins-ci
   containers:
   - name: jenkins
     imagePullPolicy: Always
     # 使用1.1小結建立的 Jenkins Master 映象
     image: xx.xx.xx/jenkins:1.0.0
     # 資源管理,詳見第二章
     resources:
      limits:
        cpu: 1
        memory: 2Gi
      requests:
        cpu: 0.5
        memory<