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的配置。

一、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: 1Gi
     # 開放8080埠用於訪問,開放50000埠用於Jenkins Slave和Master的通訊
     ports:
       - containerPort: 8080
       - containerPort: 50000
     readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 40
      periodSeconds: 20
     securityContext:
       privileged: true
     volumeMounts:
         # 對映K8S Node的docker,也就是docker outside docker,這樣就不需要在Jenkins裡面安裝docker
       - mountPath: /var/run/docker.sock
         name: docker-sock
       - mountPath: /usr/bin/docker
         name: docker-bin
       - mountPath: /var/jenkins_home
         name: jenkins-home
       - mountPath: /root/.ssh
         name: jenkins-ssh
   volumes:
     - name: docker-sock
       hostPath:
         path: /var/run/docker.sock
     - name: docker-bin
       hostPath:
         path: /opt/kube/bin/docker
     - name: jenkins-home
       persistentVolumeClaim:
          claimName: jenkins-home-claim
     - name: jenkins-ssh
       persistentVolumeClaim:
          claimName: jenkins-ssh-claim
---
kind: Service
apiVersion: v1
metadata:
  name: jenkins-service
  namespace: jenkins-ci
spec:
  type: NodePort
  selector:
    name: jenkins
  # 將Jenkins Master的50000埠作為NodePort對映到K8S的30001埠
  ports:
  - name: jenkins-agent
    port: 50000
    targetPort: 50000
    nodePort: 30001
  - name: jenkins
    port: 8080
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 name: jenkins-ingress
 namespace: jenkins-ci
 annotations:
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
spec:
  rules:
  # 設定Ingress-Nginx域名和埠
  - host: xxx.xxx.com
    http:
      paths:
      - path: /
        backend:
          serviceName: jenkins-service
          servicePort: 8080

最後附一下SLB的配置

這樣就可以通過域名xxx.xxx.com訪問Jenkins,並且可以通過xxx.xxx.com:50000來連結叢集外的Slave。當然,叢集內的Slave直接通過serviceName-namespace:50000訪問就可以了

1.3 配置Jenkins Slave

以管理員進入Jenkins,安裝”Kubernetes”外掛,然後進入系統設定介面,”Add a new cloud” – “Kubernetes”,配置如下:

  • Test Connection 測試看連線是否成功
  • Images – Add Pod Template – Kubernetes Pod Template
  • 注意設定Name為”jnlp-agent”,其他按需填寫,設定完成後進入Advanced
  • 根據需要設定資源管理,也就是說限制Jenkins Slave in Pod所佔用的CPU和記憶體,詳見第二章
  • 設定Volume,同樣採用docker outside docker,將K8S Node的docker為Jenkins Slave Pod所用;設定Jenkins Slave的工作目錄為NAS
  • 設定最多允許多少個Jenkins Slave Pod 同時執行,然後進入Advanced
  • 填寫Service Account,與部署Jenkins Master的yaml檔案中的Service Account保持一致;如果你的Jenkins Slave Image是私有映象,還需要設定ImagePullSecrets
  • Apply並完成

1.4 測試驗證

我們可以寫一個FreeStyle Project的測試Job:

測試執行:

可以看到名為”jnlp-agent-xxxxx”的Jenkins Salve被建立,Job build完成後又消失,即為正確完成配置。

二、K8S資源管理

在第一章中,先後提到兩次資源管理,一次是Jenkins Master的yaml,一次是Kubernetes Pod Template給Jenkins Slave 配置。Resource的控制是K8S的基礎配置之一。但一般來說,用到最多的就是以下四個:

  • Request CPU:意為某Node剩餘CPU大於Request CPU,才會將Pod建立到該Node上
  • Limit CPU:意為該Pod最多能使用的CPU為Limit CPU
  • Request Memory:意為某Node剩餘記憶體大於Request Memory,才會將Pod建立到該Node上
  • Limit Memory:意為該Pod最多能使用的記憶體為Limit Memory

