Kubernetes Ingress API 对象

Ingress 它是什么html

如何暴露您Kubernetes集群内部 "应用服务" 并向外(互联网)提供访问服务!!!前端

  • 一般状况下集群内部Service和Pod仅可在集群内部网络中经过IP地址访问。全部到达边界路由器的流量或被丢弃或被转发到其它地方。(Ingress 的存在便是完成以上之目的)
  • 不直接使用Ingress资源,也可有多种方法暴露Service。
    • 使用 Service.Type=LoadBalancer
    • 使用 Service.Type=NodePort
    • 有几个是废弃的
  • 未定义Ingress的状况下,外部请求访问内部服务时可能这样
Internet ---------> Service
  • 定义Ingress受权请求服务入站链接到达集群的规访问则可能这样
Internet ------> Ingress ------> Service

Ingress 它能作什么node

  • 能够将 Ingress 配置为提供服务外部可访问的 URL、负载均衡流量、终止 SSL / TLS 并提供基于名称的虚拟主机。Ingress 控制器一般负责经过负载均衡器来实现 Ingress,尽管它也能够配置边缘路由器或其余前端来帮助处理流量。
  • Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 之外的服务公开到 Internet 时,一般使用 Service.Type=NodePort 或者 Service.Type=LoadBalancer 类型的服务,典型的访问方式是 "HTTP"。
  • 先决条件:
    • 您必须具备 ingress 控制器才能知足 Ingress 的要求。仅建立 Ingress 资源无效,好比ingress-nginx。
    • 必定要检查一下控制器的 beta 限制。 在 GCE/GKE 以外的环境中,须要将控制器部署 为 Pod。
  • 默认后段:
    • 若是没有主机或路径与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到您的默认后端。
    • 默认后端一般是 Ingress 控制器的配置选项,而且未在 Ingress 资源中指定。
    • 更多更详细的Ingress描述及使用方法 参考中文官方 Ingress 文档

Ingress 控制器nginx

  • 想让Ingress资源工做您单独部署个Ingress没有用,您得部署一个Ingress Controller来实现Ingress。
  • 与做为 kube-controller-manager 可执行文件的一部分运行的其余类型的控制器不一样,Ingress 控制器不是随集群自动启动的。 基于此页面,您可选择最适合您的集群的 Ingress 控制器实现。
  • Kubernetes 做为一个项目,目前支持和维护 GCE 和 nginx 控制器。
  • 您能够在集群中部署和使用多个 Ingress 控制器,建立Ingress时使用 "ingress.class" 进行注释。
  • 更多更详细的控制器使用可 参考中文官方 Ingress controller 描述

多个Ingress控制器并存的示例
多个控制器切换使用,修改红色字体便可git

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - secretName: tls-secret
  backend:
    serviceName: echoheaders-https
    servicePort: 80

haproxy-ingress参考 haproxy-ingress in github github

在使用kubeadm工具部署的集群下部署Ingress-nginx后端

  • Github站点:
https://github.com/kubernetes/ingress-nginx
https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
  • Kubernetes站点:
https://kubernetes.github.io/ingress-nginx/
https://kubernetes.github.io/ingress-nginx/deploy/
  • 命令帮助
    rules:规则的对象列表,谁调度到谁那里去(路径调度、主机调度)
    backend:调度到后端相关pod资源,关联后段Pod,serviceName、servicePort
[root@node1 ~]# kubectl explain ingress.spec
[root@node1 ~]# kubectl explain ingress.spec.rules
  • 下载安装nginx-ingress-controller
    需提早下载镜像到本地,或者改用阿里云镜像
