操作场景
本节以nginx为例,说明kubectl命令实现ingress访问的方法。
前提条件
请参见通过kubectl操作CCE集群配置kubectl命令,使弹性云主机连接集群。
创建Ingress-对接已有ELB
步骤 1 登录已配置好kubectl命令的弹性云主机。
步骤 2 创建ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml以及ingress-test-secret.yaml文件。
ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml、ingress-test-secret.yaml为自定义名称,您可以随意命名。
说明:
- 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见11.3 创建密钥。
- 同一个ELB实例的同一个端口配置HTTPS时,选择的证书需要是一样的。
vi ingress-test-deployment.yaml
apiVersion: apps/v1** **
kind: Deployment** **
metadata:** **
name: ingress-test-deployment** **
spec:** **
replicas: 1** **
selector:** **
matchLabels:** **
app: ingress-test-deployment** **
strategy:** **
type: RollingUpdate** **
template:** **
metadata:** **
labels:** **
app: ingress-test-deployment** **
spec:** **
containers:** **
#第三方公开镜像,可以参见描述获取地址,也可以使用自己的镜像
** - image: nginx** ****
imagePullPolicy: Always** **
name: nginx** **
imagePullSecrets:** **
- name: default-secret
vi ingress-test-svc.yaml
apiVersion: v1kind: Servicemetadata:labels:app: ingress-test-svc** **
name: ingress-test-svc** **
spec:ports:
-
name: service0port: 8888** **
protocol: TCPtargetPort: 8888 #若需要设置多个端口,可依次填写,如下展示
-
name: service1
port: 8081
protocol: TCP
targetPort: 8081** **
selector:
app: ingress-test-deployment** **
type: NodePort
表 关键参数说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
port | 是 | Integer | 集群虚拟IP的访问端口,取值范围为1 ~ 65535。 |
protocol | 是 | String | 该端口的IP协议,支持“TCP”和“UDP”。 |
targetPort | 是 | String | 对应界面上的容器端口,应用程序实际监听的端口,取值范围为1 ~ 65535。 |
type | 是 | String | 采用Nodeport的访问类型连接负载均衡,NodePort表示“节点私有IP”。 |
vi ingress-test-ingress.yaml
- 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
- 1.13及以下集群版本中的apiVersion为: extensions/v1beta1
apiVersion: networking.k8s.io/v1beta1** **
kind: Ingressmetadata:annotations:kubernetes.io/elb.id:** **f7891f9a-49f2-4ee2-b1ae-f019cd84eb4f
kubernetes.io/elb.ip:** **192.168.0.39
kubernetes.io/elb.subnet-id:** **29a0567e-96f1-4227-91cc-64f54d0b064d
kubernetes.io/elb.port: "80"** **
kubernetes.io/ingress.class: cce** **
kubernetes.io/elb.tls-ciphers-policy: tls-1-2** **
name: ingress-test-ingress** **
spec:** **
tls:** **
-
secretName: ingress-test-secret** **
rules:
-
http:paths:
-
backend:
serviceName: ingress-test-svc** **
servicePort: 8888** **
property:** **
ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO** **
path: "/healthz"** **
host: ingress.com
-
说明:
安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。
表 关键参数说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
kubernetes.io/elb.id | 是 | String | 为共享型负载均衡实例的ID,取值范围:1-100字符。**获取方法:**在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。 |
kubernetes.io/elb.ip | 是 | String | 为共享型负载均衡实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。 |
kubernetes.io/elb.subnet-id | - | String | 为子网的ID,取值范围:1-100字符。l Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填,l Kubernetes v1.11.7-r0以上版本的集群:可不填。 |
kubernetes.io/elb.eip-id | 是 | String | 为弹性公网的ID,取值范围:1-100字符。**获取方法:**在控制台的“服务列表”中,单击“网络 > 弹性公网IP EIP”,单击EIP的名称,在EIP详情页的“基本信息”中找到“ID”字段复制即可。 |
kubernetes.io/elb.enterpriseID | 否 | String | **v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。**ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。取值范围:1-100字符。**获取方法:**登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。 |
kubernetes.io/elb.tls-ciphers-policy | 否 | String | 默认值:“tls-1-2”,为监听器使用的安全策略,仅在HTTPS协议下生效。取值范围:l tls-1-0-inheritl tls-1-0l tls-1-l tls-1-2l tls-1-2-strict各安全策略使用的加密套件列表详细参见表8-13。 |
kubernetes.io/elb.port | 是 | Integer | 界面上的对外端口,为注册到负载均衡服务地址上的端口。取值范围:1-65535。 |
kubernetes.io/ingress.class | 是 | String | 是否开启nginx-ingress插件。l cce:表示不开启nginx-ingress插件,将默认使用共享型负载均衡实例。l nginx:表示开启nginx-ingress插件。通过API接口创建Ingress时必须增加该参数。 |
tls | 否 | Array of strings | HTTPS协议时,需添加此参数。 |
secretName | 否 | String | HTTPS协议时添加,配置为创建的密钥证书名称。 |
serviceName | 是 | String | 为ingress-test-svc.yaml的服务名称。 |
servicePort | 是 | Integer | 为ingress-test-svc.yaml的Port。 |
ingress.beta.kubernetes.io/url-match-mode | 否 | String | 路由匹配策略。默认值:STARTS_WITH(前缀匹配)。取值范围:l EQUAL_TO:精确匹配l STARTS_WITH:前缀匹配l REGEX:正则匹配 |
path | 是 | String | 为路由路径,用户自定义设置。 |
host | 否 | String | 为域名配置,默认为空,域名全匹配。 |
表 tls_ciphers_policy取值说明
安全策略 | 支持的TLS版本类型 | 使用的加密套件列表 |
---|---|---|
tls-1-0-inherit | TLSv1.2 TLSv1.1 TLSv1 | ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA:DHE-DSS-AES128-SHA:CAMELLIA128-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA:ECDHE-RSA-RC4-SHA:RC4-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:CAMELLIA256-SHA:EDH-DSS-DES-CBC3-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA |
tls-1-0 | TLS1v1.2 TLSv1.1 TLSv1 | ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA |
tls1-1 | TLSv1.2 TLSv1.1 | |
tls-1-2 | TLSv1.2 | |
tls-1-2-strict | TLSv1.2 | ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384 |
vi ingress-test-secret.yaml
apiVersion: v1** **
data:** **
tls.crt:** LS0tLS0tCg==
tls.key:** LS0tL0tLS0K
kind: Secret** **
metadata:** **
annotations:** **
description: test for ingressTLS secrets** **
name: ingress-test-secret** **
namespace: default** **
type: IngressTLS
说明:
此处tls.crt和tls.key为示例,请获取真实密钥进行替换。tls.crt和tls.key的值为Base64加密后的内容。
步骤 3 创建工作负载。
kubectl create -f ingress-test-deployment.yaml
回显如下,表明工作负载已创建。
deployment/ingress-test-deployment created
kubectl get po
回显如下,表明工作负载创建成功。
NAME READY STATUS RESTARTS AGE** **
ingress-test-1627801589-r64pk 1/1 Running 0 6s
步骤 4 创建密钥。
kubectl create -f ingress-test-secret.yaml
回显如下,表明密钥已创建。
secret/ingress-test-secret created
kubectl get secrets
回显如下,表明密钥创建成功。
NAME TYPE DATA AGE** **
dash-dashboard Opaque 0 7d** **
dash-dashboard-token-f2nbk kubernetes.io/service-account-token 3 7d** **
default-secret kubernetes.io/dockerconfigjson 1 8d** **
default-token-wfn4l kubernetes.io/service-account-token 3 8d** **
paas.elb cfe/secure-opaque 2 8d** **
ingress-test-secret IngressTLS 2 13s
步骤 5 创建服务。
kubectl create -f ingress-test-svc.yaml
回显如下,表示服务已创建。
service/ingress-test-svc created
kubectl get svc
回显如下,表示服务创建成功。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE** **
ingress-test NodePort 10.247.189.207 8080:30532/TCP 5s
kubernetes ClusterIP 10.247.0.1 443/TCP 3d
kubectl create -f ingress-test-ingress.yaml
回显如下,表示ingress服务已创建。
ingress/ingress-test-ingress created
kubectl get ingress
回显如下,表示ingress服务创建成功,工作负载可访问。
NAME HOSTS ADDRESS PORTS AGE** **
ingress-test * 10.154.76.63 80 10s
步骤 6 在浏览器中输入访问地址http://10.154.76.63/healthz。
其中,10.154.76.63为统一负载均衡实例的IP地址。
图 访问healthz
创建Ingress-自动创建ELB
步骤 1 登录已配置好kubectl命令的弹性云主机。
步骤 2 创建ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml以及ingress-test-secret.yaml文件。
ingress-test-deployment.yaml、ingress-test-svc.yaml、ingress-test-ingress.yaml、ingress-test-secret.yaml为自定义名称,您可以随意命名。
说明:
- 选择HTTPS协议时,才需要创建密钥证书ingress-test-secret.yaml。创建密钥的方法请参见11.3 创建密钥。
- 同一个ELB实例的同一个端口配置HTTPS时,选择的证书需要是一样的。
vi ingress-test-deployment.yaml
apiVersion: apps/v1** **
kind: Deployment** **
metadata:** **
name: ingress-test-deployment** **
spec:** **
replicas: 1** **
selector:** **
matchLabels:** **
app: ingress-test-deployment** **
strategy:** **
type: RollingUpdate** **
template:** **
metadata:** **
labels:** **
app: ingress-test-deployment** **
spec:** **
containers:** **
#第三方公开镜像,可以参见描述获取地址,也可以使用自己的镜像
** - image: nginx** ****
imagePullPolicy: Always** **
name: nginx** **
imagePullSecrets:** **
- name: default-secret
vi ingress-test-svc.yaml
apiVersion: v1kind: Servicemetadata:labels:app: ingress-test-svc** **
name: ingress-test-svc** **
spec:ports:
-
name: service0port: 8888** **
protocol: TCPtargetPort: 8888 #若需要设置多个端口,可依次填写,如下展示
-
name: service1
port: 8081
protocol: TCP
targetPort: 8081** **
selector:
app: ingress-test-deployment** **
type: NodePort
表 关键参数说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
port | 是 | Integer | 集群虚拟IP的访问端口,取值范围为1 ~ 65535。 |
protocol | 是 | String | 该端口的IP协议,支持“TCP”和“UDP”。 |
targetPort | 是 | String | 对应界面上的容器端口,应用程序实际监听的端口,取值范围为1 ~ 65535。 |
type | 是 | String | 采用Nodeport的访问类型连接负载均衡,NodePort表示“节点私有IP”。 |
vi ingress-test-ingress.yaml
- 1.15及以上集群版本中的apiVersion为: networking.k8s.io/v1beta1
- 1.13及以下集群版本中的apiVersion为: extensions/v1beta1
apiVersion: networking.k8s.io/v1beta1** **
kind: Ingressmetadata:annotations:kubernetes.io/elb.subnet-id:** **29a0567e-96f1-4227-91cc-64f54d0b064d
kubernetes.io/elb.enterpriseID:** **f6b9fffc-a9b7-4a50-a25e-364f587abe44
kubernetes.io/elb.autocreate: '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'** **
kubernetes.io/elb.tls-ciphers-policy: tls-1-2** **
kubernetes.io/elb.port: "80"** **
kubernetes.io/ingress.class: cce** **
name: ingress-test-ingress** **
spec:** **
tls:** **
-
secretName: ingress-test-secret** **
rules:
-
http:paths:
-
backend:
serviceName: ingress-test-svc** **
servicePort: 8888** **
property:** **
ingress.beta.kubernetes.io/url-match-mode: EQUAL_TO** **
path: "/healthz"** **
host: ingress.com
-
表 关键参数说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
kubernetes.io/elb.autocreate | 是 | 表8-16 object | 自动创建Ingress关联的ELB**示例:**l 公网自动创建:值为 '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'l 私网自动创建:值为 '{"type":"inner", "name": "A-location-d-test"}' |
表 elb.autocreate字段数据结构说明
参数 | 是否必填 | 参数类型 | 描述 |
---|---|---|---|
name | 否 | String | 自动创建的负载均衡的名称。取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。默认值:cce-lb+ingress.UID |
type | 否 | String | 负载均衡实例网络类型,公网或者私网。l public:公网型负载均衡l inner:私网型负载均衡默认值:inner |
bandwidth_name | 是 | String | 带宽的名称,默认值为:cce-bandwidth-******。取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。 |
bandwidth_chargemode | 是 | String | 带宽付费模式。l bandwidth:按带宽计费l traffic:按流量计费 |
bandwidth_size | 是 | Integer | 带宽大小,请根据Region带宽支持范围设置。 |
bandwidth_sharetype | 是 | String | 带宽类型,标识是否是共享带宽。取值范围:l WHOLE:共享带宽l PER:独享带宽 |
eip_type | 是 | String | 弹性公网IP类型,请参考ELB支持的弹性公网IP类型。 |
available_zone | 是 | Array of strings | 负载均衡所在可用区,必填项。 |
l4_flavor_name | 否 | String | 四层负载均衡实例名称。 |
l7_flavor_name | 是 | String | 七层负载均衡实例名称,必填项。 |
ElbVirSubnetIDs | 否 | Array of strings | 负载均衡后端所在子网,不填默认集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。默认值:集群所在子网 |
vi ingress-test-secret.yaml
apiVersion: v1** **
data:** **
tls.crt:** LS0tLS0tCg==
tls.key:** LS0tL0tLS0K
kind: Secret** **
metadata:** **
annotations:** **
description: test for ingressTLS secrets** **
name: ingress-test-secret** **
namespace: default** **
type: IngressTLS
说明:
此处tls.crt和tls.key为示例,请获取真实密钥进行替换。tls.crt和tls.key的值为Base64加密后的内容。
步骤 3创建工作负载。
kubectl create -f ingress-test-deployment.yaml
回显如下,表明工作负载已创建。
deployment/ingress-test-deployment created
kubectl get po
回显如下,表明工作负载创建成功。
NAME READY STATUS RESTARTS AGE** **
ingress-test-1627801589-r64pk 1/1 Running 0 6s
步骤 4 创建密钥。
kubectl create -f ingress-test-secret.yaml
回显如下,表明密钥已创建。
secret/ingress-test-secret created
kubectl get secrets
回显如下,表明密钥创建成功。
NAME TYPE DATA AGE** **
dash-dashboard Opaque 0 7d** **
dash-dashboard-token-f2nbk kubernetes.io/service-account-token 3 7d** **
default-secret kubernetes.io/dockerconfigjson 1 8d** **
default-token-wfn4l kubernetes.io/service-account-token 3 8d** **
paas.elb cfe/secure-opaque 2 8d** **
ingress-test-secret IngressTLS 2 13s
步骤 5 创建服务。
kubectl create -f ingress-test-svc.yaml
回显如下,表示服务已创建。
service/ingress-test-svc created
kubectl get svc
回显如下,表示服务创建成功。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE** **
ingress-test NodePort 10.247.189.207 8080:30532/TCP 5s
kubernetes ClusterIP 10.247.0.1 443/TCP 3d
kubectl create -f ingress-test-ingress.yaml
回显如下,表示ingress服务已创建。
ingress/ingress-test-ingress created
kubectl get ingress
回显如下,表示ingress服务创建成功,工作负载可访问。
NAME HOSTS ADDRESS PORTS AGE** **
ingress-test * 10.154.76.63 80 10s
步骤 6 在浏览器中输入访问地址http://10.154.76.63/healthz。
其中,10.154.76.63为统一负载均衡实例的IP地址。
图访问healthz