在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的节点池。
-
- 打开集群编辑画面
-
- 选择”添加节点池”按钮
-
- 在名称中输入load-balancer
-
- 选择微型机器类型(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地址。
引入 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。