通过Kubectl命令行创建Ingress
操作场景
本节以nginx为例,说明kubectl命令实现ingress访问的方法。
前提条件
请参见通过kubectl或web-terminal插件连接CCE集群配置kubectl命令,使弹性云服务器连接集群。
操作步骤
- 登录已配置好kubectl命令的弹性云服务器。登录方法请参见登录Linux弹性云服务器。
- 创建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为自定义名称,您可以随意命名。
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: v1 kind: Service metadata: labels: app: ingress-test-svc name: ingress-test-svc spec: ports: - name: service0 port: 8888 protocol: TCP targetPort: 8888 #若需要设置多个端口,可依次填写,如下展示 - name: service1 port: 8081 protocol: TCP targetPort: 8081 selector: app: ingress-test-deployment type: NodePort
表1 关键参数说明 参数
参数类型
描述
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
自动创建ELBapiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: 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
使用已有ELBapiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: 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 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及以上版本的集群中支持。
表2 关键参数说明 参数
参数类型
描述
kubernetes.io/elb.id
String
为共享型负载均衡实例的ID,取值范围:1-100字符。
- 在自动创建时:可选。
- 在关联已有ELB时:必填。
获取方法:
在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。
kubernetes.io/elb.ip
String
可选,但当elb自动创建时不填。
为共享型负载均衡实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。
kubernetes.io/elb.subnet-id
String
为子网的ID,取值范围:1-100字符。
- Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填,
- Kubernetes v1.11.7-r0以上版本的集群:可不填。
kubernetes.io/elb.eip-id
String
为弹性公网的ID,取值范围:1-100字符。
- 非自动创建elb时:可选。
- 自动创建elb时:不填。
获取方法:
在控制台的“服务列表”中,单击“网络 > 弹性公网IP EIP”,单击EIP的名称,在EIP详情页的“基本信息”中找到“ID”字段复制即可。
kubernetes.io/elb.enterpriseID
String
v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。
可选,为ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。
取值范围:1-100字符。
获取方法:
登录华为云控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。
kubernetes.io/elb.session-affinity-mode
String
可选,负载均衡监听是基于IP地址的会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
- 不启用:不填写该参数。
- 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。
kubernetes.io/elb.session-affinity-option
表4 Object
可选,七层负载均衡会话保持配置选项。
kubernetes.io/elb.autocreate
elb.autocreate object
可选,但公网自动创建时必填,将自动创建ELB所绑定的EIP。私网自动创建时必填,将自动创建ELB。
示例:
kubernetes.io/elb.lb-algorithm
String
可选,默认值:“ROUND_ROBIN”,为后端云服务器组的负载均衡算法。
取值范围:
- ROUND_ROBIN:加权轮询算法。
- LEAST_CONNECTIONS:加权最少连接算法。
- SOURCE_IP:源IP算法。
当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的weight字段无效。
kubernetes.io/elb.health-check-flag
String
可选,默认开启,为是否开启ELB健康检查功能。
- 开启:“”(空值)或“on”
- 关闭:“off”
kubernetes.io/elb.health-check-option
表5 Object
可选,ELB健康检查配置选项。
kubernetes.io/elb.tls-ciphers-policy
String
可选,默认值:“tls-1-2”, 为监听器使用的安全策略,仅在HTTPS协议下生效。
取值范围:
- tls-1-0-inherit
- tls-1-0
- tls-1-
- tls-1-2
- tls-1-2-strict
各安全策略使用的加密套件列表详细参见表6。
kubernetes.io/elb.port
Integer
必填,界面上的对外端口,为注册到负载均衡服务地址上的端口。
取值范围:1-65535。
kubernetes.io/ingress.class
String
是否开启nginx-ingress插件。
- cce:表示不开启nginx-ingress插件,将默认使用共享型负载均衡实例。
- 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(前缀匹配)。
取值范围:
- EQUAL_TO:精确匹配
- STARTS_WITH:前缀匹配
- REGEX:正则匹配
path
String
必填,为路由路径,用户自定义设置。
host
String
可选,为域名配置。
表3 elb.autocreate字段数据结构说明 参数
参数类型
描述
name
String
自动创建的负载均衡的名称。
取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。
type
String
负载均衡实例网络类型,公网或者私网。
- public:公网型负载均衡
- inner:私网型负载均衡
bandwidth_name
String
带宽的名称,默认值为:cce-bandwidth-******。
取值范围:1-64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。
bandwidth_chargemode
String
带宽付费模式。
- bandwidth:按带宽计费
- traffic:按流量计费
bandwidth_size
Integer
带宽大小,请根据Region带宽支持范围设置,具体请参见申请弹性公网IP中表4 bandwidth字段说明中size字段。
bandwidth_sharetype
String
带宽类型,标识是否是共享带宽。
取值范围:
- WHOLE:共享带宽
- PER:独享带宽
eip_type
String
弹性公网IP类型,请参考ELB支持的弹性公网IP类型,具体请参见申请弹性公网IP中表3 publicip字段说明type字段。
表4 elb.session-affinity-option字段数据结构说明 参数
参数类型
描述
persistence_timeout
String
当elb.session-affinity-mode是“HTTP_COOKIE”时生效,设置会话保持的超时时间(秒)。
默认值为:1440,取值范围:1-1440。
app_cookie_name
String
当elb.session-affinity-mode是“APP_COOKIE”时生效,设置会话保持的超时时间(秒)。
取值范围:1-10000字符。
表5 elb.health-check-option字段数据结构说明 参数
参数类型
描述
delay
String
开始健康检查的初始等待时间(秒),可选
默认值:5,取值范围:1-50
timeout
String
健康检查的超时时间(秒),可选
默认值:10,取值范围1-50
max_retries
String
健康检查的最大重试次数,可选
默认值:3,取值范围1-10
protocol
String
健康检查的协议,可选
默认值:取关联服务的协议
取值范围:“TCP”或者“HTTP”
path
String
健康检查的URL,协议是“HTTP”时配置,可选
默认值:“/”
取值范围:1-10000字符
表6 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.yamlapiVersion: v1 data: tls.crt: LS0******tLS0tCg== tls.key: LS0tL******0tLS0K 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加密后的内容。
- 创建工作负载。
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
- 创建密钥。
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
- 创建服务。
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 <none> 8080:30532/TCP 5s kubernetes ClusterIP 10.247.0.1 <none> 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
- 在浏览器中输入访问地址http://10.154.76.63/healthz。
其中,10.154.76.63为统一负载均衡实例的IP地址。
图1 访问healthz