[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
[root@node1 ingress]# kubectl apply -f mandatory.yaml
[root@node1 ingress]# kubectl get pods -n ingress-nginx
NAME                                       READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-948ffd8cc-9nd4c   1/1     Running   0          10m
[root@node1 ingress]# 
[root@node1 ingress]# kubectl describe pods -n ingress-nginx
  • 建立一个Pod类型为NodePort的service用来接入互联网请求
    修改yaml文件可添加nodePort来指定端口,这里采用默认
[root@node1 ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/provider/baremetal/service-nodeport.yaml
[root@node1 ingress]# kubectl apply -f service-nodeport.yaml 
service/ingress-nginx created
[root@node1 ingress]# 
[root@node1 ingress]# kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.99.146.223   <none>        80:32116/TCP,443:30771/TCP   17s
[root@node1 ingress]#
  • 经过互联网测试访问,看nginx的调度器是否配置成功
    任意集群地址访问
[root@node1 ingress]# curl 172.12.0.10:32116
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.17.7</center>
</body>
</html>
[root@node1 ingress]#

Nginx调度器自己调度已经能够正常工做了!!!
Nginx调度器自己调度已经能够正常工做了!!!
Nginx调度器自己调度已经能够正常工做了!!!
接下来就能够手动部署个应用,并经过nginx的调度器发布出去api

手动部署tomcat应用服务,经过nginx调度器发布出去tomcat

  • NodePort类型的Tomcat建立
    把资源都写在一个yaml文件内,使用三条横线进行分割
[root@node1 pod]# cat tomcat-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat
  namespace: default
spec:
  selector: 
    app: tomcat
    release: canary
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-demo
  namespace: default
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8080
        - name: ajp
          containerPort: 8009
[root@node1 pod]#

直接使用集群内部任意IP地址加30080端口进行访问便可。网络

  • 经过Ingress形式发布Tomcat至外部
    提早下载好tomcat镜像到本地,service资源和deploy资源写在一个yaml文件内
[root@node1 pod]# cat deploy-svc-tomcat.yaml 
apiVersion: v1
kind: Service
metadata:
  name: tomcat
spec:
  selector:
    app: tomcat
    release: canary
  ports:
  - name: http
    targetPort: 8080
    port: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-demo
spec:
  replicas: 2
  selector: 
    matchLabels:
      app: tomcat
      release: canary
  template:
    metadata:
      labels:
        app: tomcat
        release: canary
    spec:
      containers:
      - name: tomcat8
        image: tomcat
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 8080
[root@node1 pod]#

建立完成后,接下来就能够为刚刚部署的tomcat制做一个ingress服务了

  • 为ingress类型的tomcat建立ingress服务
    您也能够建立带ssl认证证书类型的tomcat服务,只须要购买ssl证书或只为了测试自建证书也可
[root@node1 pod]# cat tomcat-ingress.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-tomcat
  namespace: default
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: tomcat.siyou.com
    http:
      paths:
      - path:
        backend:
          serviceName: tomcat
          servicePort: 8080
[root@node1 pod]#

测试吧。配置好"tomcat.siyou.com"的解析,访问的时候经过ingress调度器映射出去的端口访问便可

  • 为了测试会用到的相关命令
    kubectl 的相关资源使用帮助 # kubectl explain pods or kubectl explain pods.spec
# 获取默认空间下的pods资源详情
[root@node1 pod]# kubectl get pods -o wide
# 描述默认空间下某个pods资源
[root@node1 pod]# kubectl describe pods tomcat-demo-655c78c49-ctd66
# 查看某个tomcat的日志,实时查看
[root@node1 pod]# kubectl logs tomcat-demo-655c78c49-ctd66 -f
# 查看默认空间下tomcat应用端口监听状态
[root@node1 pod]# kubectl exec tomcat-demo-655c78c49-ctd66 -- ss -tnl
# 进入到一个tomcat内部
[root@node1 pod]# kubectl exec -it tomcat-demo-655c78c49-ctd66 -- /bin/sh
# 查看默认名称空间下的service详情
[root@node1 pod]# kubectl get svc -o wide
# 获取名称空间为ingress-nginx下的pod资源状况
[root@node1 pod]# kubectl get pods -n ingress-nginx
# 查看ingress-nginx空间下pod详情
[root@node1 pod]# kubectl describe pods -n ingress-nginx nginx-ingress-controller-948ffd8cc-9nd4c
# 查看默认名称空间下的ingress
[root@node1 pod]# kubectl get ingress

更多 kubectl 命令的使用,"kubectl --help" 或者官方文档 k8s kubectl overview

相关文章
相关标签/搜索