v2.1
v2.0
v1.0
  1. Release Notes
    1. Release Notes - 2.1.1最新
    1. Release Notes - 2.1.0
    1. Release Notes - 2.0.2
    1. Release Notes - 2.0.1
    1. Release Notes - 2.0.0
  1. 产品介绍
    1. 什么是 KubeSphere
    1. 平台功能
    1. 为什么选择 KubeSphere
    1. 架构说明
    1. 应用场景
    1. 名词解释
  1. 安装指南
    1. 安装说明
      1. 概览
      2. 网络防火墙配置
      3. 集群其它参数配置
    1. 在 Linux 快速安装 KubeSphere
      1. All-in-One 模式
      2. Multi-Node 模式
      3. 完整安装(开启所有功能组件)
    1. 在 Kubernetes 安装 KubeSphere
      1. 准备工作
      2. 在 Kubernetes 安装 KubeSphere
    1. 安装可插拔的功能组件
      1. 可插拔功能组件概览
      2. 安装应用商店
      3. 安装内置的 DevOps 系统
      4. 安装内置的日志系统
      5. 安装微服务治理组件(Service Mesh)
      6. 安装告警通知系统
      7. 安装 Metrics-server 开启 HPA
      8. 验证可插拔功能组件的安装
    1. 集群高可用配置安装
      1. 在青云安装 HA 集群
      2. 在华为云安装 HA 集群
      3. 持久化存储配置说明
    1. 相关工具与插件
      1. 安装内置 Grafana
      2. 访问 SonarQube 和 Jenkins 服务端
      3. 安装 Porter 负载均衡器插件
      4. 安装 QingCloud 负载均衡器插件
    1. 认证配置
      1. 接入 LDAP / AD 域账号(Beta)
    1. 集群运维
      1. 安装后添加新的存储类型
      2. 集群节点扩容
      3. 卸载
  1. 升级指南
    1. 升级必读
    1. All-in-One 升级
    1. Multi-node 升级
  1. 快速入门
    1. 入门必读
    1. 1. 多租户管理快速入门
    1. 2. 应用路由与服务示例
    1. 3. 创建 Wordpress 应用并发布至 K8s
    1. 4. 一键部署应用
    1. 5. 创建简单任务
    1. 6. 设置弹性伸缩 (HPA)
    1. 7. Source-to-Image
    1. 8. Binary-to-Image
    1. 9. 基于Spring Boot项目构建流水线
    1. 10. 图形化构建流水线
    1. 11. Bookinfo 微服务的灰度发布
    1. 12. 使用 Ingress-Nginx 进行灰度发布
    1. 13. 应用商店
  1. 管理员指南
    1. 多租户管理
      1. 多租户管理概述
      2. 角色权限概览
    1. 平台管理
      1. 企业空间管理
      2. 账号管理
      3. 平台角色
    1. 基础设施
      1. 服务组件
      2. 主机管理
      3. 存储类型
    1. 监控中心
      1. 监控概述
      2. 如何利用监控定位问题
      3. 集群状态监控
      4. 应用资源监控
      5. 监控策略 - 节点级别
      6. 监控消息 - 节点级别
    1. 平台设置
      1. 应用仓库
      2. 基于本地仓库搭建应用仓库部署Redis
      3. 上传应用到 KubeSphere 官方仓库
      4. 基于 GitHub 搭建自有应用仓库
      5. 邮件服务器
      6. 日志收集
      7. 添加 Fluentd 作为日志接收者
      8. 添加 Kafka 作为日志接收者
    1. 工具箱
      1. Web Kubectl
      2. 日志收集
    1. DevOps 配置
      1. 系统配置修改
      2. 上传镜像至 Harbor
      3. 流水线配置邮件服务器
      4. Jenkins 系统设置
    1. FAQ
      1. DevOps 运维FAQ
  1. 用户指南
    1. 应用
      1. 应用模板
      2. 自制应用
      3. 流量治理
      4. 熔断
    1. 工作负载
      1. 工作负载概述
      2. 部署
      3. 有状态副本集
      4. 守护进程集
      5. 任务
      6. 定时任务
      7. 设置健康检查器
      8. 工作负载管理
      9. 落盘日志收集
    1. 存储
      1. 存储概述
      2. 存储卷
      3. Local Volume 使用方法
    1. 网络与服务
      1. 服务管理
      2. 灰度发布
      3. 应用路由
    1. 监控告警
      1. 告警策略 - 工作负载级别
      2. 告警消息 - 工作负载级别
    1. 配置中心
      1. 密钥
      2. 配置
      3. 镜像仓库
    1. 项目设置
      1. 基本信息
      2. 成员角色
      3. 项目成员
      4. 外网访问
    1. DevOps 工程
      1. DevOps 工程概述
      2. 管理 DevOps 工程
      3. 流水线
      4. 凭证管理
      5. 添加代码仓库
      6. 访问 SonarQube 并创建 Token
      7. 设置自动触发扫描
      8. Jenkins Agent 说明
      9. 流水线常见问题
  1. 开发者指南
    1. Helm 应用开发
      1. 开发模板规范
      2. Helm 应用开发入门
    1. Source to Image(S2I) 自定义模版开发
      1. S2I 原理及流程介绍
      2. 自定义 S2I 模版
  1. API 文档
    1. API 文档
    1. 如何调用 API
    1. API 常用术语对照
    1. 监控指标说明
  1. 常见问题
    1. 安装常见问题
    1. 存储常见问题
    1. 控制台使用常见问题
    1. DevOps 常见问题
  1. 附录
    1. 部署 Ceph 存储服务端
    1. 部署 GlusterFS 存储服务端
    1. 安装 OpenEBS 创建 LocalPV 存储类型
    1. 云平台配置端口转发和防火墙
