date: 2020-07-20title: k8s之ingress controller #标题
tags: ingress #标签
categories: k8s # 分类
记录下k8s中暴露服务的方式——ingress controller。
前言: ingress只是k8s中的一种配置信息,而ingress controller才是监听 80/443端口,并根据ingress配置的路由信息执行http路由转发的组件。
ingress controller有多种实现的方式,比较常用的有 Traefic 、 Nginx Ingress Controller for Kubernetes 等。这里使用 Nginx Ingress Controller for Kubernetes来进行实现。
创建nginx及tomcat应用
nginx服务的yaml文件如下:
$ cat nginx-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:app: nginxspec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestimagePullPolicy: IfNotPresent---apiVersion: v1kind: Servicemetadata:name: nginx-servicelabels:app: nginxspec:selector:app: nginxports:- name: nginx-portprotocol: TCPport: 80nodePort: 32600targetPort: 80type: NodePort$ kubectl apply -f nginx-deployment.yaml # 执行yaml文件
访问service:

tomcat服务的yaml文件如下:
cat tomcat-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: tomcat-deploymentlabels:app: tomcatspec:replicas: 1selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: tomcat:latestimagePullPolicy: IfNotPresent---apiVersion: v1kind: Servicemetadata:name: tomcat-servicelabels:app: tomcatspec:selector:app: tomcatports:- name: tomcat-portprotocol: TCPport: 8080nodePort: 32601targetPort: 8080type: NodePort$ kubectl apply -f tomcat-deployment.yaml # 执行此yaml文件
访问service:

