1/3 总体来说,您对本站的满意程度如何?
非常不满意
非常满意
继续操作即表示,您同意我们根据 Google 的隐私权条款使用您的答案来改进服务,我们不会记录您的任何帐号信息和系统信息。

微信咨询
周一至周五
早上 9 点到晚上 6 点

关注【谷歌云服务】微信公众号

一对一人工客服

定制化解决方案

全方位助力出海

Kubernetes 的 Ingress 是 L7 的控制节点。可以实现对请求的 L7 负载均衡(包括 host 和 UR L)、证书的统一部署等等。是 Kubernetes 中一个重要的组成部分。

其前端接受用户的请求,后端连接 cluster 中的 Service,本身管理 Ingress 的 resource 。其具体的部署模式如下:

在 Google 的 GKE 中,有多种 Ingress 的部署方式,包括:

  1. GCP 上的 Global Load Balancer

  2. GCP 上的 L7 ILB

  3. 传统的 Nginx Ingress

我们讲介绍这三种 Ingress 的具体创建方式。

一 HTTP(S) LB Ingress

在GKE 上创建 Ingress,会自动创建 HTTP(S)的负载均衡。
创建基于 HTTP(S)的负载均衡,在创建了 Service 后,创建 Ingress。

1 创建 GKE cluster

在创建 GKE cluster时,注意 enable http load balancing:

具体的 Gcloud 命令如下:

gcloud beta container --project "central-xxxx" clusters create "ingress" --zone "us-central1-a" --no-enable-basic-auth --cluster-version "1.12.8-gke.10" --machine-type "n1-standard-1" --image-type "UBUNTU" --disk-type "pd-standard" --disk-size "20" --metadata disable-legacy-endpoints=true --scopes "https://www.googleapis.com/auth/cloud-platform" --num-nodes "2" --enable-stackdriver-kubernetes --enable-ip-alias --network "projects/central-xxxx/global/networks/default" --subnetwork "projects/central-xxxx/regions/us-central1/subnetworks/default" --default-max-pods-per-node "110" --enable-autoscaling --min-nodes "2" --max-nodes "5" --addons HorizontalPodAutoscaling,HttpLoadBalancing --enable-autoupgrade --enable-autorepair

其中具体的参数可以根据实际情况调整。

在 Gcloud 命令中连接创建好的 GKE cluster:

gcloud container clusters get-credentials ingress --zone us-central1-a --project central-segment-217003

2 部署 hell-app 应用

创建 deployment 的 yaml 文件:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  labels:    run: hello-app  name: hello-appspec:  replicas: 2  selector:    matchLabels:      run: hello-app  template:    metadata:      labels:        run: hello-app    spec:      containers:      - image: gcr.io/google-samples/hello-app:1.0        imagePullPolicy: IfNotPresent        name: hello-app        ports:        - containerPort: 8080          protocol: TCP        resources: {}

3 部署 hello-app 的service

创建下面的 yaml 文件:

apiVersion: v1kind: Servicemetadata:  labels:    run: hello-app  name: hello-appspec:  ports:  - port: 8080    protocol: TCP    targetPort: 8080  selector:    run: hello-app  sessionAffinity: None  type: NodePortstatus:  loadBalancer: {}

4 创建基于 GLB HTTP的Ingress

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: glb-ingress-resource  annotations:    kubernetes.io/ingress.class: gcespec:  rules:  - http:      paths:      - path: /hello        backend:          serviceName: hello-app          servicePort: 8080

5  创建基于 GLB HTTPs的Ingress

A 创建证书
请参考:https://www.cnblogs.com/hengwei/p/11411505.html

B 通过证书生成 Secret
有了私钥 nginx.key 和证书 nginx.crt 后,由此私钥和证书生成Kubernetes的Secret:

kubectl create secret tls nginx --key nginx.key --cert nginx.crt

C 通过 Yaml 文件创建 Secret

cat <<EOF > secret.yaml> apiVersion: v1> kind: Secret> data:>   tls.crt: $(cat nginx.crt | base64)>   tls.key: $(cat nginx.key | base64)> metadata:>   name: test-tls>   namespace: default> type: kubernetes.io/tls> EOFkubectl get secretNAME                TYPE                                  DATA   AGEdefault-token-htxvf kubernetes.io/service-account-token   3      24hnginx               kubernetes.io/tls                     2      24htest-tls            kubernetes.io/tls                     2      15s

D 创建 Ingress

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: my-nginx-ingressspec:  rules:  - http:      paths:      - path: /hello        backend:          serviceName: hello-app          servicePort: 8080  tls:  - secretName: nginx

6 验证
Ingress 会自动创建 HTTP(S)的负载均衡:

测试:

二 L7 ILB Ingress

通过 Layer7 的 Internal Load Balancer 创建 Ingress,实现内网地址的 Ingress。

目前 L7 ILB 的 Ingress 还在 Alpha 阶段,本文只介绍其实现的方式。具体 beta 和 GA 的详细情况请查询相关文档。

具体创建的过程如下。

1 创建 Service 的 Yaml 文件:

apiVersion: v1kind: Servicemetadata:  labels:    run: neg-hello-app  name: neg-hello-app  annotations:    cloud.google.com/neg: '{"ingress": true}'spec:  ports:  - port: 8080    protocol: TCP    targetPort: 8080  selector:    run: neg-hello-app  sessionAffinity: None  type: NodePortstatus:  loadBalancer: {}

2 创建 Igress 的 Yaml 文件:

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: l7-ilb-ingress-resource  annotations:    kubernetes.io/ingress.class: "l7-internal-lb"spec:  rules:  - http:      paths:      - path: /hello        backend:          serviceName: neg-hello-app          servicePort: 8080

三 Nginx Ingress On GKE

安装 Helm

为简化安装,在 cluster 中安装 Helm。

curl -o get_helm.sh https://raw.githubusercontent.com/kubernetes/helm/master/scripts/getchmod +x get_helm.sh./get_helm.shkubectl create serviceaccount --namespace kube-system tillerkubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tillerhelm init --service-account tillerhelm init

通过下面命令查看

kubectl get deployments -n kube-system

安装 Nginx ingress

采用 Nginx 的 Ingress 的架构如下:

采用 Helm 安装 Nginx Ingress 相关组件:

helm install --name nginx-ingress stable/nginx-ingress   --set rbac.create=true   --set controller.publishService.enabled=true

查看:

创建了 Nginx-ingress-controller 和 Nginx-ingress-default-backend 两个组件。

此时这个 nginx-ingess 已经可以对外提供http服务:


这个 SVC 创建了一个 NLB:

5 创建 Ingress
创建 Ingress 的 Yaml 文件:

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: ingress-resource  annotations:    kubernetes.io/ingress.class: nginx    nginx.ingress.kubernetes.io/ssl-redirect: "false"spec:  rules:  - http:      paths:      - path: /hello        backend:          serviceName: hello-app          servicePort: 8080

检查:

访问http://$LB_IP/hello

四 总结
GKE 支持多种 Ingress,包括通过 Nginx-Ingress 实现的Ingress,同时 GCP 支持通过 L7 Load Balance r实现的Ingress,这包括 GLB 和 L7 ILB 两种模式。
文章版权归作者所有,未经许可不得转载。