Fork me on GitHub

k8s Ingress介绍和部署IngressController

Ingress介绍和部署IngressController

  • Ingress是为了弥补nodeport不足而生的,nodeport存在不足:一个端口只能一个服务使用,端口需要提前规划,只支持4层负载均衡。

  • Ingress 公开了从集群外部到集群内部服务的HTTP和HTTPS路由的规则集合,而具体实现流量路由是由Ingress Controller负责。

Ingress: k8s中一个抽象资源,给管理员提供一个暴漏应用的入口定义方法。
Ingress Controller: 根据Ingress生成具体的路由规则,并对Pod负载均衡器。

ingress Controller工作流程
		Ingress Contronler通过于k8s API交互,动态去感知集群中Ingress 规则变化,然后读取它按照自定义规则,规则就是写明哪个域名对应哪个service ,生成一段nginx配资后,应用到管理Nginx服务, 然后热加载生效,从而达到Nginx负载均衡器配置及动态更新问题。
		
ingress-controller流程: 客户端->LB(公网)-> Ingress Controller(nginx) -> 分布在各pod节点
nodeport流程:客户端->LB(公网)->Service(nodeport)--> Ingress Controller(nginx) -> 分布在各pod节点
进入ingress-nginx
[root@k8s-master ~]# kubectl exec -it nginx-ingress-controller-5dc64b58f-7qwxn -n ingress-nginx -- bash 
  • 部署Ingress Controller

    • 我们采用nginx控制器

    • 下载YAML

      wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
      
    • 也可以直接下载ingress-controller.yaml,提取码:hcgm 来直接创建ingress规则。

    • 更改名称

      mv mandatory.yaml ingress-controller.yaml
      
    • 修改yaml

      1. apps/v1 下的kind为 DaemonSet
      
      apiVersion: apps/v1
      kind: DaemonSet# 如果通过Deployment部署只会在某个节点上能访问。考虑到高可用,通过DaemonSet会在每一个节点上部署
      metadata:
        name: nginx-ingress-controller
        namespace: ingress-nginx
        labels:
      ...
      
      2. 新增hostNetwork: true 将ingress-controller暴漏出去提供全局入口
      spec:
            hostNetwork: true
            # wait up to five minutes for the drain of connections
            terminationGracePeriodSeconds: 300
            serviceAccountName: nginx-ingress-serviceaccount
            nodeSelector:
            ...
      3.更改镜像地址
      containers:
        - name: nginx-ingress-controller
        image: lizhenliang/nginx-ingress-controller:0.30.0
         args:
            - /nginx-ingress-controller
            ...
      
    • 加载配置

      kubectl apply -f ingress-controller.yaml
      
    • 查看部署是否成功

      kubectl get pods -n ingress-nginx
      
    • 创建规则为其他项目暴漏

      # 编辑规则
      vi ingress.yaml
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: xujunkai
      spec:
        rules:
        - host: web.xujunkai.com# 指定域名
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: web# 指定service 名称
                  port:
                    number: 80 # service端口
      # 创建规则
      kubectl apply -f ingress.yaml
      # 查看规则
      [root@k8s-master ~]# kubectl get ingress
      NAME       CLASS    HOSTS              ADDRESS   PORTS   AGE
      xujunkai   <none>   web.xujunkai.com             80      7s
      
      
    • 查看ingress-nginx在哪个节点上。

      kubectl get pods -n ingress-nginx -o wide
      NAME                                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
      nginx-ingress-controller-5dc64b58f-7qwxn   1/1     Running   0          9m50s   172.16.215.140   k8s-node01   <none>           <none>
      
    • 可以看到在172.16.215.140 上也就是k8s node01节点上

      # 通过查看80 443端口已经有监听了,它就是ingress-nginx-controller监听的
      [root@k8s-node01 logs]# ss -anpt | grep 80
      [root@k8s-node01 logs]# ss -anpt | grep 443
      # 而在master节点是没有监听的
      
    • 访问http://web.xujunkai.com/ 是可以访问到的

  • ingress配置https

    • cfssl下载

      wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
      wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
      
      chmod -x cfssl*
      for x in cfssl*; do mv $x ${x%*_linux-amd64};  done
      mv cfssl* /usr/bin
      
    • 配置https步骤:

      mkdir ssl
      cd ssl
      vi certs.sh
      # 生成证书
      cat > ca-config.json <<EOF
      {
        "signing": {
          "default": {
            "expiry": "87600h"
          },
          "profiles": {
            "kubernetes": {
               "expiry": "87600h",
               "usages": [
                  "signing",
                  "key encipherment",
                  "server auth",
                  "client auth"
              ]
            }
          }
        }
      }
      EOF
      
      cat > ca-csr.json <<EOF
      {
          "CN": "kubernetes",
          "key": {
              "algo": "rsa",
              "size": 2048
          },
          "names": [
              {
                  "C": "CN",
                  "L": "Beijing",
                  "ST": "Beijing"
              }
          ]
      }
      EOF
      
      cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
      
      #-----------------------
      cat > web.xujunkai.com-csr.json <<EOF
      {
          "CN": "web.xujunkai.com",
          "hosts": [],
          "key": {
            "algo": "rsa",
            "size": 2048
          },
          "name": [
            {
              "C": "CN",
              "L": "BeiJing",
              "ST": "Beijing"
            }
          ]
      }
      EOF
      
      cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes web.xujunkai.com-csr.json | cfssljson -bare web.xujunkai.com
      
    • 将证书保存到Secret

      kubectl create secret tls web-xujunkai-com --cert=web.xujunkai.com.pem --key=web.xujunkai.com-key.pem
      
    • 配置ingress https的yaml

      vi ingress-https.yaml
      
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: xujunkai-https
      spec:
        tls:
        - hosts:
            - web.xujunkai.com
          secretName: web-xujunkai-com# 密钥证书名字
        rules:
        - host: web.xujunkai.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: web
                  port:
                    number: 80
      
    • 应用ingress

      kubectl apply -f ingress-https.yaml
      
    • 查看ingress

      [root@k8s-master ~]# kubectl get ingress
      NAME             CLASS    HOSTS              ADDRESS   PORTS     AGE
      xujunkai-https   <none>   web.xujunkai.com             80, 443   35s
      
    • 这样就可以访问https://web.xujunkai.com,需要提前本地配置hosts

  • 之前部署的一个pod的python服务,通过service创建NodePod。这里通过ingress做负载。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: web.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: websvc# 这里是service名称
            port:
              number: 9527# 这里是创建pod容器端口
posted @ 2021-06-09 23:02  是阿凯啊  阅读(3429)  评论(0编辑  收藏  举报