KubeSphere®️ 2020 All Rights Reserved.

DevOps 运维常见问题

编辑

性能及缓存命中问题

在 Jenkins 的内存空间不足的情况下可能会下列问题:

  1. 流水线页面浏览较慢,部分列表页响应超过10秒
  2. 流水线运行列表页、分支列表页等页面排序顺序不对 …………

问题排查

当您发生这类问题时可以进入到 Jenkins 的 Pod 当中排查 GC 日志(ks-jenkins后面的xxx视环境输入):

$ kubectl exec -n kubesphere-devops-system ks-jenkins-xxxxxx-xxxx -it bash

属于下列命令进入jenkins_home目录您可以看到有 GC Log 相关文件,在下面的文件中 gc-2019-05-11_13-05-37.log.0.current 为 当前的 GC LOG 文件:

$ cd /var/jenkins_home
$ ls
caches						   io.kubesphere.jenkins.devops.auth.KubesphereTokenAuthGlobalConfiguration.xml  queue.xml
casc_configs					   jenkins.CLI.xml								 queue.xml.bak
config.xml					   jenkins.install.InstallUtil.lastExecVersion					 scriptApproval.xml
copy_reference_file.log				   jenkins.model.JenkinsLocationConfiguration.xml				 secret.key
credentials.xml					   jenkins.telemetry.Correlator.xml						 secret.key.not-so-secret
gc-2019-05-11_13-05-37.log.0.current		   jobs										 secrets
hudson.model.UpdateCenter.xml			   logs										 updates
hudson.plugins.git.GitTool.xml			   lost+found									 userContent
hudson.plugins.sonar.SonarGlobalConfiguration.xml  nodeMonitors.xml								 users
hudson.plugins.sonar.SonarRunnerInstallation.xml   nodes									 war
hudson.tasks.Mailer.xml				   org.jenkinsci.plugins.workflow.flow.FlowExecutionList.xml			 workflow-libs
identity.key.enc				   plugins									 workspace
init.groovy.d					   plugins.txt

此时我们可以使用kubectl cp命令取出相关的 Jenkins 的 GC 日志并查看。

对 Jenkins 的内存进行扩容(需要重启 Jenkins 服务)

当您确定 Jenkins 的内存已经不足时,可以通过调整 Jenkins 的 JVM 参数等配置进行扩容。

使用 kubectl edit 编辑 Jenkins 部署

输入下面的命令编辑 Jenkins 配置

$ kubectl edit -n kubesphere-devops-system deployments.apps ks-jenkins

修改文件中的环境变量 JAVA_TOOL_OPTIONS 中的 Xms(最小堆大小) 与 Xmx(最大堆大小), 默认情况下多节点部署的最小堆大小为3g、最大堆大小为6g。

    spec:
      containers:
      - args:
        - --argumentsRealm.passwd.$(ADMIN_USER)=$(ADMIN_PASSWORD)
        - --argumentsRealm.roles.$(ADMIN_USER)=admin
        env:
        - name: JAVA_TOOL_OPTIONS
          value: -Xms3g -Xmx6g -XX:MaxPermSize=512m -XX:MaxRAM=8g -verbose:gc -Xloggc:/var/jenkins_home/gc-%t.log
            -XX:NumberOfGCLogFiles=2 -XX:+UseGCLogFileRotation -XX:GCLogFileSize=100m
            -XX:+PrintGC  -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintHeapAtGC
            -XX:+PrintGCCause -XX:+PrintTenuringDistribution -XX:+PrintReferenceGC
            -XX:+PrintAdaptiveSizePolicy -XX:+UseG1GC -XX:+UseStringDeduplication
            -XX:+ParallelRefProcEnabled -XX:+DisableExplicitGC -XX:+UnlockDiagnosticVMOptions
            -XX:+UnlockExperimentalVMOptions