创建ingress-controller
$ cat nginx-ingress.yaml # 文件内容如下# 如果打算用于生产环境,请参考 https://github.com/nginxinc/kubernetes-ingress/blob/v1.5.5/docs/installation.md 并根据自己的情况做进一步定制apiVersion: v1kind: Namespacemetadata:name: nginx-ingress---apiVersion: v1kind: ServiceAccountmetadata:name: nginx-ingressnamespace: nginx-ingress---apiVersion: v1kind: Secretmetadata:name: default-server-secretnamespace: nginx-ingresstype: Opaquedata:tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN2akNDQWFZQ0NRREFPRjl0THNhWFhEQU5CZ2txaGtpRzl3MEJBUXNGQURBaE1SOHdIUVlEVlFRRERCWk8KUjBsT1dFbHVaM0psYzNORGIyNTBjbTlzYkdWeU1CNFhEVEU0TURreE1qRTRNRE16TlZvWERUSXpNRGt4TVRFNApNRE16TlZvd0lURWZNQjBHQTFVRUF3d1dUa2RKVGxoSmJtZHlaWE56UTI5dWRISnZiR3hsY2pDQ0FTSXdEUVlKCktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUwvN2hIUEtFWGRMdjNyaUM3QlBrMTNpWkt5eTlyQ08KR2xZUXYyK2EzUDF0azIrS3YwVGF5aGRCbDRrcnNUcTZzZm8vWUk1Y2Vhbkw4WGM3U1pyQkVRYm9EN2REbWs1Qgo4eDZLS2xHWU5IWlg0Rm5UZ0VPaStlM2ptTFFxRlBSY1kzVnNPazFFeUZBL0JnWlJVbkNHZUtGeERSN0tQdGhyCmtqSXVuektURXUyaDU4Tlp0S21ScUJHdDEwcTNRYzhZT3ExM2FnbmovUWRjc0ZYYTJnMjB1K1lYZDdoZ3krZksKWk4vVUkxQUQ0YzZyM1lma1ZWUmVHd1lxQVp1WXN2V0RKbW1GNWRwdEMzN011cDBPRUxVTExSakZJOTZXNXIwSAo1TmdPc25NWFJNV1hYVlpiNWRxT3R0SmRtS3FhZ25TZ1JQQVpQN2MwQjFQU2FqYzZjNGZRVXpNQ0F3RUFBVEFOCkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWpLb2tRdGRPcEsrTzhibWVPc3lySmdJSXJycVFVY2ZOUitjb0hZVUoKdGhrYnhITFMzR3VBTWI5dm15VExPY2xxeC9aYzJPblEwMEJCLzlTb0swcitFZ1U2UlVrRWtWcitTTFA3NTdUWgozZWI4dmdPdEduMS9ienM3bzNBaS9kclkrcUI5Q2k1S3lPc3FHTG1US2xFaUtOYkcyR1ZyTWxjS0ZYQU80YTY3Cklnc1hzYktNbTQwV1U3cG9mcGltU1ZmaXFSdkV5YmN3N0NYODF6cFErUyt1eHRYK2VBZ3V0NHh3VlI5d2IyVXYKelhuZk9HbWhWNThDd1dIQnNKa0kxNXhaa2VUWXdSN0diaEFMSkZUUkk3dkhvQXprTWIzbjAxQjQyWjNrN3RXNQpJUDFmTlpIOFUvOWxiUHNoT21FRFZkdjF5ZytVRVJxbStGSis2R0oxeFJGcGZnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdi91RWM4b1JkMHUvZXVJTHNFK1RYZUprckxMMnNJNGFWaEMvYjVyYy9XMlRiNHEvClJOcktGMEdYaVN1eE9ycXgrajlnamx4NXFjdnhkenRKbXNFUkJ1Z1B0ME9hVGtIekhvb3FVWmcwZGxmZ1dkT0EKUTZMNTdlT1l0Q29VOUZ4amRXdzZUVVRJVUQ4R0JsRlNjSVo0b1hFTkhzbysyR3VTTWk2Zk1wTVM3YUhudzFtMApxWkdvRWEzWFNyZEJ6eGc2clhkcUNlUDlCMXl3VmRyYURiUzc1aGQzdUdETDU4cGszOVFqVUFQaHpxdmRoK1JWClZGNGJCaW9CbTVpeTlZTW1hWVhsMm0wTGZzeTZuUTRRdFFzdEdNVWozcGJtdlFmazJBNnljeGRFeFpkZFZsdmwKMm82MjBsMllxcHFDZEtCRThCay90elFIVTlKcU56cHpoOUJUTXdJREFRQUJBb0lCQVFDZklHbXowOHhRVmorNwpLZnZJUXQwQ0YzR2MxNld6eDhVNml4MHg4Mm15d1kxUUNlL3BzWE9LZlRxT1h1SENyUlp5TnUvZ2IvUUQ4bUFOCmxOMjRZTWl0TWRJODg5TEZoTkp3QU5OODJDeTczckM5bzVvUDlkazAvYzRIbjAzSkVYNzZ5QjgzQm9rR1FvYksKMjhMNk0rdHUzUmFqNjd6Vmc2d2szaEhrU0pXSzBwV1YrSjdrUkRWYmhDYUZhNk5nMUZNRWxhTlozVDhhUUtyQgpDUDNDeEFTdjYxWTk5TEI4KzNXWVFIK3NYaTVGM01pYVNBZ1BkQUk3WEh1dXFET1lvMU5PL0JoSGt1aVg2QnRtCnorNTZud2pZMy8yUytSRmNBc3JMTnIwMDJZZi9oY0IraVlDNzVWYmcydVd6WTY3TWdOTGQ5VW9RU3BDRkYrVm4KM0cyUnhybnhBb0dCQU40U3M0ZVlPU2huMVpQQjdhTUZsY0k2RHR2S2ErTGZTTXFyY2pOZjJlSEpZNnhubmxKdgpGenpGL2RiVWVTbWxSekR0WkdlcXZXaHFISy9iTjIyeWJhOU1WMDlRQ0JFTk5jNmtWajJTVHpUWkJVbEx4QzYrCk93Z0wyZHhKendWelU0VC84ajdHalRUN05BZVpFS2FvRHFyRG5BYWkyaW5oZU1JVWZHRXFGKzJyQW9HQkFOMVAKK0tZL0lsS3RWRzRKSklQNzBjUis3RmpyeXJpY05iWCtQVzUvOXFHaWxnY2grZ3l4b25BWlBpd2NpeDN3QVpGdwpaZC96ZFB2aTBkWEppc1BSZjRMazg5b2pCUmpiRmRmc2l5UmJYbyt3TFU4NUhRU2NGMnN5aUFPaTVBRHdVU0FkCm45YWFweUNweEFkREtERHdObit3ZFhtaTZ0OHRpSFRkK3RoVDhkaVpBb0dCQUt6Wis1bG9OOTBtYlF4VVh5YUwKMjFSUm9tMGJjcndsTmVCaWNFSmlzaEhYa2xpSVVxZ3hSZklNM2hhUVRUcklKZENFaHFsV01aV0xPb2I2NTNyZgo3aFlMSXM1ZUtka3o0aFRVdnpldm9TMHVXcm9CV2xOVHlGanIrSWhKZnZUc0hpOGdsU3FkbXgySkJhZUFVWUNXCndNdlQ4NmNLclNyNkQrZG8wS05FZzFsL0FvR0FlMkFVdHVFbFNqLzBmRzgrV3hHc1RFV1JqclRNUzRSUjhRWXQKeXdjdFA4aDZxTGxKUTRCWGxQU05rMXZLTmtOUkxIb2pZT2pCQTViYjhibXNVU1BlV09NNENoaFJ4QnlHbmR2eAphYkJDRkFwY0IvbEg4d1R0alVZYlN5T294ZGt5OEp0ek90ajJhS0FiZHd6NlArWDZDODhjZmxYVFo5MWpYL3RMCjF3TmRKS2tDZ1lCbyt0UzB5TzJ2SWFmK2UwSkN5TGhzVDQ5cTN3Zis2QWVqWGx2WDJ1VnRYejN5QTZnbXo5aCsKcDNlK2JMRUxwb3B0WFhNdUFRR0xhUkcrYlNNcjR5dERYbE5ZSndUeThXczNKY3dlSTdqZVp2b0ZpbmNvVlVIMwphdmxoTUVCRGYxSjltSDB5cDBwWUNaS2ROdHNvZEZtQktzVEtQMjJhTmtsVVhCS3gyZzR6cFE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=---kind: ConfigMapapiVersion: v1metadata:name: nginx-confignamespace: nginx-ingressdata:server-names-hash-bucket-size: "1024"---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: nginx-ingressrules:- apiGroups:- ""resources:- services- endpointsverbs:- get- list- watch- apiGroups:- ""resources:- secretsverbs:- get- list- watch- apiGroups:- ""resources:- configmapsverbs:- get- list- watch- update- create- apiGroups:- ""resources:- podsverbs:- list- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- extensionsresources:- ingressesverbs:- list- watch- get- apiGroups:- "extensions"resources:- ingresses/statusverbs:- update- apiGroups:- k8s.nginx.orgresources:- virtualservers- virtualserverroutesverbs:- list- watch- get---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:name: nginx-ingresssubjects:- kind: ServiceAccountname: nginx-ingressnamespace: nginx-ingressroleRef:kind: ClusterRolename: nginx-ingressapiGroup: rbac.authorization.k8s.io---apiVersion: apps/v1kind: DaemonSetmetadata:name: nginx-ingressnamespace: nginx-ingressannotations:prometheus.io/scrape: "true"prometheus.io/port: "9113"spec:selector:matchLabels:app: nginx-ingresstemplate:metadata:labels:app: nginx-ingressspec:serviceAccountName: nginx-ingresscontainers:- image: nginx/nginx-ingress:1.5.3imagePullPolicy: IfNotPresentname: nginx-ingressports:- name: httpcontainerPort: 80hostPort: 80- name: httpscontainerPort: 443hostPort: 443- name: prometheuscontainerPort: 9113env:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.nameargs:- -nginx-configmaps=$(POD_NAMESPACE)/nginx-config- -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret#- -v=3 # Enables extensive logging. Useful for troubleshooting.#- -report-ingress-status#- -external-service=nginx-ingress#- -enable-leader-election- -enable-prometheus-metrics#- -enable-custom-resources$ kubectl apply -f nginx-ingress.yaml
创建ingress
$ cat ingress-v1.yamlapiVersion: networking.k8s.io/v1beta1kind: Ingressmetadata:name: my-ingress-for-nginx # Ingress 的名字,仅用于标识spec:rules: # Ingress 中定义 L7 路由规则- host: www.lvnginx.cn # 根据 virtual hostname 进行路由(请使用自己的域名)http:paths: # 按路径进行路由- path: /backend:serviceName: nginx-service # 指定后端的 Service 为之前创建的 nginx-serviceservicePort: 80- host: www.lvtomcat.cn # 根据 virtual hostname 进行路由(请使用自己的域名)http:paths: # 按路径进行路由- path: /backend:serviceName: tomcat-service # 指定后端的 Service 为之前创建的 nginx-serviceservicePort: 8080$ kubectl apply -f ingress-v1.yaml
域名访问测试
创建后自己做域名解析(需解析到work节点,不能解析到master节点,具体原因及解决办法参考我之前的博文: K8s之Ingress-nginx原理及配置),可以解析后,分别访问 www.lvtomcat.cn 和 www.lvnginx.cn,可以看到如下页面,则表示成功。


