在GKE上尽可能低成本地创建Kubernetes集群,并尝试使用Prometheus + Grafana进行实验 Part2 -Ingress篇-

按照标题所示,在GKE(Google Kubernetes Engine)上创建一个Kubernetes集群,并在其上运行Prometheus和Grafana进行尝试。

由于之前已创建了集群,所以这次将添加Ingress。

通过添加Ingress,可以从互联网访问集群内的服务。

首先

如果您以常规方式在GKE上创建Ingress,Ingress Controller将会创建一个GCP负载均衡器。
然而,这相当昂贵… 每月需支付18美元。

因此,我們使用NGINX的nginx-ingress來替代GCP的負載平衡器。
如果我們在最小的f1-micro節點上運行,只需支付4.28美元。
而且,如果我們在滿足Always Free條件的us-east1、us-west1或us-central1區域運行f1-micro,則可以免費運行。

所以这次我们决定不使用负载均衡器,而是使用nginx-ingress。

前提工作

假设在之前的文章《在GKE上尽可能便宜地创建Kubernetes集群,并尝试使用Prometheus + Grafana Part1 -创建集群-》中,我们已按照步骤创建了一个集群。

由于需要确认连通性,请提供一个域名。
如果您没有域名,我觉得您可以使用nip.io之类的。虽然我并不太了解。

创建Ingress Controller所需的节点。

为了解决先前创建的集群节点是可抢占节点的问题,这些节点会在一段固定时间后被删除。

由于nginx-ingress需要将静态全局IP分配给节点,因此需要单独创建一些不会被删除的节点。

具体而言,我们将创建一个用于运行Ingress Controller的节点池。

    1. 打开集群编辑画面

 

    1. 选择”添加节点池”按钮

 

    1. 在名称中输入load-balancer

 

    1. 选择微型机器类型(f1-micro)

 

    在每个节点的引导磁盘大小中输入10GB

通过Ingress Controller对节点进行配置。

执行下面的命令。


export CLUSTER_NAME=クラスタ名
export ZONE=us-west1-b
export REGION=us-west1
# kubectlを使えるようにする
gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE
# 静的グローバルIPアドレスを確保
gcloud compute addresses create $CLUSTER_NAME-ip --region $REGION
# 静的グローバルIPアドレスを取得
export LB_ADDRESS_IP=$(gcloud compute addresses list | grep $CLUSTER_NAME-ip | awk '{print $3}')
# nginx-ingressで使うノード名を取得
export LB_INSTANCE_NAME=$(kubectl describe nodes | grep Name: | tail -n1 | awk '{print $2}')
# nginx-ingressしか動かないようにする (リソースの確保のため)
kubectl taint nodes $LB_INSTANCE_NAME role=nginx-ingress-controller:NoSchedule
# 静的グローバルIPアドレスをノードに紐付ける
export LB_INSTANCE_NAT=external-nat
gcloud compute instances delete-access-config $LB_INSTANCE_NAME --access-config-name "$LB_INSTANCE_NAT" --zone $ZONE
gcloud compute instances add-access-config $LB_INSTANCE_NAME --access-config-name "$LB_INSTANCE_NAT" --address $LB_ADDRESS_IP --zone $ZONE
# ラベルの設定
kubectl label nodes $LB_INSTANCE_NAME role=load-balancer
# タグの設定 (これで80と443に外部からアクセスできるようになる)
gcloud compute instances add-tags $LB_INSTANCE_NAME --tags http-server,https-server --zone $ZONE

Helm的安装

Helm是Kubernetes的软件包管理器。
由于nginx-ingress也可在Helm中提供,所以在引入nginx-ingress之前,首先要引入Helm。

安装 helm

执行下面的命令。

# ダウンロード先: https://github.com/kubernetes/helm/releases
curl -O https://storage.googleapis.com/kubernetes-helm/helm-v2.8.1-linux-amd64.tar.gz
tar -zxvf helm-v2.8.1-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

将Helm引入到集群中。

运行以下命令。

helm init --service-account tiller
echo "apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
" | kubectl apply -f -

引入nginx-ingress组件

我們將繼續討論以下一個暫時的域名和相關的服務。請根據需要進行適當的替換。
請在A記錄中註冊LB_ADDRESS_IP的IP地址。

ドメインサービス名用途(ドメイン1)nginxサンプルアプリケーション(ドメイン2)prometheus-prometheusPrometheus用 (ドメイン3)grafana-grafanaGrafana用

引入 nginx-ingress

我会在Helm中安装Nginx Ingress。

请将配置设置保存为名为values.yaml的文件,然后安装nginx-ingress。
请执行以下命令。

mkdir nginx-ingress && cd $_
curl -O https://raw.githubusercontent.com/kter/personal-project/1.1/nginx-ingress/values.yaml
helm install stable/nginx-ingress --name nginx-ingress -f values.yaml

创建Ingress的配置

请将Ingress的设置以yaml格式记录下来。
请将其保存为nginx-ingress.yml这个文件名。


apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - secretName: kubernetes-ingress-tls
    hosts:
      - (ドメイン1)
      - (ドメイン2)
      - (ドメイン3)
  rules:
  - host: (ドメイン1)
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx
          servicePort: 80
      - path: /*
        backend:
          serviceName: nginx
          servicePort: 80
  - host: (ドメイン2)
    http:
      paths:
      - path: /
        backend:
          serviceName: prometheus-prometheus-server
          servicePort: 80
      - path: /*
        backend:
          serviceName: prometheus-prometheus-server
          servicePort: 80
  - host: (ドメイン3)
    http:
      paths:
      - path: /
        backend:
          serviceName: grafana-grafana
          servicePort: 80
      - path: /*
        backend:
          serviceName: grafana-grafana
          servicePort: 80

设置的应用

执行以下命令。

kubectl apply -f nginx-ingress.yml

部署示例应用程序

请将下面的YAML保存为nginx-deployment.yml。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 10m

请将下面的yaml保存为nginx-service.yml文件。

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    name: nginx
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
      name: nginx
  type: NodePort
  selector:
    name: nginx

执行以下命令来部署nginx。

kubectl apply -f blog-deployment.yml
kubectl apply -f blog-service.yml

确认通畅

访问(domain1)并显示NGINX页面即为成功。对于其他域名,由于尚未部署,应显示默认后端。

结束

例文:本次我们已经创建了用于访问所创建的集群服务的Ingress。下次计划进行设置,以便可以使用Let’s Encrypt提供的https。

bannerAds