修改文件中的 limit 避免发生 kubernetes 中的 OOM,requests 与 limits 中的内存大小分别比 Xms 大小和 Xmx 大小略大。

        resources:
          limits:
            cpu: "1"
            memory: 8Gi
          requests:
            cpu: 500m
            memory: 4Gi

注意 修改部署配置将使 Jenkins 重启

修改完成后保存即可完成 Jenkins 的内存扩容。

减少不必要的构建数据

为了尽量减少 Jenkins 的内存消耗,可以使用以下方法来清理不需要的构建、分支等。

为不关联代码仓库的流水线清理数据

在不关联代码仓库的流水线的编辑页面当中,我们可以为流水线配置丢弃旧的构建。

在默认情况下我们推荐设置为保留7天,并最多保留十个具体如下图所示。

丢弃no-scm构建

为关联代码仓库的流水线清理数据

类似于不关联代码仓库的流水线,我们可以为关联代码仓库的流水线配置丢弃旧的分支。

丢弃旧的分支是指丢弃流水线下的某个分支,及这个分支下的所有构建。

我们不推荐在远程代码仓库仍存在分支的情况下丢弃旧的分支,因此我们这里将如下图所示进行设置,这表示当代码仓库中的分支被删除时, Jenkins 当中对应的分支也会删除。

丢弃in-scm分支

避免构建不需要DevOps功能的分支

用户的代码仓库中往往都有各种不同的分支,其中一些分支可能是临时的开发分支,这些分支并不需要运行 DevOps 流水线。

我们可以通过 DevOps流水线的设置来过滤一些不需要的分支,如下图所示。

正则过滤分支

升级 Jenkins Agent 的包版本

在默认的安装中,我们为用户内置了一部分 agent ,具体可以查看内置 agent 信息的相关文档。

用户在自己的使用场景当中,可能会使用不同的语言版本活不同的工具版本。这篇文档主要介绍如何替换内置的 agent。

Kubesphere Jenkins 的每一个 agent 都是一个Pod,如果要替换内置的agent,就需要替换 agent 的相应镜像。

构建最新 nodejs 版本的 agent 镜像

我们 agent 的源代码都在 Github KubeSphere 组织下,其中 nodejs agent 的镜像的源代码仓库地址为 builder-nodejs

可以看到我们现在镜像的 Dockerfile 为:

FROM kubespheredev/builder-base:latest

RUN curl -f --silent --location https://rpm.nodesource.com/setup_9.x | bash - && \
  yum install -y nodejs gcc-c++ make bzip2 GConf2 gtk2 chromedriver chromium xorg-x11-server-Xvfb

RUN npm i -g watch-cli vsce typescript

# Yarn
ENV YARN_VERSION 1.3.2
RUN curl -f -L -o /tmp/yarn.tgz https://github.com/yarnpkg/yarn/releases/download/v${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz && \
	tar xf /tmp/yarn.tgz && \
	mv yarn-v${YARN_VERSION} /opt/yarn && \
	ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn

我们将修改 Dockerfile,将 nodejs 版本调整为10.x,并将 yarn 的版本调整到 1.16.0,则我们的 Dockerfile 如下所示:

FROM kubesphere/builder-base:latest

RUN curl -f --silent --location https://rpm.nodesource.com/setup_10.x | bash - && \      # 安装 10.x 版本 nodejs
  yum install -y nodejs gcc-c++ make bzip2 GConf2 gtk2 chromedriver chromium xorg-x11-server-Xvfb

RUN npm i -g watch-cli vsce typescript

# Yarn
ENV YARN_VERSION 1.16.0  # 安装 1.16.0 版本 的 yarn
RUN curl -f -L -o /tmp/yarn.tgz https://github.com/yarnpkg/yarn/releases/download/v${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz && \
	tar xf /tmp/yarn.tgz && \
	mv yarn-v${YARN_VERSION} /opt/yarn && \
	ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn

当我们完成了 Dockerfile 的编写就可以构建 Docker 镜像并验证镜像是否满足要求:

使用下面的命令构建 Docker 镜像, 其中 -t 后参数为镜像名称,可以根据自己的需要进行调整。

