暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes配置之五:service&&ingress

运维扫盲人 2020-07-30
356

第一部分 Service发布Pod容器服务

一、service

1.1 service与kube-proxy的关系

  • service对象就是工作节点上的一组iptables或者ipvs规则,用于将到达service对象IP地址上的流量调度至endpoints指向的IP或者端口上;

  • 每个工作节点上的kube-proxy通过API server持续监控各service及其关联Pod对象的变化,将其变化实时表现在iptables或者ipvs上。

1.2 service代理模型

1.2.1 userspace代理模型

  • client请求流量到达某node的内核空间,内核将流量转发至当前node节点用户空间的kube-proxy,kube-proxy将根据iptables规则转发至对应的Server Pod;

  • userspace模式需要将client的请求流量在内核空间与用户空间来回转发两次;

  • userspace模式中,kube-proxy每次转发流量至对应的Pod时都会检测Pod的健康性,缺点是效率低。

1.2.2 iptables&&ipvs代理模型

  • 当前k8s版本将iptables设为默认模式;

  • 当client 的请求流量到达某个Node的内核空间后直接根据kube-proxy生成的iptables或者ipvs规则转发至对应的Server Pod,而无须转发至用户空间的kube-proxy;

  • ipvs所支持的调度算法比iptables更丰富。

