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

其前端接受用户的请求,后端连接 cluster 中的 Service,本身管理 Ingress 的 resource。其具体的部署模式如下:
GKE多种Ingress的实现
在 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:
GKE多种Ingress的实现
具体的 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

GKE多种Ingress的实现

2 部署 hell-app 应用

创建 deployment 的 yaml 文件:

复制代码
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
run: hello-app
name: hello-app
spec:
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: {}

GKE多种Ingress的实现

3 部署 hello-app 的 service

创建下面的 yaml 文件:

复制代码
apiVersion: v1
kind: Service
metadata:
labels:
run: hello-app
name: hello-app
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
run: hello-app
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}

GKE多种Ingress的实现

4 创建基于 GLB HTTP 的 Ingress

复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: glb-ingress-resource
annotations:
kubernetes.io/ingress.class: gce
spec:
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
> EOF
kubectl get secret
NAME TYPE DATA AGE
default-token-htxvf kubernetes.io/service-account-token 3 24h
nginx kubernetes.io/tls 2 24h
test-tls kubernetes.io/tls 2 15s

D 创建 Ingress

复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: my-nginx-ingress
spec:
rules:
- http:
paths:
- path: /hello
backend:
serviceName: hello-app
servicePort: 8080
tls:
- secretName: nginx

6 验证
Ingress 会自动创建 HTTP(S) 的负载均衡:
GKE多种Ingress的实现

测试:
GKE多种Ingress的实现

二 L7 ILB Ingress

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

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

具体创建的过程如下。

1 创建 Service 的 Yaml 文件:

复制代码
apiVersion: v1
kind: Service
metadata:
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: NodePort
status:
loadBalancer: {}

2 创建 Igress 的 Yaml 文件:

复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
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/get
chmod +x get_helm.sh
./get_helm.sh
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
helm init --service-account tiller
helm init

通过下面命令查看

复制代码
kubectl get deployments -n kube-system

GKE多种Ingress的实现

安装 Nginx ingress

采用 Nginx 的 Ingress 的架构如下:
GKE多种Ingress的实现
采用 Helm 安装 Nginx Ingress 相关组件:

复制代码
helm install --name nginx-ingress stable/nginx-ingress \
--set rbac.create=true \
--set controller.publishService.enabled=true

查看:
GKE多种Ingress的实现
创建了 Nginx-ingress-controller 和 Nginx-ingress-default-backend 两个组件。
GKE多种Ingress的实现
此时这个 nginx-ingess 已经可以对外提供 http 服务:

GKE多种Ingress的实现
这个 SVC 创建了一个 NLB:
GKE多种Ingress的实现GKE多种Ingress的实现

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

复制代码
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
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

检查:
GKE多种Ingress的实现
访问 http://$LB_IP/hello
GKE多种Ingress的实现

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

评论

发布