ingress简单来讲,就是一个利用负载均衡的玩意,其主要用来解决使用NodePort暴露Service的端口时Node IP会漂移的问题。同时,若大量使用NodePort暴露主机端口,管理会非常混乱。
好的解决方案就是让外界通过域名去访问Service,而无需关心其Node IP及Port。那为什么不直接使用Nginx?这是因为在K8S集群中,如果每加入一个服务,我们都在Nginx中添加一个配置,其实是一个重复性的体力活,只要是重复性的体力活,我们都应该通过技术将它干掉。

参考文档:https://kubernetes.io/docs/concepts/services-networking/ingress/
注意线上要部署多副本模式,可以指定机器部署,也可以每台机器放一个ingress服务

Pod与Ingress的关系
通过label-selector相关联
通过Ingress Controller实现Pod的负载均衡
支持TCP/UDP 4层和HTTP 7层

1、部署ingress

部署文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

下载yaml文件:

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

注意事项:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.20.0
• 使用宿主机网络:hostNetwork: true
在这里插入图片描述

创建ingress:

[root@master ingress]# kubectl create -f mandatory.yaml

查看ingress服务:

[root@master ingress]# kubectl get all -n ingress-nginx
NAME                                            READY   STATUS    RESTARTS   AGE
pod/nginx-ingress-controller-79888fdc4c-qbpdb   1/1     Running   0          64s
NAME                                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-ingress-controller   1         1         1            1           66s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-ingress-controller-79888fdc4c   1         1         1       65s

注意如果:
如果出现下面类似错误:
kubectl describe pod nginx-ingress-controller-7f44d6dccb-fn7rk -n ingress-nginx
在这里插入图片描述
可能是机器磁盘不够了,注意检测磁盘容量,这里我是被坑到了
其他控制器参考:
https://kubernetes.io/docs/concepts/services-networking/ingress/、

2、使用ingress (http)

编写ingress yam文件让service与ingress关联

[root@master ingress_test]# cat k8s_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-nginx-example
  annotations:
    #配置重定向相关
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: k8s.aicard001.com
    http:
      paths:
      - path: /
        backend:
          #匹配需要代理的service名字
          serviceName: my-service
          #对应clusterip端口
          servicePort: 80

创建:

kubectl apply -f k8s_ingress.yaml

查看我们域名绑定策略是否正确:

[root@master ingress_test]# kubectl get ingress
NAME                    HOSTS                ADDRESS   PORTS   AGE
simple-fanout-example   test.aicard001.com             80      37m

查看ingress绑定的机器:

[root@master ~]# kubectl get pods -n ingress-nginx -o wide
NAME                                        READY     STATUS             RESTARTS   AGE       IP             NODE
default-http-backend-757754bc6b-x7g8q       1/1       Running            0          1d        172.17.32.8    192.168.1.40
nginx-ingress-controller-7f44d6dccb-mgdlg   1/1       Running            0          1d        192.168.1.42   192.168.1.42

绑定域名解析,可以本机host上绑定,也能在云服务商,云解析处绑定:
我们绑定:k8s.aicard001.com -->192.168.1.40
此时访问:k8s.aicard001.com 便能正确代理到service
在这里插入图片描述

注意,如果你有多个虚拟主机,ingress支持定义多个虚拟主机:
在这里插入图片描述
当多个项目使用同一个ingress的时候,这个时候需要更加项目名来区分具体代理到那个后端了:
例如:
在这里插入图片描述

此时,访问原来的项目就是:http://k8s.aicard001.com/k8s

3、使用ingress(https)

利用cfssl颁发证书:

1 生成ca模板并改信息

cfssl print-defaults csr >ca-csr.json

[root@master https]# cat ca-csr.json
{
    "CN": "xianrenqiu",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Hangzhou",
            "ST": "Hangzhou"
        }
    ]
}

2 生成默认配置文件:(不用做变动)

cfssl print-defaults csr >liaochao-csr.json

3 生成网站所需要的配置文件:

[root@master https]# cat  liaochao-csr.json
{
    "CN": "www.liaochao.com",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "ST": "Beijing"
        }
    ]
}

4 初始化ca证书文件

cfssl gencert --initca ca-csr.json |cfssljson -bare ca -

5 初始化网站证书文件

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem --config=ca-config.json --profile=www liaochao-csr.json |cfssljson -bare server

此时生成的 server-key.pem server.pem 2个私钥就是我们所需要的
如果我们在服务商处申请到了证书,上面的步骤都可以省略

将生成的密钥导入到集群中

  kubectl create secret tls aicard --key 2_aicard001.com.key --cert 1_aicard001.com_bundle.crt

检查

[root@master ingress_test]# kubectl get secret
NAME                   TYPE                                  DATA   AGE
aicard                 kubernetes.io/tls                     2      26m

生成https的网站文件

[root@master ingress_test]# cat https_aicard.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-k8s-ingress
spec:
  tls:
  - hosts:
    - k8s.aicard001.com
    secretName: aicard
  rules:
    - host: k8s.aicard001.com
      http:
        paths:
        - path: /
          backend:
            serviceName: my-service
            servicePort: 80

创建:

kubectl apply -f https_aicard.yaml

查看是否绑定

[root@master ingress_test]# kubectl get ingress
NAME                    HOSTS                ADDRESS   PORTS     AGE
simple-nginx-example    k8s.aicard001.com              80        83m
tls-k8s-ingress         k8s.aicard001.com              80, 443   25m

https访问

此时,如果是字签证书,我们在win机器上面的hosts文件中加入相对于的域名,现在我们访问域名http会自动跳转https,因为这个证书不信任这个域名所以会显示不安全。

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