安装文档

如何安装 Crane

为了让您更快的部署 Crane ,本文档提供清晰的:

  • 部署环境要求
  • 具体安装步骤

Crane 安装时间在10分钟左右,具体时间也依赖集群规模以及硬件能力。目前安装已经非常成熟,如果您安装中遇到任何问题,可以采取如下几种方式:

  • 请首先检查后文的 F&Q
  • 可以提出一个 Issue,我们会认真对待每一个 Issue

部署环境要求

  • Kubernetes 1.18+
  • Helm 3.1.0

安装流程

安装 Helm

建议参考 Helm 官网安装文档

安装 Prometheus 和 Grafana

使用 Helm 安装 Prometheus 和 Grafana。

如果您已经在环境中部署了 Prometheus 和 Grafana,可以跳过该步骤。

如果你的网络无法访问GitHub资源(GitHub Release, GitHub Raw Content raw.githubusercontent.com)。 那么你可以尝试镜像仓库。但镜像仓库具有一定的时延

Crane 使用 Prometheus 抓取集群工作负载对资源的使用情况。安装 Prometheus:

  1. helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
  2. helm install prometheus -n crane-system \
  3. --set pushgateway.enabled=false \
  4. --set alertmanager.enabled=false \
  5. --set server.persistentVolume.enabled=false \
  6. -f https://raw.githubusercontent.com/gocrane/helm-charts/main/integration/prometheus/override_values.yaml \
  7. --create-namespace prometheus-community/prometheus
  1. helm repo add prometheus-community https://finops-helm.pkg.coding.net/gocrane/prometheus-community
  2. helm install prometheus -n crane-system \
  3. --set pushgateway.enabled=false \
  4. --set alertmanager.enabled=false \
  5. --set server.persistentVolume.enabled=false \
  6. -f https://gitee.com/finops/helm-charts/raw/main/integration/prometheus/override_values.yaml \
  7. --create-namespace prometheus-community/prometheus

Crane 的 Fadvisor 使用 Grafana 展示成本预估。安装 Grafana:

  1. helm repo add grafana https://grafana.github.io/helm-charts
  2. helm install grafana \
  3. -f https://raw.githubusercontent.com/gocrane/helm-charts/main/integration/grafana/override_values.yaml \
  4. -n crane-system \
  5. --create-namespace grafana/grafana
  1. helm repo add grafana https://finops-helm.pkg.coding.net/gocrane/grafana
  2. helm install grafana \
  3. -f https://gitee.com/finops/helm-charts/raw/main/integration/grafana/override_values.yaml \
  4. -n crane-system \
  5. --create-namespace grafana/grafana

安装 Crane 和 Fadvisor

  1. helm repo add crane https://gocrane.github.io/helm-charts
  2. helm install crane -n crane-system --create-namespace crane/crane
  3. helm install fadvisor -n crane-system --create-namespace crane/fadvisor
  1. helm repo add crane https://finops-helm.pkg.coding.net/gocrane/gocrane
  2. helm install crane -n crane-system --create-namespace crane/crane
  3. helm install fadvisor -n crane-system --create-namespace crane/fadvisor

安装 Crane-scheduler(可选)

  1. helm install scheduler -n crane-system --create-namespace crane/scheduler

验证安装是否成功

使用如下命令检查安装的 Deployment 是否正常:

  1. kubectl get deploy -n crane-system

结果类似如下:

  1. NAME READY UP-TO-DATE AVAILABLE AGE
  2. craned 1/1 1 1 31m
  3. fadvisor 1/1 1 1 41m
  4. grafana 1/1 1 1 42m
  5. metric-adapter 1/1 1 1 31m
  6. prometheus-kube-state-metrics 1/1 1 1 43m
  7. prometheus-server 1/1 1 1 43m

可以查看本篇文档获取更多有关 Crane Helm Chart 的信息。

访问 Dashboard

用户可以通过 Dashboard 获取成本信息以及优化建议。

安装文档 - 图1

端口映射

通过端口映射访问 Dashboard:

  1. kubectl -n crane-system port-forward service/craned 9090:9090

NodePort

通过 NodePort 访问 Dashboard:

  1. # Change service type
  2. kubectl patch svc craned -n crane-system -p '{"spec": {"type": "NodePort"}}'
  1. # Get Dashboard link base on your cluster configuration
  2. PORT=$(kubectl get svc -n crane-system craned -o jsonpath='{.spec.ports[?(@.name == "dashboard-service")].nodePort}')
  3. NODE_IP=$(kubectl get node -ojsonpath='{.items[].status.addresses[?(@.type == "InternalIP")].address}')
  4. echo "Dashboard link: http://${NODE_IP}:${PORT}"

LoadBalancer

通过 LoadBalancer 访问 Dashboard:

  1. # Change service type
  2. kubectl patch svc craned -n crane-system -p '{"spec": {"type": "LoadBalancer"}}'
  1. $ kubectl patch svc craned -n crane-system -p '{"spec": {"type": "LoadBalancer"}}'
  2. service/craned patched
  3. $ kubectl get svc -n crane-system craned
  4. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  5. craned LoadBalancer 10.101.123.74 10.200.0.4 443:30908/TCP,8082:32426/TCP,9090:31331/TCP,8080:31072/TCP 57m
  6. # Access dashboard via 10.200.0.4:9090

