Kubernetes 的 Ingress 是 L7 的控制节点。可以实现对请求的 L7 负载均衡(包括 host 和 URL)、证书的统一部署等等。是 Kubernetes 中一个重要的组成部分。
其前端接受用户的请求,后端连接 cluster 中的 Service,本身管理 Ingress 的 resource。其具体的部署模式如下:
在 Google 的 GKE 中,有多种 Ingress 的部署方式,包括:
- GCP 上的 Global Load Balancer
- GCP 上的 L7 ILB
- 传统的 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/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: {}
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: {}
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) 的负载均衡:
测试:
二 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
安装 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/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
检查:
访问 http://$LB_IP/hello
四 总结
GKE 支持多种 Ingress,包括通过 Nginx-Ingress 实现的 Ingress,同时 GCP 支持通过 L7 Load Balancer 实现的 Ingress,这包括 GLB 和 L7 ILB 两种模式。
文章版权归作者所有,未经许可不得转载。
评论