Forest-L

  • K零S
  • 2021年3月10日
  • 注册于 2019年11月4日
  • 17 次助人
  • 19 👍
  • 介绍

    KubeEdge 原版的云端组件,在边缘节点加入后,需要手动配置 iptables 等选项,才能正常使用 kubectl logs/metrics/exec,使用步骤较繁琐。

    为了 KubeEdge 和 KubeSphere 能更好地集成, KubeSphere 边缘计算团队开发了 EdgeWatcher/IPTables-Operator 等组件,实现了边缘节点加入后自动配置 iptables 以支持边缘节点的 kubectl logs 日志、kubectl top 实时监控和 kubectl exec 工作负载命令行。

    同时 KubeSphere 边缘计算团队对边缘节点安装程序 keadm 进行了定制,增加了更多命令行选项,实现单条命令加入集群。

    云端 CloudCore 安装

    云端配置如下:
    软件版本:KubeSphere v3.0.0
    云端节点:192.168.10.7 192.168.10.8 192.168.10.9
    云端公网IP: 222.222.222.222 (示例,cloudcore会针对这个IP签发证书)

    (1) 下载 helm 安装包并解压

    wget https://kubeedge.pek3b.qingstor.com/helm/v1.5.0/kubeedge.tar
    tar xvf kubeedge.tar

    (2) 修改 Values.yaml 配置,设置公网IP和端口,节点内网 NodePort 地址和端口,不冲突情况下,端口使用默认值,只需要修改两个IP地址即可。各 deployment 的 nodeselector 和 toleration 依据集群节点酌情设置。iptablesAgent 需要设置为可以调度到 master 节点。所有 cloudcore 相关工作负载均不要调度到边缘节点。

    # Default values for kubeedge.
    # This is a YAML-formatted file.
    # Declare variables to be passed into your templates.
    appVersion: "0.1.0"
    
    cloudCore:
      repository: "kubespheredev/cloudcore"
      tag: "v1.5.0"
      pullPolicy: "IfNotPresent"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-role.kubernetes.io/edge
                operator: DoesNotExist
      tolerations: []
      cloudhubPort: "10000" #cloudhub https协议外网端口
      cloudhubQuicPort: "10001" #cloudhub Quic协议外网端口
      cloudhubHttpsPort: "10002" #cloudhub边缘节点首次连接凭token获取证书外网端口
      cloudstreamPort: "10003" #cloudstream外网端口(用于k8s-apiserver,metrics server连接)
      tunnelPort: "10004" #tunnel外网端口(用于边缘节点建立log/exec/metrics等需要的edgestream连接)
      cloudHub:
        advertiseAddress:
          - 222.222.222.222 #外网IP
        nodeLimit: "100" #最大边缘节点个数
        websocket:
          enable: true
        quic:
          enable: false
          maxIncomingStreams: "10000"
        https:
          enable: true
      cloudStream:
        enable: true
      service:
        cloudhubNodePort: "30000" #cloudhub https协议NodePort端口
        cloudhubQuicNodePort: "30001" #cloudhub Quic协议NodePort端口
        cloudhubHttpsNodePort: "30002" #cloudhub边缘节点首次连接凭token获取证书NodePort端口
        cloudstreamNodePort: "30003" #cloudstreamNodePort端口
        tunnelNodePort: "30004" #tunnelNodePort端口
    
    edgeWatcher:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: node-role.kubernetes.io/edge
                operator: DoesNotExist
      tolerations: []
      controllerManager:
        repository: "kubespheredev/edge-watcher"
        tag: "v0.1.0"
        pullPolicy: "IfNotPresent"
      kubeRBACProxy:
        repository: "kubesphere/kube-rbac-proxy"
        tag: "v0.5.0"
        pullPolicy: "IfNotPresent"
      edgeWatcherAgent:
        repository: "kubespheredev/edge-watcher-agent"
        tag: "v0.1.0"
        pullPolicy: "IfNotPresent"
        affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: node-role.kubernetes.io/edge
                  operator: DoesNotExist
        tolerations:
        - effect: NoSchedule
          key: node-role.kubernetes.io/master
        - key: CriticalAddonsOnly
          operator: Exists
      edgeNode:
        labels:
          - name: "node-role.kubernetes.io/edge"
            value: ""
      iptablesRules:
        source:
          metricsPort: "10250"
          logPort: "10350"
        destination:
          address: "192.168.10.7" #选择一个节点内网地址

    (3) 创建 kubeedge namespace,并安装 kubeedge

    kubectl create ns kubeedge
    #在 kubeedge 的 helm 包文件夹的同级目录下执行
    helm install kubeedge kubeedge --version 0.1.0 --namespace kubeedge

    (4) 读取连接 token

    kubectl get secret -nkubeedge tokensecret -o=jsonpath='{.data.tokendata}' | base64 -d

    (5) 在云控制台,设置公网端口映射和防火墙

    内网 IP内网端口外网端口
    192.168.10.73100010000
    192.168.10.73100110001
    192.168.10.73100210002
    192.168.10.73100310003
    192.168.10.73100410004

    防火墙允许 10000 - 10004 端口

    (6) 更新 metrics-server 以适配 KubeEdge v1.5.0

    helm delete -n kube-system metrics-server
    kubectl apply -f https://kubeedge.pek3b.qingstor.com/metrics-server.yaml

    边缘节点加入集群

    边缘节点配置需求:安装 docker 19.3.0 以上版本

    (1) 下载定制的 Keadm

    #下载对应平台的keadm
    arch=$(uname -m) && curl -O https://kubeedge.pek3b.qingstor.com/bin/v1.5.0/$arch/edgecore && chmod +x edgecore

    (2) 加入集群
    节点名称为 edgenode-1,虚拟 IP 为 192.168.100.1,该虚拟 IP 为 kubectl logs/metrics/exec 使用,选择不与云端节点和边缘节点自身 IP 地址段冲突的 IP 地址段即可。token 使用云端第 (4) 步读取到的。

    ./keadm join --kubeedge-version=1.5.0 --cloudcore-ipport=222.222.222.222:10000 --certport 10012 --quicport 10001 --tunnelport 10004 --edgenode-name edgenode-1 --edgenode-ip 192.168.100.1 --token <f2a2d523970930dd7f2652aa6bdfce2a41655da1a9d6eb5a3fdc2b31f4e48692.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDYyNzA4MTd9.47yokq3G70np0sQYORjOHtYISZoNLoomVAys1JBrSOA>

    备注:当前版本可能第一次运行在校验下载包时会失败,忽略直接再次运行命令即可

    节点加入后,等待约1到2分钟,云端的 edge-watcher 和 iptables-operator 组件会自动检测到边缘节点的加入,并配置好 iptables 项,可以使用 kubectl logs/top/exec 来操作边缘节点的实时日志、监控和命令行。

    (3) 加入集群后,为边缘节点设置 taint

    kubectl taint nodes edgenode-1 node.kubeedge.io=edge:NoSchedule

    边缘节点退出集群

    如需将边缘节点退出云端集群

    ./keadm reset
    apt remove mosquitto
    rm -rf /var/lib/kubeedge /var/lib/edged /etc/kubeedge/ca /etc/kubeedge/certs

    备注:如果删除不掉tmpfs挂载文件夹,可以重启节点或者umount之后再删除。

    云端 CloudCore 卸载

    在云端执行

    kubectl delete iptables -n kubeedge iptables
    helm delete kubeedge -n kubeedge
    kubectl delete -f kubeedge/crds
    kubectl delete ns kubeedge

    如果卸载时误操作先删除了 iptables-operator-controller-manager 导致 finalizer 无法执行卡住删除 crd 流程,执行下面命令

    kubectl patch crd/iptables.kubeedge.kubesphere.io -p '{"metadata":{"finalizers":[]}}' --type=merge
    • EKS-D

      EKS-D 是AWS 开源的 Kubernetes 发行版,与很多 kubernetes 安装工具类似,其集成了 kubernetes 集群所需的核心组件以及网络、存储、容器运行时等服务,从而支持一键部署可用 kubernetes 集群。

      如需了解更多,可查看:
      https://aws.amazon.com/cn/eks/eks-distro
      https://aws.amazon.com/cn/blogs/opensource/introducing-amazon-eks-distro
      https://github.com/aws/eks-distro

      KubeSphere 纳管 EKS-D 集群

      由于 EKS-D 还未在 github 上发布正式版本,但 snap 已提供了 EKS-D 的安装,当然也可以自行build。本文使用ubuntu18.04部署集群。

      1.使用 EKS-D 启动 kubernetes 集群

      # 安装 eks
      sudo snap install eks --classic --edge
      
      # 启动 EKS-D 集群
      eks start       # 若报无法找到 eks 命令,可将 /snap/bin 加入环境变量 export PATH=$PATH:/snap/bin
      
      # 为 kubectl 设置别名(alias)
      alias kubectl='eks kubectl'
      
      # 查看集群节点状态
      kubectl get node -o wide
      
      # NAME         STATUS   ROLES    AGE    VERSION              INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
      # i-02emag0c   Ready    <none>   169m   v1.18.9-eks-1-18-1   192.168.6.3   <none>        Ubuntu 18.04.5 LTS   4.15.0-121-generic   containerd://1.3.7

      2.部署 KubeSphere 管理 EKS-D 集群

      注意:以下为 latest 版本,部署 KubeSphere v3.0.0 方法见文章末尾。

      # 部署 KubeSphere 
      kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/master/deploy/kubesphere-installer.yaml
      kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/master/deploy/cluster-configuration.yaml
      
      # 查看部署日志
      kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

      3.登录 KubeSphere 管理集群

      :部署 KubeSphere v3.0.0 管理 EKS-D

      注意:若已部署 KubeSphere ,请勿重复部署。

      # 部署 KubeSphere v3.0.0
      kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/kubesphere-installer.yaml
      kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.0.0/cluster-configuration.yaml
      
      # 查看部署日志
      kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f
      
      # 部署完成后需执行如下两条命令规避兼容性问题,详情可参考:https://kubesphere.com.cn/forum/d/2217-account-is-not-active
      kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/2c4b479ec65110f7910f913734b3d069409d72a8/roles/ks-core/prepare/files/ks-init/users.iam.kubesphere.io.yaml
      kubectl apply -f https://raw.githubusercontent.com/kubesphere/ks-installer/2c4b479ec65110f7910f913734b3d069409d72a8/roles/ks-core/prepare/files/ks-init/webhook-secret.yaml
      kubectl -n kubesphere-system rollout restart deploy ks-controller-manager
      • 本项目自动化在 AWS 中部署 EKS和 KubeSphere 。有着EKS提供的 Kubernetes 集群环境,更有着通过 KubeSphere 容器平台构建并管理云原生应用程序。 以 us-east-1 创建新的 VPC 脚本为例描述。

        1、文档说明

        2、CloudFormation 脚本细节说明

        • 通常需要输入的参数:Number of Availability Zones(选择几个 Zones)、Availability Zones(根据上步的个数选择具体zone)、Allowed external access CIDR(设置外网 IP 段可访问该EKS集群,默认 0.0.0.0/0)、SSH key name(外网访问时ssh key)、KubeSphereConsolePassword(KubeSphere 控制台登录密码设置)。
        • (可选项参数),需要开启什么服务,将默认 false 改成 true,如 Devops 等。
        • 开始部署时,最好打开堆栈创建选项–>失败时回滚–>已禁用项,此界面在配置堆栈选择界面最下面。
        • 审核 KubeSphere 界面最下面功能处,两个“我确认“都需要勾选。
        • 此CloudFormation脚本总共有4个界面,分别为:先决条件-准备模板、指定堆栈详细信息、配置堆栈选项和审核KubeSphere 四个界面。

        3、安装部署流程

        • 打开上面“Deploy KubeSphere into a new VPC on AWS” 链接,登录自己账号,然后点击下一步。
        • 输入如下参数值:Number of Availability Zones、Availability Zones 、Allowed external access CIDR、SSH key name、KubeSphereConsolePassword,然后点击下一步。
        • 在配置堆栈选项界面最下面,打开堆栈创建选项–>失败时回滚–>已禁用项。然后点击下一步。
        • 在审核 KubeSphere 界面最下面,两个“我确认“都需要勾选。然后点击创建堆栈。

        4、部署过程中遇到问题怎么解决?

        当部署过程报错时,因为在3步骤中失败时回滚已禁用,所以能看到相应的报错日志。

        • 当报错时,点击最左边最上面那个报错堆栈(一定要看最上面那个堆栈报错信息),然后点击事件(Events),就会显示报错原因。
        • 常见问题,包括权限问题,资源受限问题,资源已存在,内部EKS报错等问题,如下截图报错信息。
        • 当在某个区已存在 EKS 集群时,需要在输入参数的”指定堆栈详细界面“中”Per region shared resources“项 默认 Yes 改成 No。
        • 当在某个账号下存在 EKS 集群时,需要在输入参数的“指定堆栈详细界面”中”Per-account shared resources“项默认 Yes改成 No。
        • 当在某个区准备好堡垒机时,需要在输入参数的”指定堆栈详细界面”中“Provision bastion host“项默认 Enable 改成Disabled。
        • 在某个区域删除 CloudFormation 脚本时,可能会发生删除失败情形,需要再点击删除按钮,同时到 IAM 下删除"eks-"打头role。
        • 在某个区域部署时,提前检查该区域下 IAM 下是否有”eks-“打头的role,如果存在,检查该账号下是否有别的EKS集群,如果有,参考”Per-account shared resources“和”Per-account shared resources“设置,否则删除”eks-“打头的role。
        • 在同区部署 CloudFormation 脚本时,一定要把同区之前部署报错的脚本删掉再部署。

        5、报错信息附件

        • 如果堆栈在 EKSControlPlane 步骤报错了,说明是创建 EKS 报错,具体报错信息看 Events 下Status reason原因,比如权限/Role。

        • 资源存在报错

        • 资源不足

      • 前言

          Kubernetes 要在 v1.20 开始弃用 docker 了 ?其实是弃用 kubelet 中集成的 dockershim 模块, 也就是说不再将 docker 作为默认的 container runtime,不过应该还是可以通过外接方式使用docker的。感兴趣的同学可以通过以下链接了解个中缘由。

          https://kubernetes.io/blog/2020/12/02/dockershim-faq
          https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker

          这里先不讨论 docker, 主要记录如何使用除 docker 之外的其它 container runtime 部署 kubernetes 集群。值得注意的是,只有符合 CRI(Container Runtime Interface)标准的 container runtime 才可以对接 kubernetes。

          本文主要介绍如何使用以下三种cri-runtime部署kubernetes集群:

        集群部署

          首先部署container-runtime,containerd、cri-o、isula任选其一,注意集群中所有节点container-runtime应保持一致。

        部署contaner-runtime

        containerd
        # 1.  安装 runc
        curl -OL https://github.com/opencontainers/runc/releases/download/v1.0.0-rc92/runc.amd64
        mv runc.amd64 /usr/local/bin/runc && chmod +x /usr/local/bin/runc
        
        # 2. 安装 containerd
        curl -OL https://github.com/containerd/containerd/releases/download/v1.4.3/containerd-1.4.3-linux-amd64.tar.gz
        tar -zxvf containerd-1.4.3-linux-amd64.tar.gz -C /usr/local
        curl -o /etc/systemd/system/containerd.service https://raw.githubusercontent.com/containerd/cri/master/contrib/systemd-units/containerd.service
        
        # 3. 配置 containerd
        mkdir -p /etc/containerd
        cat > /etc/containerd/config.toml << EOF
        [plugins]
          [plugins."io.containerd.grpc.v1.cri"]
            sandbox_image = "kubesphere/pause:3.2"
            [plugins."io.containerd.grpc.v1.cri".registry]
              [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
                [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
                  endpoint = ["https://registry-1.docker.io"]     ## 这里可替换成dockerhub的镜像加速器
        EOF
        systemctl enable containerd && systemctl restart containerd
        
        # 4. 安装 crictl
        VERSION="v1.19.0"
        curl -OL https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
        sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
        rm -f crictl-$VERSION-linux-amd64.tar.gz
        
        # 5. 配置crictl
        cat > /etc/crictl.yaml << EOF
        runtime-endpoint: unix:///run/containerd/containerd.sock
        image-endpoint: unix:///run/containerd/containerd.sock
        timeout: 2
        debug: false
        pull-image-on-create: false
        EOF

        cri-o

        # 1. 安装cri-o
        yum install git make
        curl -OL https://github.com/cri-o/cri-o/releases/download/v1.18.4/crio-v1.18.4.tar.gz
        tar -zxf crio-v1.18.4.tar.gz
        cd crio-v1.18.4
        mkdir -p /etc/crio /opt/cni/bin /usr/local/share/oci-umount/oci-umount.d /usr/local/lib/systemd/system
        make install
        echo "fs.may_detach_mounts=1" >> /etc/sysctl.conf
        sysctl -p
        # 2. 配置cri-o
        vi /etc/crio/crio.conf 
        # 找到如下参数进行修改
        pause_image = "kubesphere/pause:3.2"
        registries = [
          "docker.io"       ## 这里可替换成dockerhub的镜像加速器
        ]
        # 3. 启动crio
        systemctl enable crio && systemctl restart crio 

        isula (操作系统使用 openEuler 20.09)

        # 1. 安装isula
        yum install iSulad -y
        # 2. 配置isula
        vim /etc/isulad/daemon.json
        # 对如下参数进行修改
        "registry-mirrors": [
            "docker.io"           ## 这里可替换成dockerhub的镜像加速器
         ]
        "pod-sandbox-image": "kubesphere/pause:3.2"
        "network-plugin": "cni"
        "cni-bin-dir": "/opt/cni/bin"
        "cni-conf-dir": "/etc/cni/net.d"
        # 3. 启动isula
        systemctl enable isulad && systemctl restart isulad

        部署kubernetes

          这里使用kubekey来部署kubernetes集群。

        # 1. 下载kubekey
        ## 这里暂时使用kubekey v1.1.0-alpha.1部署kubernetes集群,该版本为预览版,支持多container-runtime也会包含在后续的正式版本中。
        curl -OL https://github.com/kubesphere/kubekey/releases/download/v1.1.0-alpha.1/kubekey-v1.1.0-alpha.1-linux-amd64.tar.gz
        tar -zxvf  kubekey-v1.1.0-alpha.1-linux-amd64.tar.gz
        # 2. 创建配置文件 
        ./kk create config     # 默认在同级目录下生成 config-sample.yaml    
        # 3. 根据真实环境信息修改配置文件
        vi config-sample.yaml  
        
        apiVersion: kubekey.kubesphere.io/v1alpha1
        kind: Cluster
        metadata:
          name: sample
        spec:
          hosts:
          - {name: node1, address: 192.168.6.3, internalAddress: 192.168.6.3, password: xxx}
          - {name: node2, address: 192.168.6.4, internalAddress: 192.168.6.4, password: xxx}
          roleGroups:
            etcd:
            - node1
            master: 
            - node1
            worker:
            - node1
            - node2
          controlPlaneEndpoint:
            domain: lb.kubesphere.local
            address: ""
            port: 6443
          kubernetes:
            version: v1.17.9
            imageRepo: kubesphere
            clusterName: cluster.local
            containerManager: containerd    ## 这里填入之前部署的container-runtime:containerd / crio / isula
          network:
            plugin: calico
            kubePodsCIDR: 10.233.64.0/18
            kubeServiceCIDR: 10.233.0.0/18
          registry:
            registryMirrors: []
            insecureRegistries: []
          addons: []
        
        # 4. 部署集群
        ./kk create cluster -f config-sample.yaml  --with-kubesphere
        
        # 5. 等待集群部署完成

        查看部署结果

          可登录kubesphere控制台查看集群节点所使用的container-runtime

        containerd

        crio

        isula

      • Jeff 谢谢你的回复,这边看kubectl get apiservice | grep metrics 失败状态

        v1beta1.metrics.k8s.io                 kube-system/metrics-server   False (FailedDiscoveryCheck)   22d

        上面我日志中已经有个metrics-server起来但是kube-apiserver还是去试图连接那个丢失节点上的pod 10.244.235.186当我kill kube-apiserver之后他就能正确连接10.244.180.55
        早期使用udp出现过这样的错误,但是使用conntrack -D 清除连接缓存就可以生成新的连接,但是这次即使使用了conntrack -D 还是不行,还是会重新指向错误的podIP 10.244.235.186 感觉有地方记忆了
        https://github.com/kubernetes/kubernetes/issues/59368?from=singlemessage

        metrics-server-8b7689b66-xm6mf            1/1     Running    0          36s     10.244.180.55    master2   <none>           <none>
        metrics-server-8b7689b66-z9hk9            1/1     Unknown    0          3m58s   10.244.235.186  worker1   <none>           <none>
        conntrack -L | grep 10.101.186.48
        tcp      6 278 ESTABLISHED src=10.101.186.48 dst=10.101.186.48 sport=45842 dport=443 src=10.244.235.186 dst=192.168.210.71 sport=443 dport=19158 [ASSURED] mark=0 use=1
        tcp      6 298 ESTABLISHED src=10.101.186.48 dst=10.101.186.48 sport=45820 dport=443 src=10.244.235.186 dst=192.168.210.71 sport=443 dport=15276 [ASSURED] mark=0 use=2

        我试了如下的方法是有效的,修改了内核从net.ipv4.tcp_retries2=15到net.ipv4.tcp_retries2=1,断电的情况下载1min释放之后可以指定到10.244.180.55

        https://blog.csdn.net/gao1738/article/details/42839697

        • Jeff 回复了此帖
        • gfppower

          我在3个节点的集群上,用你的例子,执行挺快的。

          在构建时,去Jenkins 后台看看构建 console 的实时输出,观察一下哪里卡住了。检查一下集群的资源配置是否充足,有没有安全或保护性的限制。

          • 本篇主要介绍如何运维 DevOps 流水线,怎么解决一些常见的问题。问题主要分为两大类,一类是 Kubernetes 相关的,具有一定通用性;另一类是与业务相关,需要对领域有所了解,解决问题时才能事半功倍。文档内容,会不断滚动更新。

            1. Kubernetes 问题排查

            1.1 基本的创建流程

            如上图所示,是用户创建一个 Deployment 的简单流程。主要分为以下步骤:

            1. kubectl 根据用户输入的命令,填充相关字段,将 deployment/pvc 对象发送给 kube-apiserver
            2. kube-apiserver 会有一系列的权限/准入控制,最终将数据序列化存储在 etcd 中
            3. kube-controller-manager 包含大量的控制器,这些控制器会生成 replicaset/pod 对象存储在 etcd 中。pvc 需要绑定到 pv 上,如果没有满足要求的 pv,则通过 Storage Class 动态创建一个 pv 。
            4. kube-sheduler 负责给 pod 选择运行的 node 节点,然后将 NodeName 字段写入 pod 对象中。
            5. kubelet 发现当前 node 节点有待创建的 pod,然后开始调用 CRI 接口去管理 pod 的生命周期。如果有 pvc,还需要将远程磁盘挂载到宿主机目录。

            了解基本的创建流程,有利于排查各种可能的故障。故障可以理解为集群生命周期中的一个状态,而创建是整个生命周期的起点。同时,重置、重启都是非常快速地解决问题的方法,都涉及创建。

            1.2 解决集群故障的思路

            如上图所示,是我的集群故障修复思路。主要分为以下步骤:

            1. kubectl get 检查 node、pod 等资源是否符合预期
            2. kubectl describe 查看 Kubernetes 中的事件信息,包括 kube-sheduler 的调度、拉取镜像、启动是否成功等。通常能解决大部分的问题。
            3. kubectl logs 查看负载的日志。当 pod 处于 running,但是又无法正常提供服务时,logs 信息能够给出有用的提示。有时无法查看 pod 中容器的日志,那么需要去 pod 所在的节点查看 docker 的日志。journal 通过 -u 参数指定服务,通过 -f 查看滚动的最新日志,也十分有用。
            4. 如果上面两种思路还不能解决问题,那么恭喜你,又有机会提高自己了。检查底层服务,也就是检查集群的基础环境,包括磁盘、允许的协议、允许的端口、防火墙、网络等。最终能不能解决,取决于你的积累和检索问题答案的能力。

            1.3 必要的检查项

            这里列举一些必要的检查项,可以辅助排查问题。

            • node 负载

            node 负载过高时,有可能导致节点 NotReady。

            • node 磁盘

            磁盘包括两部分,大小和 inode。

            • swap、firewall

            安装集群时的配置,在重启机器之后,可能会失效。

            • 跨 node 的 pod 通信

            跨节点通信异常时,会导致服务无法访问。

            • node 节点上 kubelet、docker 的状态

            systemctl status kubeletsystemctl status docker 查看组件的状态。

            • 检查 kubelet 、docker 的配置

            ps aux|grep kubeletdocker info 查看相关配置是否符合预期。

            • 查看存储 CSI 存储插件日志

            通常 StorageClass 是通过 CSI 插件提供存储服务的,可以查看相关日志,检查是否有异常输出。

            • 检查 ip 转发功能

            执行命令 cat /proc/sys/net/ipv4/ip_forward ,如果输出 0 则表示未开启。ip 转发允许将一个端口的包转发到另外一个端口。未开启时,会导致网络访问失败,tcpdump 中发送了大量 syn 数据包,但是没有 ack 。

            • 检查 Pod CIDR 与主机网段是否冲突

            可以先查看 Pod 的 ip,检查其与主机、VPC 的 ip 是否有重叠。如果发生冲突,将会导致服务不可访问,提示 No route to host 类似的错误,需要修改 CIDR 。

            2. 安装问题

            如上图所示,是 installer 在执行安装 DevOps 时的依赖关系。DevOps 主要有两个核心组件 S2I 和 Jenkins 。S2I 依赖于 minio 存储文件,Jenkins 依赖于 uc 提供插件下载、依赖 openldap 打通账户体系。

            安装时,比较常见的是 minio 安装失败,导致 DevOps 无法继续安装。而 minio 安装失败通常又是存储和网络导致。

            3. Jenkins 运维问题

            3.1 修改默认配置导致异常

            DevOps 允许用户自定义配置,但 Jenkins /configureSecurity/ 页面中鉴权和 CSRF Protection 不要修改。

            修改上图,红色框中的内容,会导致流水线无法使用。

            3.2 大量多分支流水线占满磁盘空间

            多分支流水线扫描时,会将仓库拉取到 /var/jenkins_home/cache 中,查找 jenkinsfile 文件。

            如果大量实践多分支流水线扫描,请将 Jenkins 的 pv 设置大一些,50 GB 以上。

            3.3 Lightweight 问题导致并发流水线冲突

            具体可以参考文档: Jenkins 中 Lightweight 拉取代码问题分析

            3.4 多节点集群,无法创建流水线

            节点之间通信问题,可以将 ks-controller-manager 和 ks-jenkins 调度到一个节点进行验证。

            如果能够创建成功,那么 Pod 的跨节点通信有问题。

            3.5 流水线并发数量少

            调整 ks-jenkins 的 cpu 和 memory 限制,还有 Xms、Xmx 值。

            具体调整可以参考文档: Kubernetes 动态创建 Jenkins Agent 压力测试

            3.6 流水线部署报错 ended with HasError

            Jenkins 的 Kubernetes Deploy 插件提示可读性不是十分友好,可能的原因有:

            • apiVersion 版本不支持
            • yaml 本身有问题
            • 凭证有问题

            可以在节点上直接执行 kubectl apply 进行验证。怀疑凭证有问题时,可以直接使用 admin 的凭证,进行确认。

            3.7 流水线一直 Pending,Kubernetes 无法创建 Pod

            如果流水线无法执行,并且 kubectl -n kubesphere-devops-system get pod 下没有发现为运行流水线新创建的 Pod,那么很有可能是受限于准入控制。

            kube-apiserver 提供了在创建负载时,修改负载相关信息的能力。比如,Istio 通过 webhook 在创建 Pod 时,向其中注入 Sidecar 进行微服务治理。但如果 Istio 组件发生了异常,那么也会导致 Pod 一直等待注入,从而无法创建 Pod 的现象。

            解决办法是,给运行的命名空间加上豁免注入的标签,比如,kubectl label namespace kubesphere-devops-system istio-injection=disabled

            3.8 变量引用不生效或者流水线引用变量报错

            ${env.<ParameterName>}${params.<ParameterName>}${<ParameterName>} 都可以引用变量,也可以用于 Stage 之间传值。在引用变量时,常见的错误是没区分单双引号。单引号并不替换变量,双引号才会替换变量,这与 Shell 一致。

            另外需要注意,作用域。如果提示 groovy.lang.MissingPropertyException: No such property: ,而你又十分确认定义了这个变量,那么很有可能是作用域的问题。只需要带上 envparams 再试一次就行。

            3.9 图形化编辑时,报错 至少需要一个嵌套步骤

            API 提示报错 instance failed to match at least one schema 。流水线部分,前端页面图形化与后端数据模型是通过 pipeline-model-api 插件相互转换的。具体接口是 /tojson/tojenkinsfile ,前端编辑的是 json ,后端需要的是 jenkinsfile 。

            例如,下面这个示例:

            pipeline {
              agent any
              stages {
                  stage ('Hello') {
                      steps {
                          echo "Hello"
                      }
                  }
              }
            }

            将被转换为如下内容:

            "pipeline":{
              "stages": [
                {
                "branches": [
                  {
                  "name": "default",
                  "steps": [
                    {
                    "arguments": [
                      {
                      "key": "message",
                      "value": {
                        "isLiteral": true,
                        "value": "Hello"
                      }
                      }
                    ],
                    "name": "echo"
                    }
                  ]
                  }
                ],
                "name": "Hello"
                }
              ],
              "agent": {
                "type": "any"
              },
              "parameters": {}
            }

            json 格式的流水线对前端十分友好,scheme 非常简单,极大降低实现图形化编辑的难度。转换失败时,页面会展示错误提示。如果返回错误提示为空,那么页面会展示 当前 Jenkinsfile 不是标准的声明式 Jenkinsfile,无法进行图形化显示

            前端只覆盖了常见的几种情况,提示不是十分准确,例如,当 defaultValue 为空字符串时,提示 至少需要一个嵌套步骤 ,不知所云。最好能够直接参考 /tojson 接口的返回进行处理。

            3.10 构建镜像时,无法访问外部服务,报错 timeout

            在 Jenkinsfile 中执行 docker build 命令时,由于是 Docker in Docker 网络,使用的是 Node 节点上的 Docker Daemon 进行构建。看着是动态创建的 Pod 无法访问外网,其实是 Node 节点无法访问指定外部服务。

            这很有可能是,对网络要求严格的运行环境,禁止了主机访问外网所致。使用 iptables 命令,添加白名单即可。

            3.11 升级时,PVC 报错

            常见的两种报错提示是 The PersistentVolumeClaim "pvc1" is invalid: spec: Forbidden: is immutable after creation except resources.requests for bound claimsError: UPGRADE FAILED: cannot patch "mysql" with kind PersistentVolumeClaim: persistentvolumeclaims "mysql" is forbidden: only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize

            报错原因是 StorageClass 不支持动态扩容,需要保持升级前后 PVC 容量一致。

            在升级之前,可以通过 describe 命令检查 StorageClass 是否支持动态扩容。如果 AllowVolumeExpansion 被设置,则代表支持;否则不支持。

            3.12 安装不兼容的插件之后,Jenkins 无法启动

            处理办法是进入 Jenkins 运行的 Pod,删掉不兼容的插件。

            首先 exec 进入 Pod

            kubectl -n kubesphere-devops-system exec -it ks-jenkins-xxx bash

            然后进入 /var/jenkins_home/plugins 目录,删掉 Jenkins Pod 日志中提到的引发错误的插件。如果你安装了大量的插件,这里有一个技巧是按照日期删除。

            3.13 修改鉴权策略之后,无法登陆

            处理办法是进入 Jenkins 运行的 Pod,将 useSecurity 改为 false,登陆之后改回原来的值。

            useSecurity 在 /var/jenkins_home/config.xml 中进行配置。

            3.14 Jenkins 找不到用户,LDAP 报错

            提示信息类似:

            org.acegisecurity.userdetails.UsernameNotFoundException: User admin not found in directory.
            at hudson.security.LDAPSecurityRealm$LDAPUserDetailsService.loadUserByUsername(LDAPSecurityRealm.java:1314)

            Jenkins 用户来源于 OpenLdap 组件,报错信息的含义是在 OpenLdap 组件中找不到 admin 用户。解决这个问题,需要检查两个地方:OpenLdap 组件是否异常、admin 用户是否在 OpenLdap 中。然后,修复组件,重新创建 admin 用户。

            重建方法从代码 https://github.com/kubesphere/kubesphere/blob/release-3.0/pkg/controller/user/user_controller.go#L537 中可以发现,需要编辑 admin 用户的加密注解。执行命令 kubectl edit users.iam.kubesphere.io admin,删除全部的注解,将 spec 中的 password 修改为明文的形式,默认值 P@88w0rd 即可。

            3.15 流水线创建之后,在页面查看不到

            在 3.0.0 中,采用 CRD 对 DevOps 工程和 Pipeline 进行管理,最终同步到 Jenkins 中。流水线创建之后,在页面无法查看到,是没有完成同步。没有完成同步的可能性很多,ks-controller-manager 中的日志将会帮到你。可能是节点之间的网络通信问题,也有可能是 Jenkins 服务发生了异常,需要根据错误日志排查。

            refer to https://www.chenshaowen.com/blog/the-operation-guide-of-kubesphere-devops-3-0-pipeline.html

          • kubesphere-system ks-account-89cc49745-khclz 0/1 Init:0/2 1 7h43m
            我翻遍了github和论坛,有说dns的问题,也有说是busybox的版本问题。
            最后发现是内网端口6379没开导致的。官网的文档并没有提到这个端口。排查了整整一天。
            我是怎么发现的呢。
            docker ps |grep ks-acc查出wait_redis容器。
            通过下面命令进入容器内部。
            docker exec -it dc7d /bin/sh
            通过ping redis命令发现内ping通的。

            64 bytes from 10.233.30.10: seq=0 ttl=64 time=0.079 ms
            64 bytes from 10.233.30.10: seq=1 ttl=64 time=0.094 ms
            64 bytes from 10.233.30.10: seq=2 ttl=64 time=0.138 ms

            使用top的命令时发现有一个通过域名+6379端口访问redis的进程timeout。
            容器的日志也直致显示是

            wait for redis
            wait for redis
            wait for redis

            才想起没有开放6379这个端口。端口一开放,马上就ks-account就自动启动了。
            特此发帖记录。以助他人。
            附上官方文档的端口开放指南页面
            查询所有pod,下面可以看到ks-account已经正常了。
            kubectl get pod -A

            NAMESPACE                      NAME                                           READY   STATUS             RESTARTS   AGE
            kube-system                    calico-kube-controllers-b5468457c-zhgq5        1/1     Running            3          14h
            kube-system                    calico-node-s8mv6                              1/1     Running            4          14h
            kube-system                    coredns-7f9d8dc6c8-g24jx                       1/1     Running            3          14h
            kube-system                    dns-autoscaler-796f4ddddf-d9xdt                1/1     Running            3          14h
            kube-system                    kube-apiserver-ks-allinone                     1/1     Running            3          14h
            kube-system                    kube-controller-manager-ks-allinone            1/1     Running            7          14h
            kube-system                    kube-proxy-6xd4d                               1/1     Running            3          14h
            kube-system                    kube-scheduler-ks-allinone                     1/1     Running            7          14h
            kube-system                    nodelocaldns-p6n4l                             1/1     Running            3          14h
            kube-system                    openebs-localpv-provisioner-77fbd6858d-gk565   1/1     Running            3          13h
            kube-system                    openebs-ndm-mstwt                              1/1     Running            3          13h
            kube-system                    openebs-ndm-operator-59c75c96fc-8gc5c          1/1     Running            4          13h
            kube-system                    tiller-deploy-79b566b5ff-ww6gz                 1/1     Running            3          14h
            kubesphere-controls-system     default-http-backend-5d464dd566-fkmfj          1/1     Running            3          13h
            kubesphere-controls-system     kubectl-admin-6c664db975-q4zpm                 1/1     Running            3          12h
            kubesphere-monitoring-system   kube-state-metrics-566cdbcb48-8nh2b            4/4     Running            12         13h
            kubesphere-monitoring-system   node-exporter-v8589                            1/2     CrashLoopBackOff   171        13h
            kubesphere-monitoring-system   prometheus-k8s-0                               3/3     Running            10         13h
            kubesphere-monitoring-system   prometheus-k8s-system-0                        3/3     Running            10         13h
            kubesphere-monitoring-system   prometheus-operator-6b97679cfd-7t6jj           1/1     Running            3          13h
            kubesphere-system              ks-account-599cf4dc6b-qtmgf                    1/1     Running            0          29m
            kubesphere-system              ks-apigateway-7c8fbbc997-xmjwz                 1/1     Running            0          29m
            kubesphere-system              ks-apiserver-8578ff675b-ttw78                  1/1     Running            0          29m
            kubesphere-system              ks-console-7c9c5f6764-xsqhs                    1/1     Running            0          29m
            kubesphere-system              ks-controller-manager-6c9845567-5rvcv          1/1     Running            0          29m
            kubesphere-system              ks-installer-7d9fb945c7-5hckd                  1/1     Running            3          13h
            kubesphere-system              openldap-0                                     1/1     Running            3          13h
            kubesphere-system              redis-6fd6c6d6f9-4j58h                         1/1     Running            3          13h
            • 环境准备

              以三台EulerOS 2.5 64bit 为例:

              nameiprole
              node1192.168.179.253etcd, master, worker
              node2192.168.218.146worker
              node3192.168.81.10worker

              确保机器已经安装所需依赖软件(离线环境需要有可用yum源或相关rpm包),以yum为例:

              yum install ebtables socat ipset conntrack docker -y

              确保有可用私有镜像仓库,以docker registry为例(测试用):

              docker run -d -p 5000:5000 --name=registry --restart=always --privileged=true --log-driver=none -v /mnt/registry:/var/lib/registry registry:2.7.1
              
              # 为所有节点配置insecure-registries, /etc/docker/daemon.json
              
              {
                 "insecure-registries": ["192.168.179.253:5000"]
              }
              
              # 重启docker生效
              systemctl restart docker

              获取安装资源

              kk:

              curl -O -k https://kubernetes.pek3b.qingstor.com/tools/kubekey/kk

              下载二进制文件:

              curl -O -k https://kubernetes.pek3b.qingstor.com/tools/kubekey/kubekey.tar.gz

              解压资源包:

              tar -zxvf kubekey.tar.gz

              确保 kk 可执行文件与 kubekey 处于同级目录

              找一台有网的机器,通过镜像列表下载 KubeSphere 2.1.1 + Kubernetes 的镜像:

              注意:以下Kubernetes 的镜像版本默认是 v1.17.9,可以修改镜像 tag v1.17.9 为其它 K8s 版本,如:v1.15.12、v1.16.13。

              openebs_localpv:
                - calico/kube-controllers:v3.15.1
                - calico/node:v3.15.1
                - coredns/coredns:1.6.0
                - kubesphere/k8s-dns-node-cache:1.15.12
                - kubesphere/kube-apiserver:v1.17.9
                - kubesphere/kube-controller-manager:v1.17.9
                - kubesphere/kube-proxy:v1.17.9
                - kubesphere/kube-scheduler:v1.17.9
                - kubesphere/node-disk-manager:0.5.0
                - kubesphere/node-disk-operator:0.5.0
                - kubesphere/provisioner-localpv:1.10.0
              
              ks_minimal_images:
                - kubesphere/ks-console:v2.1.1
                - kubesphere/kubectl:v1.0.0
                - kubesphere/ks-account:v2.1.1
                - kubesphere/ks-devops:flyway-v2.1.0
                - kubesphere/ks-apigateway:v2.1.1
                - kubesphere/ks-apiserver:v2.1.1
                - kubesphere/ks-controller-manager:v2.1.1
                - kubesphere/cloud-controller-manager:v1.4.0
                - kubesphere/ks-installer:v2.1.1
                - quay.azk8s.cn/kubernetes-ingress-controller/nginx-ingress-controller:0.24.1
                - mirrorgooglecontainers/defaultbackend-amd64:1.4
                - gcr.azk8s.cn/google_containers/metrics-server-amd64:v0.3.1
                - kubesphere/configmap-reload:v0.3.0
                - kubesphere/prometheus:v2.5.0
                - kubesphere/prometheus-config-reloader:v0.34.0
                - kubesphere/prometheus-operator:v0.34.0
                - kubesphere/kube-rbac-proxy:v0.4.1
                - kubesphere/kube-state-metrics:v1.7.2
                - kubesphere/node-exporter:ks-v0.16.0
                - kubesphere/addon-resizer:1.8.4
                - kubesphere/k8s-prometheus-adapter-amd64:v0.4.1
                - grafana/grafana:5.2.4
                - redis:5.0.5-alpine
                - haproxy:2.0.4
                - alpine:3.10.4
                - quay.azk8s.cn/coreos/etcd:v3.2.18
                - mysql:8.0.11
                - nginx:1.14-alpine
                - postgres:9.6.8
                - osixia/openldap:1.3.0 
                - minio/minio:RELEASE.2019-08-07T01-59-21Z
                - minio/mc:RELEASE.2019-08-07T23-14-43Z
              
              ks_notification_images:
                - kubesphere/notification:v2.1.0
                - kubesphere/notification:flyway_v2.1.0
                - kubesphere/alerting-dbinit:v2.1.0
                - kubesphere/alerting:v2.1.0
                - kubesphere/alert_adapter:v2.1.0
              
              openpitrix_images:
                - openpitrix/release-app:v0.4.3
                - openpitrix/openpitrix:flyway-v0.4.8
                - openpitrix/openpitrix:v0.4.8
                - openpitrix/runtime-provider-kubernetes:v0.1.3
              
              ks_devops_images:
                - kubesphere/jenkins-uc:v2.1.1
                - jenkins/jenkins:2.176.2
                - jenkins/jnlp-slave:3.27-1
                - kubesphere/builder-base:v2.1.0
                - kubesphere/builder-nodejs:v2.1.0
                - kubesphere/builder-maven:v2.1.0
                - kubesphere/builder-go:v2.1.0
                - sonarqube:7.4-community
                - kubesphere/s2ioperator:v2.1.1
                - kubesphere/s2irun:v2.1.1
                - kubesphere/s2i-binary:v2.1.0
                - kubesphere/tomcat85-java11-centos7:v2.1.0
                - kubesphere/tomcat85-java11-runtime:v2.1.0
                - kubesphere/tomcat85-java8-centos7:v2.1.0
                - kubesphere/tomcat85-java8-runtime:v2.1.0
                - kubesphere/java-11-centos7:v2.1.0
                - kubesphere/java-8-centos7:v2.1.0
                - kubesphere/java-8-runtime:v2.1.0
                - kubesphere/java-11-runtime:v2.1.0
                - kubesphere/nodejs-8-centos7:v2.1.0
                - kubesphere/nodejs-6-centos7:v2.1.0
                - kubesphere/nodejs-4-centos7:v2.1.0
                - kubesphere/python-36-centos7:v2.1.0
                - kubesphere/python-35-centos7:v2.1.0
                - kubesphere/python-34-centos7:v2.1.0
                - kubesphere/python-27-centos7:v2.1.0
              
              ks_logger_images:
                - kubesphere/elasticsearch-curator:v5.7.6
                - kubesphere/elasticsearch-oss:6.7.0-1
                - kubesphere/fluent-bit:v1.3.2-reload
                - docker.elastic.co/kibana/kibana-oss:6.7.0
                - dduportal/bats:0.4.0
                - docker:19.03
                - kubesphere/fluentbit-operator:v0.1.0
                - kubesphere/fluent-bit:v1.3.5-reload
                - kubesphere/configmap-reload:v0.0.1
                - kubesphere/log-sidecar-injector:1.0
              
              istio_images:
                - istio/kubectl:1.3.3
                - istio/proxy_init:1.3.3
                - istio/proxyv2:1.3.3
                - istio/citadel:1.3.3
                - istio/pilot:1.3.3
                - istio/mixer:1.3.3
                - istio/galley:1.3.3
                - istio/sidecar_injector:1.3.3
                - istio/node-agent-k8s:1.3.3
                - jaegertracing/jaeger-operator:1.13.1
                - jaegertracing/jaeger-agent:1.13
                - jaegertracing/jaeger-collector:1.13
                - jaegertracing/jaeger-query:1.13
                - kubesphere/examples-bookinfo-productpage-v1:1.13.0
                - kubesphere/examples-bookinfo-reviews-v1:1.13.0
                - kubesphere/examples-bookinfo-reviews-v2:1.13.0
                - kubesphere/examples-bookinfo-reviews-v3:1.13.0
                - kubesphere/examples-bookinfo-details-v1:1.13.0
                - kubesphere/examples-bookinfo-ratings-v1:1.13.0
              
              example_images:
                - busybox:1.31.1
                - joosthofman/wget:1.0
                - kubesphere/netshoot:v1.0
                - nginxdemos/hello:plain-text
                - wordpress:4.8-apache
                - mirrorgooglecontainers/hpa-example:latest
                - java:openjdk-8-jre-alpine
                - fluent/fluentd:v1.4.2-2.0
                - perl:latest

              将镜像导入离线仓库中

              注意:上传镜像时请保持镜像namespace不变 (可将镜像保存为tar文件,放置于push-images.sh同级目录,使用push-images.sh上传)

              cd images
              ./push-images.sh 192.168.179.253:5000

              集群安装

              创建集群配置文件

              ./kk create config --with-kubesphere v2.1.1

              填写集群配置文件

              apiVersion: kubekey.kubesphere.io/v1alpha1
              kind: Cluster
              metadata:
                name: config-sample
              spec:
                hosts:
                - {name: node1, address: 192.168.179.253, internalAddress: 192.168.179.253, password: Huawei@123}
                - {name: node2, address: 192.168.218.146, internalAddress: 192.168.218.146, password: Huawei@123}
                - {name: node3, address: 192.168.81.10, internalAddress: 192.168.81.10, password: Huawei@123}
                roleGroups:
                  etcd:
                  - node1
                  master: 
                  - node1
                  worker:
                  - node1
                  - node2
                  - node3
                controlPlaneEndpoint:
                  domain: lb.kubesphere.local
                  address: ""
                  port: "6443"
                kubernetes:
                  version: v1.17.6
                  imageRepo: kubesphere
                  clusterName: cluster.local
                network:
                  plugin: calico
                  kube_pods_cidr: 10.233.64.0/18
                  kube_service_cidr: 10.233.0.0/18
                registry:
                  privateRegistry: 192.168.179.253:5000
                  registryMirrors: []
                  insecureRegistries: []
                storage:
                  defaultStorageClass: localVolume
                  localVolume:
                    storageClassName: local
              
              ---
              apiVersion: v1
              data:
                ks-config.yaml: |
                  ---
                  local_registry: "192.168.179.253:5000"
              
                  persistence:
                    storageClass: ""
                  etcd:
                    monitoring: False
                    endpointIps: 192.168.0.7,192.168.0.8,192.168.0.9
                    port: 2379
                    tlsEnable: True
                  common:
                    mysqlVolumeSize: 20Gi
                    minioVolumeSize: 20Gi
                    etcdVolumeSize: 20Gi
                    openldapVolumeSize: 2Gi
                    redisVolumSize: 2Gi
                  metrics_server:
                    enabled: False
                  console:
                    enableMultiLogin: False  # enable/disable multi login
                    port: 30880
                  monitoring:
                    prometheusReplicas: 1
                    prometheusMemoryRequest: 400Mi
                    prometheusVolumeSize: 20Gi
                    grafana:
                      enabled: False
                  logging:
                    enabled: False
                    elasticsearchMasterReplicas: 1
                    elasticsearchDataReplicas: 1
                    logsidecarReplicas: 2
                    elasticsearchMasterVolumeSize: 4Gi
                    elasticsearchDataVolumeSize: 20Gi
                    logMaxAge: 7
                    elkPrefix: logstash
                    containersLogMountedPath: ""
                    kibana:
                      enabled: False
                  openpitrix:
                    enabled: False
                  devops:
                    enabled: False
                    jenkinsMemoryLim: 2Gi
                    jenkinsMemoryReq: 1500Mi
                    jenkinsVolumeSize: 8Gi
                    jenkinsJavaOpts_Xms: 512m
                    jenkinsJavaOpts_Xmx: 512m
                    jenkinsJavaOpts_MaxRAM: 2g
                    sonarqube:
                      enabled: False
                      postgresqlVolumeSize: 8Gi
                  servicemesh:
                    enabled: False
                  notification:
                    enabled: False
                  alerting:
                    enabled: False
              
              kind: ConfigMap
              metadata:
                name: ks-installer
                namespace: kubesphere-system
                labels:
                  version: v2.1.1

              执行安装

              ./kk create cluster -f config-sample.yaml 

              等待安装完成

            • 1、背景

              基于kubesphere最小化安装,ks默认不开启对etcd的监控,那么对于外部的etcd集群我们如何对接到ks里面来呢。
              这篇文档接我上一篇排查apiserver监控的文章,最好先过目下:https://kubesphere.com.cn/forum/d/1374-kube-apisrever-kubesphere

              2、对接方法

              首先,老规矩查看prometheus server的配置,看看默认对于etcd是怎样监控的,容器中查看配置:

              可以看到,还是使用的endpoints的方式来自动发现并监控的,并且是https的方式,这里的证书配置都写死了。好吧,写死了不要紧,你得看看这个证书配置是怎么挂载到容器里面的,直接在ks控制台查看prometheus-k8s-system服务的配置文件:

              OK,我们这个证书的目录竟然来自于一个secret,吱吱,原来如此,那就一查到底:

              明白了吧,也就是说,这个secret是必须要存在的,到这里就清楚了吧,如何加上etcd监控,利用etcd的证书创建个secret就行:

              但是同志,这样还是不行的,我的是最小化安装也就是说我之前部署ks的yaml文件是没有开启etcd监控的,我记得配置默认关于etcd是这样的:

              这里的ip我估计是你如果采用ks来部署etcd,默认给你的etcd三个service ip,这里是写死的(我猜的,不知道对不对),然后我们改成如下的配置:

              三个ip替换成你自己的etcd集群IP,另外修改monitoring: True即可,好了到这里就完事了,我们修改一下ks-install的配置就行,k8s会自动帮我们重新部署,在这里修改即可哦:

              耐心等待安装完成后,我们查看集群的监控配置:
              开启了etcd的service monitor:

              看看etcd monitor对应的svc是啥:

              在kube-system里面:

              好了,我们看看界面上的监控效果:

              3、注意

              有些同学可能会问,要是我的外部etcd集群用的是http呢,还需要创建么,需要的,因为这个配置写死了,我们创建一个空的secret就行,其余的操作不变:
              kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs

              4、总结

              如果懂得了prometheus在k8s上的实践原理,自动发现机制,其实没啥难度的,任何看起来高大上的东西都构建在基础知识之上,了解运行机制,就能举一反三。

              • Issue: bind() to 0.0.0.0:80 failed(13: Permission denied)

                NGINX Ingress controller version:0.24.1
                KubeSphere version:2.1.1
                OS: Ubuntu 18.4

                问题情况:
                设置了路由后无法访问,查看路由容器有异常log :bind() to 0.0.0.0:80 failed(13: Permission denied)
                处理方法:
                在 kubesphere-controls-system项目的部署中找到 kubesphere-router-xxxx,编辑配置文件

                containers:
                  - name: ...
                    image: ...
                    securityContext:
                      runAsUser: 0

                这样可以使容器以root用户运行。
                0指root用户的uid。

                参考:
                https://github.com/kubernetes/ingress-nginx/issues/3858
                https://blog.csdn.net/triThirty/article/details/95457368

              • 没有删除干净吧

                helm  delete --purge istio-init 
                helm  delete --purge istio

              商业产品与合作咨询