比如在我這個專案中,Gitlab至少需要配置Request Memory為3G,對於Elastic Search的Request Memory也至少為2.5 G.

其他服務需要根據K8S Dashboard中的監控外掛結合長時間執行後給出一個合理的Resource控制範圍。

三、Harbor

在K8S中跑CI,大致流程是Jenkins將Gitlab程式碼打包成Image,Push到Docker Registry中,隨後Jenkins通過yaml檔案部署應用,Pod的Image從Docker Registry中Pull.也就是說到目前為止,我們還缺一個Docker Registry才能準備好所有CI需要的基礎軟體。

利用阿里雲的映象倉庫或者Docker HUB可以節省硬體成本,但考慮資料安全、傳輸效率和操作易用性,還是希望自建一個Docker Registry. 可選的方案並不多,官方提供的輕量簡潔,vmware的功能更豐富。

Harbor提供了一個介面友好的UI,支援映象同步,這對於DevOps尤為重要。Harbor官方提供了Helm方式在K8S中部署。但我考慮Harbor佔用的資源較多,從節省硬體成本來說,把Harbor放到了K8S Master上(Master節點不會被排程用於部署Pod,所以大部分空間資源沒有被利用)。當然這不是一個最好的方案,但它是最適合我們目前業務場景的方案。