Ingress

通过 Ingress 访问 Dashboard:

kubernetes/ingress-nginx

如果集群版本小于 1.19,可以创建以下 Ingress:

  1. apiVersion: networking.k8s.io/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: ingress-crane-dashboard
  5. namespace: crane-system
  6. spec:
  7. ingressClassName: nginx
  8. rules:
  9. - host: dashboard.gocrane.io # change to your domain
  10. http:
  11. paths:
  12. - path: /
  13. backend:
  14. serviceName: craned
  15. servicePort: 9090

如果集群版本大于等于 1.19,可以创建以下 Ingress:

  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4. name: ingress-crane-dashboard
  5. namespace: crane-system
  6. spec:
  7. rules:
  8. - host: dashboard.gocrane.io # change to your domain
  9. http:
  10. paths:
  11. - path: /
  12. pathType: Prefix
  13. backend:
  14. service:
  15. name: craned
  16. port:
  17. number: 9090
  18. ingressClassName: nginx

例子:

  1. $ kubectl get svc -n ingress-nginx
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. ingress-nginx-controller LoadBalancer 10.102.235.229 10.200.0.5 80:32568/TCP,443:30144/TCP 91m
  4. ingress-nginx-controller-admission ClusterIP 10.102.49.240 <none> 443/TCP 91m
  5. $ curl -H "Host: dashboard.gocrane.io" 10.200.0.5
  6. <!DOCTYPE html>
  7. <html lang="en">
  8. <head>
  9. <meta charset="UTF-8" />
  10. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  11. <title>Crane Dashboard</title>
  12. ................................................................

Traefik

  1. apiVersion: traefik.containo.us/v1alpha1
  2. kind: IngressRoute
  3. metadata:
  4. name: dashboard-crane-ingress
  5. namespace: crane-system
  6. spec:
  7. entryPoints:
  8. - web
  9. routes:
  10. - kind: Rule
  11. match: Host(`dashboard.gocrane.io`)
  12. services:
  13. - name: craned
  14. port: 9090
  1. $ kubectl get svc -n traefik-v2
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. traefik LoadBalancer 10.107.109.44 10.200.0.6 80:30102/TCP,443:30139/TCP 16m
  4. $ curl -H "Host: dashboard.gocrane.io" 10.200.0.6
  5. <!DOCTYPE html>
  6. <html lang="en">
  7. <head>
  8. <meta charset="UTF-8" />
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  10. <title>Crane Dashboard</title>
  11. ................................................................

自定义安装

通过 YAML 安装 Crane

  1. git clone https://github.com/gocrane/crane.git
  2. CRANE_LATEST_VERSION=$(curl -s https://api.github.com/repos/gocrane/crane/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
  3. git checkout $CRANE_LATEST_VERSION
  4. kubectl apply -f deploy/manifests
  5. kubectl apply -f deploy/craned
  6. kubectl apply -f deploy/metric-adapter
  1. git clone https://e.coding.net/finops/gocrane/crane.git
  2. CRANE_LATEST_VERSION=$(curl -s https://api.github.com/repos/gocrane/crane/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
  3. git checkout $CRANE_LATEST_VERSION
  4. kubectl apply -f deploy/manifests
  5. kubectl apply -f deploy/craned
  6. kubectl apply -f deploy/metric-adapter

如果您想自定义 Crane 里配置 Prometheus 的 HTTP 地址,请参考以下的命令。如果您在集群里已存在一个 Prometheus,请将 Server 地址填于CUSTOMIZE_PROMETHEUS

  1. export CUSTOMIZE_PROMETHEUS=
  2. if [ $CUSTOMIZE_PROMETHEUS ]; then sed -i '' "s/http:\/\/prometheus-server.crane-system.svc.cluster.local:8080/${CUSTOMIZE_PROMETHEUS}/" deploy/craned/deployment.yaml ; fi

安装常见问题

安装 Crane 报错

当您执行 helm install crane -n crane-system --create-namespace crane/crane 命令时,可能会遇到如下错误:

  1. Error: rendered manifests contain a resource that already exists. Unable to continue with install: APIService "v1beta1.custom.metrics.k8s.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata; label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "crane"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "crane-system"

原因:集群安装过 custom metric 的 APIService,所以报错。可以把之前的删除再重新执行安装 Crane 的命令,删除方式:kubectl delete apiservice v1beta1.custom.metrics.k8s.io

获取 Crane URL 的其它方式

NodePort 方式

您可以将 Crane 的 Service 的类型换成 NodePort 类型,这样可以直接通过集群任意节点 IP + 该服务里dashboard- service 端口号的方式,打开控制台。

具体操作:修改 crane-system 命名空间下名为 craned 的 Service,将其访问方式该为 NodePort 的方式,然后获取某一集群的节点 IP,以及相应的端口号,端口号如下所示:

安装文档 - 图2

注意:若您的集群节点只有内网 IP,则访问该 IP 的计算机需要在同一内网。若集群节点拥有外网 IP,则没有相关问题。

LoadBalance 方式

若您使用的是公有云厂商的服务,您可以将 Crane 的 Service 的类型换成公网 LB 类型,这样可以直接通过 LB IP + 9090 端口号的方式,打开控制台。

具体操作:修改 crane-system 命名空间下名为 craned 的 Service,将其访问方式该为公网 LB 的方式。