[Kubernetes] Kubernetes 集成 traefik ingress 实现 服务暴露

本文介绍如何利用 Traefik Ingress 控制器在 Kubernetes 中实现服务的外部访问。通过部署 Traefik 并配置 Ingress 规则,可以避免 NodePort 方式带来的端口占用问题,实现服务的高效、灵活暴露。

1. 背景

     Kubernetes Service 服务默认只能内网访问,而使用 nodePort 方式的服务暴露会在每台服务器上开放目标端口,

     存在大量端口占用现象,难以应用于生产环境,本文介绍通过 traefik ingress 方式实现内部服务的外部可访问化。

2. 基本步骤

2.1  导入 traefik 镜像到 kubernetes 集群(如果是内网环境,就上传镜像 tar 包,用 docker load 载入即可)

# docker pull traefik:alpine
2.2  部署 traefik 服务

      权限授予

# vim ingress-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: ingress
  namespace: kube-system

---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: ingress
subjects:
  - kind: ServiceAccount
    name: ingress
    namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
# kubectl create -f ingress-rbac.yaml
        服务创建 

# vim traefik.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: traefik-ingress-lb
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      terminationGracePeriodSeconds: 60
      hostNetwork: true
      restartPolicy: Always
      serviceAccountName: ingress
      containers:
      - image: traefik:alpine
        name: traefik-ingress-lb
        resources:
          limits:
            cpu: 200m
            memory: 30Mi
          requests:
            cpu: 100m
            memory: 20Mi
        ports:
        - name: http
          containerPort: 80
          hostPort: 80
        - name: admin
          containerPort: 8580
          hostPort: 8580
        args:
        - --web
        - --web.address=:8580
        - --kubernetes
# kubectl create -f traefik.yaml
       UI 创建(host 字段可以替换成自己想要的域名,这里以 ui.traefik.kubernetes.local 为例说明)

# vim ui.yaml
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - name: web
    port: 80
    targetPort: 8580
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  rules:
  - host: ui.traefik.kubernetes.local
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-web-ui
          servicePort: web
# kubectl create -f ui.yaml
2.3  验证 traefik 工作是否正常

       浏览器访问 traefik-ingress-lb 容器运行所在物理机的 8580 端口,查看 traefik 状态 ,类似下图则正常

            

2.4  应用实例(可选,到 2.3 步,其实已经完成 traefik 的部署了)

       开放服务的前提是已经有服务在正常运行,这里我的实验集群中已经运行好了 ELK 日志收集系统,就以 kibana 服务为例,讲解服务暴露的步骤。

       a)创建 ingress

            其中,namespace 为 kibana 服务所在的命名空间,host 为 kibana 服务的访问域名(用户可以任意设置)

            serviceName 和 servicePort 为 kibana 服务的内网访问服务名和端口(这是在创建服务时可指定的)

# vim kibana-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-kibana
  namespace: development
spec:
  rules:
  - host: kibana.traefik.kubernetes.local
    http:
      paths:
      - path: /
        backend:
          serviceName: kibana-headless-svc
          servicePort: 5601
# kubectl create -f kibana-ingress.yaml
        b) 配置客户端 hosts

              选择任意一台与 traefik-ingress-lb 容器运行所在物理机互联的机器作为客户端,

              编辑客户端本地 hosts 文件,将 kibana 服务的外部访问域名与 traefik 容器所在物理机 IP 地址建立起映射关系,如

                    

               然后,客户端就可以直接通过该域名访问 kibana 服务了,traefik 将通过域名将流量自动转发给后端的真实Pod。

                     

               当然,配置 hosts 文件只是一种暴力方式实现映射,更好的方法是配置一个 DNS 服务,具体方法不再赘述!

               可参考http://blog.youkuaiyun.com/shida_csdn/article/details/78931436

               最后附一张 traefik 代理原理图,来自官网

                 






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值