在Master節點使用docker compose部署Harbor的步驟如下:

  • 192.168.0.1安裝docker-compose
    pip install docker-compose
  • 192.168.0.1 data目錄掛載NAS路徑(harbor的volume預設對映到宿主機的/data目錄,所以我們把宿主機的/data目錄掛載為NAS即可實現用NAS作為harbor的volume)
    mkdir /data
    mount -t nfs -o vers=4.0 xxx.xxx.com:/harbor /data
    • 根據需要下載指定版本的 Harbor offline installer
    • 解壓後配置harbor.cfg
      # 域名
      hostname = xx.xx.com
      # 協議,這裡可以使用http可以免去配置ssl_cert,通過SLB暴露至叢集外再加上ssh即可
      ui_url_protocol = http
      # 郵箱配置
      email_identity = rfc2595
      email_server =  xx
      email_server_port = xx
      email_username = xx
      email_password = xx
      email_from = xx
      email_ssl = xx
      email_insecure = xx
      # admin賬號預設密碼
      harbor_admin_password = xx
    • 修改docker-compose.yaml中的埠對映,這裡將容器埠對映到宿主機的23280埠
      proxy:
          image: vmware/nginx-photon:v1.5.0
          container_name: nginx
          restart: always
          volumes:
            - ./common/config/nginx:/etc/nginx:z
          networks:
            - harbor
          ports:
           - 23280:80
           #- 443:443
           #- 4443:4443
          depends_on:
            - mysql
            - registry
            - ui
            - log
          logging:
            driver: "syslog"
            options:
              syslog-address: "tcp://127.0.0.1:1514"
              tag: "proxy"
    • 執行install.sh
  • 修改 kubeasz的 roles/docker/files/daemon.json加入”insecure-registries”節點,如下所示
    {
      "registry-mirrors": ["https://kuamavit.mirror.aliyuncs.com", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn"], 
      "insecure-registries": ["192.168.0.1:23280"],
      "max-concurrent-downloads": 10,
      "log-driver": "json-file",
      "log-level": "warn",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }

    重新安裝kubeasz的docker

    ansible-playbook 03.docker.yml

    這樣在叢集內的任何一個節點就可以通過http協議192.168.0.1:23280 訪問harbor

  • 開機啟動
    vi /etc/rc.local
    # 加入如下內容
    # mount -t nfs -o vers=4.0 xxxx.com:/harbor /data
    # cd /etc/ansible/heygears/harbor
    # sudo docker-compose up -d
    chmod +x /etc/rc.local
  • 設定Secret(K8S部署應用時使用Secret拉取映象,詳見系列教程第三篇)在K8S叢集任意一臺機器使用命令
    kubectl create secret docker-registry regcred --docker-server=192.168.0.1:23280 --docker-username=xxx --docker-password=xxx --docker-email=xxx
  • 設定SLB(如果僅在內網使用,不設定SLB和DNS也可以)
  • 登陸Harbor管理頁面
  • 在叢集內通過docker login 192.168.0.1:23280驗證Harbor是否建立成功

四、EFK

最後我們來給叢集加上日誌系統。

專案中常用的日誌系統多數是Elastic家族的ELK,外加Redis或者Kafka作為緩衝佇列。由於Logstash需要執行在java環境下,且佔用空間大,配置相對複雜,隨著Elastic家族的產品逐漸豐富,Logstash開始慢慢偏向日誌解析、過濾、格式化等方面,所以並不太適合在容器環境下的日誌收集。K8S官方給出的方案是EFK,其中F指的是Fluentd,一個用Ruby寫的輕量級日誌收集工具。對比Logstash來說,支援的外掛少一些。

容器日誌的收集方式不外乎以下四種:

  • 容器外收集。將宿主機的目錄掛載為容器的日誌目錄,然後在宿主機上收集。
  • 容器內收集。在容器內執行一個後臺日誌收集服務。
  • 單獨執行日誌容器。單獨執行一個容器提供共享日誌卷,在日誌容器中收集日誌。
  • 網路收集。容器內應用將日誌直接傳送到日誌中心,比如java程式可以使用log4j2轉換日誌格式併發送到遠端。
  • 通過修改docker的–log-driver。可以利用不同的driver把日誌輸出到不同地方,將log-driver設定為syslog、fluentd、splunk等日誌收集服務,然後傳送到遠端。

docker預設的driver是json-driver,容器輸出到控制檯的日誌,都會以 *-json.log 的命名方式儲存在 /var/lib/docker/containers/ 目錄下。所以EFK的日誌策略就是在每個Node部署一個Fluentd,讀取/var/lib/docker/containers/ 目錄下的所有日誌,傳輸到ES中。這樣做有兩個弊端,一方面不是所有的服務都會把log輸出到控制檯;另一方面不是所有的容器都需要收集日誌。我們更想定製化的去實現一個輕量級的日誌收集。所以綜合各個方案,還是採取了網上推薦的以FileBeat作為日誌收集的“EFK”架構方案。

FileBeat用Golang編寫,輸出為二進位制檔案,不存在依賴。佔用空間極小,吞吐率高。但它的功能相對單一,僅僅用來做日誌收集。所以對於有需要的業務場景,可以用FileBeat收集日誌,Logstash格式解析,ES儲存,Kibana展示。

使用FileBeat收集容器日誌的業務邏輯如下:

也就是說我們利用K8S的Pod的臨時目錄{}來實現Container的資料共享,舉個例子:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 2
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - image:  #appImage 
        name: app
        volumeMounts:
        - name: log-volume
          mountPath: /var/log/app/  #app log path
      - image:  #filebeatImage
        name: filebeat
        args: [
          "-c", "/etc/filebeat.yml"
        ]
        securityContext:
          runAsUser: 0
        volumeMounts:
        - name: config
          mountPath: /etc/filebeat.yml
          readOnly: true
          subPath: filebeat.yml
        - name: log-volume
          mountPath: /var/log/container/
      volumes:
      - name: config
        configMap:
          defaultMode: 0600
          name: filebeat-config
      - name: log-volume 
        emptyDir: {} #利用{}實現資料互動
      imagePullSecrets:
      - name: regcred
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: filebeat-config
  namespace: test
  labels:
    app: filebeat
data:
  filebeat.yml: |-
    filebeat.inputs:
    - type: log
      enabled: true
      paths:
        - /var/log/container/*.log #FileBeat讀取log的源
    output.elasticsearch:
      hosts: ["xx.xx.xx:9200"]
    tags: ["test"] #log tag

實現這種FileBeat作為日誌收集的“EFK”系統,只需要在K8S叢集中搭建好ES和Kibana即可,FileBeat是隨著應用一起建立,無需提前部署。搭建ES和Kibana的方式可參考K8S官方文件,我也進行了一個簡單整合:

ES:

# RBAC authn and authz
apiVersion: v1
kind: ServiceAccount
metadata:
  name: elasticsearch-logging
  namespace: kube-system
  labels:
    k8s-app: elasticsearch-logging
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: elasticsearch-logging
  labels:
    k8s-app: elasticsearch-logging
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
  - ""
  resources:
  - "services"
  - "namespaces"
  - "endpoints"
  verbs:
  - "get"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: kube-system
  name: elasticsearch-logging
  labels:
    k8s-app: elasticsearch-logging
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
  name: elasticsearch-logging
  namespace: kube-system
  apiGroup: ""
roleRef:
  kind: ClusterRole
  name: elasticsearch-logging
  apiGroup: ""
---
apiVersion: v1
kind: PersistentVolume
metadata:
    name: es-pv-0
    labels:
      release: es-pv
    namespace: kube-system
spec:
    capacity:
      storage: 20Gi
    accessModes:
      - ReadWriteMany
    volumeMode: Filesystem

            
           

相關推薦

阿里Kubernetes實戰2

您目前處於: 前言: 在系列的第一篇文章中,我已經介紹過如何在阿里雲基於kubeasz搭建K8S叢集,通過在K8S上部署gitlab並暴露至叢集外來演示服務部署與發現的流程。文章寫於4月,忙碌了小半年後,我才有時間把後續部分補齊。系列會分為三篇,本篇將繼續部署基礎設施,如j

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

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

阿里Kubernetes實戰1

前言: 考慮到公司持續整合與docker容器技術實施已有一段時間,取得了不錯的效果,但對於裝置運維、系統隔離、裝置利用率和擴充套件性還有待提升,綜合目前比較成熟的微服務技術,打算把現有業務遷移到K8S叢集。 由於公司所有業務均部署在阿里雲上,最開始就調研了阿里雲自己提供的Kubernetes叢

阿里Kubernetes實戰3

前言: 在上一篇文章中,我們已經在K8S叢集部署了Jenkins、Harbor和EFK。作為本系列最後一篇文章,將通過實際案例串聯所有的基礎軟體服務,基於K8S做DevOps。 整體的業務流程如下圖所示: 一、一機多Jenkins Slave 由於業務需要,我們的自動化測試需要基於windo

阿里Kubernetes實戰1–叢集搭建與服務暴露

前言: 考慮到公司持續整合與docker容器技術實施已有一段時間,取得了不錯的效果,但對於裝置運維、系統隔離、裝置利用率和擴充套件性還有待提升,綜合目前比較成熟的微服務技術,打算把現有業務遷移到K8S叢集。 由於公司所有業務均部署在阿里雲上,最開始就調研了阿里雲自己提供的Kubernetes叢集,但後來還

Kubernetes實戰[2]: 服務發現機制與Cluster DNS的安裝(無CA認證版)

服務發現機制與Cluster DNS的安 服務發現機制Kubernetes提供了兩種發現Service的方法: 1.環境變量 當Pod運行的時候,Kubernetes會將之前存在的Service的信息通過環境變量寫到Pod中。 這種方法要求Pod必須要在Service之後啟動。

阿里Kubernetes上使用ENI進行分散式機器學習訓練

概述 模型訓練是機器學習最主要的實踐場景,尤其以使用機器學習框架TensorFlow進行模型訓練最為流行,但是隨著機器學習的平臺由單機變成叢集,這個問題變得複雜了。利用KubeFlow社群的自定義資源TFJob/MPIJob/MxNetJob可以在Kubernetes叢集方便的執行其不同的分散式訓練框架,解

阿里環境實戰搭建CDN內容分發

1、建立CDN CNAME 指向CDN雲廠商地址  2、使用域名轉向到CDN雲廠商地址   請求過來 通過cnd 分發到不同的伺服器  如果有快取的話 直接走了 CDN也可以實現安全功能,比如CDN實現防止DDOS,DNS負載均衡,實現web安全防禦功能,比如黑名單和

阿里php-7.2.12 安裝

安裝依賴 yum -y install libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel mysql pcre-devel      

centos 7 yum 設定 阿里 kubernetes

cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x

阿里ChatOps實戰

課程介紹: ChatOps 的理念由 DevOps 延伸而來,又結合 AI(人工智慧)落地,可以說是人工智慧和新型工作理念結合的產物。它也是一種新型智慧工作方式,幫助團隊利用 ChatBot 機器人使成員和各項輔助工具連線在一起,以溝通驅動的方式完成工作,同時解決人與人

阿里 Debian 9.2 安裝 Java Web 環境

本來是用 CentOS 的,結果源裡的 Tomcat 有 bug 阿里雲相關配置 建立金鑰對,網路和安全 -> 金鑰對 -> 建立金鑰對,按提示建立即可 更換例項系統盤,換成 CentOS 7.4 64 位,設定使用金鑰登入而非密碼 ECS 例項放行 Tomcat 的 8080

阿里 Centos 7.2 環境配置 LNMP

首先更新系統軟體 $ yum update   安裝nginx 1.安裝nginx源 $ yum localinstall http://nginx.org/packages/centos/7/noarch/RPMS/n

阿里部署redis3.2.100叢集注意事項redis cluster

由於安裝時忘記截圖,只有文字描述了 三臺雲伺服器 兩臺windows 一臺linux 6個redis服務 3主3從 在安全組要開放埠:如6379,伺服器中也要將埠暴露出來 叢集對外的總端 埠+10000,如16379也要開放出來 bind的設定 bind 0.0.0

5分鐘在阿里Kubernetes服務上搭建jenkins環境並完成應用構建到部署的流水線作業

本文主要演示如何在阿里雲Kubernetes服務上快速搭建jenkins持續整合環境,並基於提供的示例應用快速完成應用原始碼編譯、映象構建和推送以及應用部署的流水線。 先決條件:阿里雲Kubernetes叢集。 一 快速開始 1. 部署jenkins 容器服務-Kubernetes -> 市場

阿里 Centos 7.2開啟ftp服務用到埠

記錄1 https://www.jianshu.com/p/bf772ffc0c95 阿里雲CentOS7搭建任何網路服務,需要配置相應的安全組規則。 開啟阿里雲端口許可權 阿里雲伺服器埠許可權是由安全組規則控制,所以配置FTP服務,需要開啟伺服器的20/21埠許可權。 由於需要F

阿里ECS CentOS 2.6版本核心升級至3.10

當前有部分應用對系統核心版本有一定的要求,比如Docker要求核心版本在3.10以上,雲伺服器中提供的Centos 7以下的阿里雲官方公共映象是2.6以下。雖然更換系統到Centos 7可以滿足要求,但是更換系統後對業務環境重新部署會消耗一定時間和人力成本,因此可以考慮針

再次升級!阿里Kubernetes日誌解決方案

背景針對K8S日誌採集存在的採集目標多、彈性伸縮難、運維成本大、侵入性高、採集效能低等問題,在18年2月份日誌服務和容器服務團隊一起釋出了阿里雲Kubernetes日誌解決方案。1分鐘內即可完成整個叢集部署,實現該節點上宿主機日誌、容器日誌、容器stdout等所有資料來源的一

阿里Centos 7.2 安裝apache踩的坑

./configure --prefix=/usr/local/apache2 Centos安裝 Apache2.4提示 APR not found的解決辦法: 1.下載所需軟體包: 具體步驟如下: 1、:解決apr not foun

阿里Kubernetes Service Mesh實踐進行時(1): Istio初體驗

摘要: 本篇文章是系列中的第一篇,主要講述利用阿里雲Kubernetes容器服務,快速搭建一套用於連線、管理以及安全化微服務的開放平臺Istio,為應用引入和配置多個相關服務。 概述 Istio是一個用於連線/管理以及安全化微服務的開放平臺,提供了一種簡單的方式用於建