操作場景
本節以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 在瀏覽器中輸入訪問地址//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 在瀏覽器中輸入訪問地址//10.154.76.63/healthz。
其中,10.154.76.63為統一負載均衡實例的IP地址。
圖訪問healthz