1.3 Endpoint

  • k8s集群中创建一个service,就会生成一个同名的endpoint对象,endpoint就是service关联的pod的ip地址和端口的集合;

  • service由一组后端pod组成,这些后端的pod通过service endpoint暴露出来,如果有一个新的pod被创建出来,且pod的标签名称(label:pod)与service里面的标签(label selector 的label)一致会自动加入到service的endpoints 里面,如果pod对象终止后,pod 会自动从edponts 中移除。

  • service不仅可以代理Pod还可以代理任意其他的后端服务,但是必须定义同名的service和endpoints来实现;

    [root@k8s-master-01 service]# kubectl get endpoints
    NAME ENDPOINTS AGE
    kubernetes            10.1.114.220:6443                                                 14d
    myapp-svc-clusterip 10.244.1.14:80,10.244.1.15:80,10.244.3.6:80 19h
    myapp-svc-headless 10.244.1.14:80,10.244.1.15:80,10.244.3.6:80 19h
    myapp-svc-nodeport    10.244.1.14:80,10.244.1.15:80,10.244.3.6:80                       19h


    1.4 Service类型

    1.4.1 ClusterIP

    • ClusterIP为一个虚拟IP,该模式只能用于在集群内部通信;

    • ClusterIP为service的默认代理类型;

      [root@k8s-master-01 service]# cat myapp-svc.yaml 
      kind: Service
      apiVersion: v1
      metadata:
      name: myapp-svc-clusterip
      spec:
      type: ClusterIP
      selector:
      app: myapp
      ports:
      - protocol: TCP
      port: 80
      targetPort: 80
      #基于客户端IP设置会话粘性
      sessionAffinity: ClientIP
      sessionAffinityConfig:
      clientIP:
      #会话保持长
      timeoutSeconds: 20800
      [root@k8s-master-01 service]# kubectl apply -f myapp-svc.yaml 
      service/myapp-svc-clusterip created
      [root@k8s-master-01 service]# kubectl get -f myapp-svc.yaml
      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      myapp-svc-clusterip ClusterIP 10.110.45.75 <none> 80/TCP 82s

      1.4.2 External

      • 用于kubernetes集群访问外部service,该外部service需要被coreDNS解析到;

        [root@k8s-master-01 service]# cat myapp-svc
        [root@k8s-master-01 service]# cat myapp-svc-external.yaml
        kind: Service
        apiVersion: v1
        metadata:
        name: myapp-svc-external
        spec:
        type: ExternalName
        # externalName: redis.ilinux.io
        externalName: k8s-master-02
        selector: {}
        ports:
        - protocol: TCP
        port: 6379
        targetPort: 6379
        nodePort: 0
        [root@k8s-master-01 service]# kubectl apply -f myapp-svc-external.yaml
        service/myapp-svc-external created
        [root@k8s-master-01 service]# kubectl get -f myapp-svc-external.yaml
        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
        myapp-svc-external   ExternalName   <none>       k8s-master-02   6379/TCP   11s

        1.4.3 NodePort

        • 用于将service暴露在node节点的指定端口上(NodePort);

        • 只支持端口暴露服务,不支持域名;

        • NodePort:3000~32767

          [root@k8s-master-01 service]# cat myapp-svc-nodeport.yaml 
          kind: Service
          apiVersion: v1
          metadata:
          name: myapp-svc-nodeport
          spec:
          type: NodePort
          selector:
          app: myapp
          ports:
          - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 32223
          [root@k8s-master-01 service]# kubectl apply -f myapp-svc-nodeport.yaml
          service/myapp-svc-nodeport created
          [root@k8s-master-01 service]# kubectl get -f myapp-svc-nodeport.yaml
          NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
          myapp-svc-nodeport NodePort 10.106.42.85 <none> 80:32223/TCP 11s

          1.4.4 Headless

          • 配置时clusterIP需要明确指定为None;

          • 用于将每个Pod直接暴露给外部;

            [root@k8s-master-01 service]# cat myapp-svc-headless.yaml 
            kind: Service
            apiVersion: v1
            metadata:
            name: myapp-svc-headless
            spec:
            clusterIP: None
            selector:
            app: myapp
            ports:
            - protocol: TCP
            port: 80
            targetPort: 80
            name: httpport
            [root@k8s-master-01 service]# kubectl apply -f myapp-svc-headless.yaml
            service/myapp-svc-headless created
            [root@k8s-master-01 service]# kubectl get -f myapp-svc-headless.yaml
            NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
            myapp-svc-headless   ClusterIP   None         <none>        80/TCP    6s

            二、服务发现

            2.1 服务发现和ClusterDNS

            • kubernetes系统上用于名称解析和服务发现的clusterDNS是集群的核心组件之一;

            • 集群中的各个Pod会自动配置ClusterDNS为其名称解析服务器;

            • 创建service时,ClusterDNS会自动创建资源记录用于名称解析和服务注册;

            • 每个service对象都会包含如下两个资源记录:

              SVCNAME.NAMESPACE.CLUSTER_DOMAIN

              SVCNAME.NAMESPACE.svc.CLUSTER_DOMAIN

            • kubernetes1.11版本后,CoreDNS取代kubeDNS成为默认的DNS附件;

              [root@k8s-master-01 ~]# kubectl get svc -n kube-system -o wide
              NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
              kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 14d k8s-app=kube-dns


              #创建一个临时Client Pod做测试
              [root@k8s-master-01 service]# kubectl run cirros --rm -it --image=cirros -- sh
              If you don't see a command prompt, try pressing enter.
              / # cat etc/resolv.conf
              nameserver 10.96.0.10
              search default.svc.cluster.local svc.cluster.local cluster.local localdomain
              / # ping myapp-svc-nodeport.default
              PING myapp-svc-nodeport.default (10.106.42.85): 56 data bytes


              第二部分 Ingress发布Service服务

              一、ingress-nginx控制器部署

              • ingress控制器不会随着集群部署而自动部署,需要手动创建;

              • ingress发布服务的方式有多种,例如nginx、keepalived等等;

              1.1 在每个worker上下载需要的image

                docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
                docker pull registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0

                1.2 下载ingress-nginx.ymal资源申明文件

                  wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/mandatory.yaml

                  1.3 修改清单文件

                    sed -i 's#k8s.gcr.io/defaultbackend-amd64#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64#g' mandatory.yaml
                    sed -i 's#quay.io/kubernetes-ingress-controller/nginx-ingress-controller#registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller#g' mandatory.yaml
                    grep image mandatory.yaml

                    注意:不修改镜像源地址会报错,导致ingress-nginx部署失败。

                    1.4 nginx-ingress.yaml文件

                      [root@k8s-master-01 sucess]# cat mandatory.yaml
                      apiVersion: v1
                      kind: Namespace
                      metadata:
                      name: ingress-nginx


                      ---


                      apiVersion: apps/v1
                      kind: Deployment
                      metadata:
                      name: default-http-backend
                      labels:
                      app.kubernetes.io/name: default-http-backend
                      app.kubernetes.io/part-of: ingress-nginx
                      namespace: ingress-nginx
                      spec:
                      replicas: 1
                      selector:
                      matchLabels:
                      app.kubernetes.io/name: default-http-backend
                      app.kubernetes.io/part-of: ingress-nginx
                      template:
                      metadata:
                      labels:
                      app.kubernetes.io/name: default-http-backend
                      app.kubernetes.io/part-of: ingress-nginx
                      spec:
                      terminationGracePeriodSeconds: 60
                      containers:
                      - name: default-http-backend
                      # Any image is permissible as long as:
                      # 1. It serves a 404 page at
                      # 2. It serves 200 on a healthz endpoint
                      image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/defaultbackend-amd64:1.5
                      livenessProbe:
                      httpGet:
                      path: /healthz
                      port: 8080
                      scheme: HTTP
                      initialDelaySeconds: 30
                      timeoutSeconds: 5
                      ports:
                      - containerPort: 8080
                      resources:
                      limits:
                      cpu: 10m
                      memory: 20Mi
                      requests:
                      cpu: 10m
                      memory: 20Mi


                      ---
                      apiVersion: v1
                      kind: Service
                      metadata:
                      name: default-http-backend
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: default-http-backend
                      app.kubernetes.io/part-of: ingress-nginx
                      spec:
                      ports:
                      - port: 80
                      targetPort: 8080
                      selector:
                      app.kubernetes.io/name: default-http-backend
                      app.kubernetes.io/part-of: ingress-nginx


                      ---


                      kind: ConfigMap
                      apiVersion: v1
                      metadata:
                      name: nginx-configuration
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx


                      ---


                      kind: ConfigMap
                      apiVersion: v1
                      metadata:
                      name: tcp-services
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx


                      ---


                      kind: ConfigMap
                      apiVersion: v1
                      metadata:
                      name: udp-services
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx


                      ---


                      apiVersion: v1
                      kind: ServiceAccount
                      metadata:
                      name: nginx-ingress-serviceaccount
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx


                      ---
                      apiVersion: rbac.authorization.k8s.io/v1beta1
                      kind: ClusterRole
                      metadata:
                      name: nginx-ingress-clusterrole
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      rules:
                      - apiGroups:
                      - ""
                      resources:
                      - configmaps
                      - endpoints
                      - nodes
                      - pods
                      - secrets
                      verbs:
                      - list
                      - watch
                      - apiGroups:
                      - ""
                      resources:
                      - nodes
                      verbs:
                      - get
                      - apiGroups:
                      - ""
                      resources:
                      - services
                      verbs:
                      - get
                      - list
                      - watch
                      - apiGroups:
                      - "extensions"
                      resources:
                      - ingresses
                      verbs:
                      - get
                      - list
                      - watch
                      - apiGroups:
                      - ""
                      resources:
                      - events
                      verbs:
                      - create
                      - patch
                      - apiGroups:
                      - "extensions"
                      resources:
                      - ingresses/status
                      verbs:
                      - update


                      ---
                      apiVersion: rbac.authorization.k8s.io/v1beta1
                      kind: Role
                      metadata:
                      name: nginx-ingress-role
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      rules:
                      - apiGroups:
                      - ""
                      resources:
                      - configmaps
                      - pods
                      - secrets
                      - namespaces
                      verbs:
                      - get
                      - apiGroups:
                      - ""
                      resources:
                      - configmaps
                      resourceNames:
                      # Defaults to "<election-id>-<ingress-class>"
                      # Here: "<ingress-controller-leader>-<nginx>"
                      # This has to be adapted if you change either parameter
                      # when launching the nginx-ingress-controller.
                      - "ingress-controller-leader-nginx"
                      verbs:
                      - get
                      - update
                      - apiGroups:
                      - ""
                      resources:
                      - configmaps
                      verbs:
                      - create
                      - apiGroups:
                      - ""
                      resources:
                      - endpoints
                      verbs:
                      - get


                      ---
                      apiVersion: rbac.authorization.k8s.io/v1beta1
                      kind: RoleBinding
                      metadata:
                      name: nginx-ingress-role-nisa-binding
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      roleRef:
                      apiGroup: rbac.authorization.k8s.io
                      kind: Role
                      name: nginx-ingress-role
                      subjects:
                      - kind: ServiceAccount
                      name: nginx-ingress-serviceaccount
                      namespace: ingress-nginx


                      ---
                      apiVersion: rbac.authorization.k8s.io/v1beta1
                      kind: ClusterRoleBinding
                      metadata:
                      name: nginx-ingress-clusterrole-nisa-binding
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      roleRef:
                      apiGroup: rbac.authorization.k8s.io
                      kind: ClusterRole
                      name: nginx-ingress-clusterrole
                      subjects:
                      - kind: ServiceAccount
                      name: nginx-ingress-serviceaccount
                      namespace: ingress-nginx


                      ---


                      apiVersion: apps/v1
                      kind: Deployment
                      metadata:
                      name: nginx-ingress-controller
                      namespace: ingress-nginx
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      spec:
                      replicas: 1
                      selector:
                      matchLabels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      template:
                      metadata:
                      labels:
                      app.kubernetes.io/name: ingress-nginx
                      app.kubernetes.io/part-of: ingress-nginx
                      annotations:
                      prometheus.io/port: "10254"
                      prometheus.io/scrape: "true"
                      spec:
                      serviceAccountName: nginx-ingress-serviceaccount
                      containers:
                      - name: nginx-ingress-controller
                      image: registry.cn-qingdao.aliyuncs.com/kubernetes_xingej/nginx-ingress-controller:0.20.0
                      args:
                      - /nginx-ingress-controller
                      - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
                      - --configmap=$(POD_NAMESPACE)/nginx-configuration
                      - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
                      - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
                      - --publish-service=$(POD_NAMESPACE)/ingress-nginx
                      - --annotations-prefix=nginx.ingress.kubernetes.io
                      securityContext:
                      capabilities:
                      drop:
                      - ALL
                      add:
                      - NET_BIND_SERVICE
                      # www-data -> 33
                      runAsUser: 33
                      env:
                      - name: POD_NAME
                      valueFrom:
                      fieldRef:
                      fieldPath: metadata.name
                      - name: POD_NAMESPACE
                      valueFrom:
                      fieldRef:
                      fieldPath: metadata.namespace
                      ports:
                      - name: http
                      containerPort: 80
                      - name: https
                      containerPort: 443
                      livenessProbe:
                      failureThreshold: 3
                      httpGet:
                      path: /healthz
                      port: 10254
                      scheme: HTTP
                      initialDelaySeconds: 10
                      periodSeconds: 10
                      successThreshold: 1
                      timeoutSeconds: 1
                      readinessProbe:
                      failureThreshold: 3
                      httpGet:
                      path: /healthz
                      port: 10254
                      scheme: HTTP
                      periodSeconds: 10
                      successThreshold: 1
                                  timeoutSeconds: 1

                      1.5 应用并查看创建的ingress-nginx资源

                        [root@k8s-master-01 sucess]# kubectl get -f mandatory.yaml 
                        NAME STATUS AGE
                        namespace/ingress-nginx Active 2d18h


                        NAME READY UP-TO-DATE AVAILABLE AGE
                        deployment.apps/default-http-backend 1/1 1 1 2d18h


                        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                        service/default-http-backend ClusterIP 10.106.145.204 <none> 80/TCP 2d18h


                        NAME DATA AGE
                        configmap/nginx-configuration 0 2d18h
                        configmap/tcp-services 0 2d18h
                        configmap/udp-services 0 2d18h


                        NAME SECRETS AGE
                        serviceaccount/nginx-ingress-serviceaccount 1 2d18h


                        NAME CREATED AT
                        clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole 2020-07-25T10:34:45Z


                        NAME CREATED AT
                        role.rbac.authorization.k8s.io/nginx-ingress-role 2020-07-25T10:34:45Z


                        NAME ROLE AGE
                        rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding Role/nginx-ingress-role 2d18h


                        NAME ROLE AGE
                        clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding ClusterRole/nginx-ingress-clusterrole 2d18h


                        NAME READY UP-TO-DATE AVAILABLE AGE
                        deployment.apps/nginx-ingress-controller 1/1 1 1 2d18h
                        [root@k8s-master-01 sucess]# kubectl get svc -n ingress-nginx
                        NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                        default-http-backend ClusterIP 10.106.145.204 <none> 80/TCP 2d18h
                        [root@k8s-master-01 sucess]# kubectl get deployment -n ingress-nginx
                        NAME READY UP-TO-DATE AVAILABLE AGE
                        default-http-backend 1/1 1 1 2d18h
                        nginx-ingress-controller 1/1 1 1 2d18h

                        二、使用service的NodePort类型对外暴露ingress-nginx

                        2.1 ingress-nginx暴露为NodePort

                          [root@k8s-master-01 sucess]# cat ingress-nginx-svc.yaml 
                          apiVersion: v1
                          kind: Service
                          metadata:
                          name: ingress-nginx
                          namespace: ingress-nginx
                          labels:
                          app.kubernetes.io/name: ingress-nginx
                          app.kubernetes.io/part-of: ingress-nginx
                          spec:
                          type: NodePort
                          ports:
                          - name: http
                          port: 80
                          targetPort: 80
                          protocol: TCP
                          nodePort: 32080 #http
                          - name: https
                          port: 443
                          targetPort: 443
                          protocol: TCP
                          nodePort: 32443 #https
                          selector:
                          app.kubernetes.io/name: ingress-nginx
                          app.kubernetes.io/part-of: ingress-nginx

                          2.2 定义并查看ingress-nginx的svc资源

                            [root@k8s-master-01 sucess]# kubectl get svc -n ingress-nginx
                            NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                            ingress-nginx NodePort 10.96.250.67 <none> 80:32080/TCP,443:32443/TCP 2d17h

                            三、tomcat测试示例

                            3.1 定义deployment与service

                              [root@k8s-master-01 ingress-tomcat]# cat svc-tomcat.yaml 
                              apiVersion: v1
                              kind: Service
                              metadata:
                              name: tomcat-svc
                              namespace: tomcat-test
                              spec:
                              selector:
                              app: tomcat
                              release: canary
                              ports:
                              - name: http
                              port: 80
                              targetPort: 8080
                              - name: ajp
                              port: 8009
                              targetPort: 8009


                              ---
                              apiVersion: apps/v1
                              kind: Deployment
                              metadata:
                              name: tomcat-deploy
                              namespace: tomcat-test
                              spec:
                              replicas: 3
                              selector:
                              matchLabels:
                              app: tomcat
                              release: canary
                              template:
                              metadata:
                              labels:
                              app: tomcat
                              release: canary
                              spec:
                              containers:
                              - name: tomcat
                              image: tomcat:7-alpine
                              ports:
                              - name: httpd
                              containerPort: 8080
                              - name: ajp
                              containerPort: 8009

                              3.2 定义ingress暴露规则(http)

                                [root@k8s-master-01 ingress-tomcat]# cat ingress-tomcat.yaml 
                                apiVersion: extensions/v1beta1
                                kind: Ingress
                                metadata:
                                name: tomcat-tomcat
                                namespace: tomcat-test
                                annotations:
                                kubernets.io/ingress.class: "nginx"
                                spec:
                                rules:
                                - host: tomcat.ilinux.io
                                http:
                                paths:
                                - path:
                                backend:
                                serviceName: tomcat-svc
                                servicePort: 80


                                3.2.1 应用资源清单文件

                                  kubectl apply -f svc-tomcat.yaml
                                  kubectl apply -f ingress-tomcat.yaml


                                  [root@k8s-master-01 ingress-tomcat]# kubectl get svc -n tomcat-test
                                  NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
                                  tomcat-svc ClusterIP 10.103.136.32 <none> 80/TCP,8009/TCP 2d15h


                                  [root@k8s-master-01 ingress-tomcat]# kubectl get ingress -n tomcat-test
                                  NAME CLASS HOSTS ADDRESS PORTS AGE
                                  tomcat-tomcat <none> tomcat.ilinux.io 80 56s


                                  #svc会根据deploymentlabel selector选择对用的pod
                                  [root@k8s-master-01 ingress-tomcat]# kubectl get endpoints -n tomcat-test -o wide
                                  NAME ENDPOINTS AGE
                                  tomcat-svc 10.244.1.220:8080,10.244.3.29:8080,10.244.3.30:8080 + 3 more... 3d13h


                                  [root@k8s-master-01 ingress-tomcat]# kubectl get pods -n tomcat-test -o wide
                                  NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
                                  tomcat-deploy-f59fd664-9m2tr 1/1 Running 0 3d13h 10.244.1.220 k8s-worker-01 <none> <none>
                                  tomcat-deploy-f59fd664-jb4nk 1/1 Running 1 3d13h 10.244.3.29 k8s-worker-02 <none> <none>
                                  tomcat-deploy-f59fd664-vp9xx 1/1 Running 0 3d13h 10.244.3.30 k8s-worker-02 <none> <none>

                                  3.2.2 测试页面

                                    http://tomcat.ilinux.io:32080/

                                    3.3 定义ingress的暴露规则(https)

                                      #生成证书文件
                                      openssl genrsa -out tls.key 2048
                                      openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=Beijing/L=Beijing/O=DevOps/CN=tomcat.magedu.com
                                      kubectl create secret tls tomcat-ingress-secret --cert=tls.crt --key=tls.key

                                      3.3.1 定义secret资源

                                        [root@k8s-master-01 https-ingress]# cat ingress-tomcat-tls.yaml 
                                        apiVersion: extensions/v1beta1
                                        kind: Ingress
                                        metadata:
                                        name: ingress-tomcat-tls
                                        namespace: default
                                        annotations:
                                        kubernets.io/ingress.class: "nginx"
                                        spec:
                                        tls:
                                        - hosts:
                                        - tomcat.magedu.com #与secret证书的域名需要保持一致
                                        secretName: tomcat-ingress-secret #secret证书的名称
                                        rules:
                                        - host: tomcat.magedu.com
                                        http:
                                        paths:
                                        - path:
                                        backend:
                                        serviceName: tomcat
                                                  servicePort: 8080
                                        [root@k8s-master-01 https-ingress]# kubectl get secret -n tomcat-test
                                        NAME TYPE DATA AGE
                                        default-token-qkbk9 kubernetes.io/service-account-token 3 2d18h

                                        3.3.2 测试页面

                                          https://tomcat.magedu.com:32443/

                                          3.4 查看ingress资源

                                            [root@k8s-master-01 ingress-tomcat]# kubectl get ingress -n tomcat-test
                                            NAME CLASS HOSTS ADDRESS PORTS AGE
                                            ingress-tomcat-tls <none> tomcat.magedu.com 80, 443 53m
                                            tomcat-tomcat <none> tomcat.ilinux.io 80 70m
                                            NAME CLASS HOSTS ADDRESS PORTS AGE
                                            ingress-tomcat-tls <none> tomcat.magedu.com 80, 443 53m
                                            tomcat-tomcat <none> tomcat.ilinux.io 80 70m
                                            [root@k8s-master-01 ingress-tomcat]# kubectl describe ingress tomcat-tomcat
                                            Name: tomcat-tomcat
                                            Namespace: default
                                            Address:
                                            Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
                                            Rules:
                                            Host Path Backends
                                            ---- ---- --------
                                            magedu.com
                                            tomcat:8080 (10.244.1.219:8080,10.244.3.23:8080,10.244.3.24:8080)
                                            Annotations: kubernets.io/ingress.class: nginx
                                            Events:       <none>


                                            文章转载自运维扫盲人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                            评论