$ docker build -t runzexia/builder-nodejs:advanced-2.1.0-dev .
Step 1/5 : FROM kubesphere/builder-base:latest
 ---> 19d0e8ccd4bb
Step 2/5 : RUN curl -f --silent --location https://rpm.nodesource.com/setup_10.x | bash - &&   yum install -y nodejs gcc-c++ make bzip2 GConf2 gtk2 chromedriver chromium xorg-x11-server-Xvfb

………………

Step 5/5 : RUN curl -f -L -o /tmp/yarn.tgz https://github.com/yarnpkg/yarn/releases/download/v${YARN_VERSION}/yarn-v${YARN_VERSION}.tar.gz &&         tar xf /tmp/yarn.tgz &&         mv yarn-v${YARN_VERSION} /opt/yarn &&         ln -s /opt/yarn/bin/yarn /usr/local/bin/yarn
 ---> Running in 5ce7b5e09e7e
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   609    0   609    0     0    566      0 --:--:--  0:00:01 --:--:--   566
100 1145k  100 1145k    0     0  88823      0  0:00:13  0:00:13 --:--:--  101k
Removing intermediate container 5ce7b5e09e7e
 ---> a4ba9a74fd03
Successfully built a4ba9a74fd03
Successfully tagged runzexia/builder-nodejs:advanced-2.1.0-dev

可以看到我们成功完成了镜像的构建,现在让我们在本地运行容器来查看内置环境的版本是否满足需求:

$ docker run -it runzexia/builder-nodejs:advanced-2.1.0-dev bash

$ node -v
v10.16.0
$ npm -v
6.9.0
$ yarn -v
1.16.0

可以看到 nodejs 版本已经更新为较新的版本了,现在我们将镜像推送到镜像仓库当中。

$ docker push runzexia/builder-nodejs:advanced-2.1.0-dev

修改 Jenkins 配置,并重新加载 Jenkins 系统设置

当我们完成了镜像的推送,就可以通过修改配置来修改 Jenkins 的系统设置。

使用集群管理员账号登陆 KubeSphere 页面,进入 企业空间 -》 system-workspace(企业空间) -》 kubesphere-devops-system(项目) -》 配置中心 -》 配置 -》 jenkins-casc-config -》 更多操作 -》 编辑 ConfigMap 。

我们现在可以修改 Agent 的镜像版本了,修改 {{.jenkins.clouds.templates.nodejs.containers.nodejs.image}}runzexia/builder-nodejs:advanced-2.1.0-dev

jenkins:
  mode: EXCLUSIVE
  numExecutors: 5
  scmCheckoutRetryCount: 2

  clouds:
    - kubernetes:
        name: "kubernetes"
        serverUrl: "https://kubernetes.default"
        skipTlsVerify: true
        namespace: "kubesphere-devops-system"
        credentialsId: "k8s-service-account"
        jenkinsUrl: "http://ks-jenkins.kubesphere-devops-system:80"
        jenkinsTunnel: "ks-jenkins-agent.kubesphere-devops-system:50000"
        containerCapStr: "100"
        connectTimeout: "60"
        readTimeout: "60"
        maxRequestsPerHostStr: "32"
        templates:
          - name: "nodejs"
            namespace: "kubesphere-devops-system"
            label: "nodejs"
            nodeUsageMode: "EXCLUSIVE"
            idleMinutes: 0 # Do not reuse pod.
            containers:
            - name: "nodejs"
              image: "runzexia/builder-nodejs:advanced-2.1.0-dev"  // 修改此处镜像版本
              command: "cat"
              ttyEnabled: true
              envVars:
              - containerEnvVar:
                  key: "DOCKER_HOST"
                  value: "tcp://localhost:2375"
            - name: "jnlp"
              image: "jenkins/jnlp-slave:3.27-1"
              args: "${computer.jnlpmac} ${computer.name}"
              resourceRequestCpu: "100m"
              resourceRequestMemory: "32Mi"
            - name: "docker-server"
              image: "docker:18.06.1-ce-dind"
              ttyEnabled: true
              privileged: true
              args: "--insecure-registry harbor.devops.kubesphere:30280"
              envVars:
              - containerEnvVar:
                  key: "DOCKER_HOST"
                  value: "tcp://localhost:2375"
            workspaceVolume:
              emptyDirWorkspaceVolume:
                memory: false

修改完毕后,我们就可以参考文档 Jenkins 系统设置来重新加载我们的配置了。当重新加载配置完成后,我们的 Agent 版本也就更新成功了。

可以在 Jenkins 系统管理的系统设置中已经更新为我们设置的镜像版本。

镜像版本