K8S(05)核心插件-ingress(服务暴露)控制器-Traefik

2022/04/17 k8s,docker

Traefik 是一个云原生的新型的 HTTP 反向代理、负载均衡软件,能轻易的部署微服务.

它支持多种后端 (Docker, Swarm, Mesos/Marathon, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) ,可以对配置进行自动化、动态的管理.

K8S 核心插件-ingress (服务暴露)控制器-traefik

1 K8S 两种服务暴露方法

前面通过 coredns 在 k8s 集群内部做了 serviceNAME 和 serviceIP 之间的自动映射,使得不需要记录 service 的 IP 地址,

只需要通过 serviceNAME 就能访问 Pod但是在 K8S 集群外部,显然是不能通过 serviceNAME 或 serviceIP 来解析服务的要在 K8S 集群外部来访问集群内部的资源,需要用到服务暴露功能

1.1 K8S 常用的两种服务暴露方法

  1. NodePort

    nodeport 型的 service 原理相当于端口映射,将容器内的端口映射到宿主机上的某个端口。 K8S 集群不能使用 ipvs 的方式调度,必须使用 iptables,且只支持 rr 模式

  2. Ingress (推荐)

    Ingress 是 K8S API 标准资源之一,也是核心资源 是一组基于域名和 URL 路径的规则,把用户的请求转发至指定的 service 资源 可以将集群外部的请求流量,转发至集群内部,从而实现 服务暴露

1.2 Ingress 控制器是什么

可以理解为一个简化版本的 Nginx

Ingress 控制器是能够为 Ingress 资源健康某套接字,然后根据 Ingress 规则匹配机制路由调度流量的一个组件

只能工作在七层网络下,建议暴露 http, https 可以使用前端 Nginx 来做证书方面的卸载

我们使用的 Ingress 控制器为 Traefik

2 部署 traefik

同样的,现在 7.200 完成 docker 镜像拉取和配置清单创建,然后再到任意 master 节点执行配置清单

2.1 准备 docker 镜像

docker pull traefik:v1.7.2-alpine
docker tag  traefik:v1.7.2-alpine harbor.zq.com/public/traefik:v1.7.2
docker push harbor.zq.com/public/traefik:v1.7.2

2.2 创建资源清单

mkdir -p /data/k8s-yaml/traefik

2.2.1 RBAC 授权清单

cat >/data/k8s-yaml/traefik/rbac.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system
EOF

2.2.2 DaemonSet 资源清单

cat >/data/k8s-yaml/traefik/ds.yaml <<EOF
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: traefik-ingress
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress
        name: traefik-ingress
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: harbor.zq.com/public/traefik:v1.7.2
        name: traefik-ingress
        ports:
        - name: controller
          containerPort: 80
          hostPort: 81
        - name: admin-web
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://10.4.7.10:7443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus
EOF

2.2.3 Service 清单

cat >/data/k8s-yaml/traefik/svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress
  ports:
    - protocol: TCP
      port: 80
      name: controller
    - protocol: TCP
      port: 8080
      name: admin-web
EOF

2.2.4 Ingress 清单

cat >/data/k8s-yaml/traefik/ingress.yaml <<EOF
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: traefik.zq.com
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-ingress-service
          servicePort: 8080
EOF

2.3 创建资源

2.3.1 任意节点上创建资源

kubectl create -f http://k8s-yaml.zq.com/traefik/rbac.yaml
kubectl create -f http://k8s-yaml.zq.com/traefik/ds.yaml
kubectl create -f http://k8s-yaml.zq.com/traefik/svc.yaml
kubectl create -f http://k8s-yaml.zq.com/traefik/ingress.yaml

2.3.2 在前端 Nginx 上做反向代理

7.117.12 上,都做反向代理,将泛域名的解析都转发到 traefik 上去

cat >/etc/nginx/conf.d/zq.com.conf <<'EOF'
upstream default_backend_traefik {
    server 10.4.7.21:81    max_fails=3 fail_timeout=10s;
    server 10.4.7.22:81    max_fails=3 fail_timeout=10s;
}
server {
    server_name *.zq.com;
  
    location / {
        proxy_pass http://default_backend_traefik;
        proxy_set_header Host       $http_host;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }
}
EOF

# 重启 Nginx 服务
nginx -t
nginx -s reload

2.3.3 在 Bind9 中添加域名解析

需要将 Traefik 服务的解析记录添加的 DNS 解析中,注意是绑定到 VIP 上

vi /var/named/zq.com.zone
$ORIGIN zq.com.
$TTL 600    ; 10 minutes
@       IN SOA  dns.zq.com. dnsadmin.zq.com. (
                2022040904 ; serial
........
traefik            A    10.4.7.10

注意前滚 serial 编号

重启named服务

systemctl restart named

# Dig 验证解析结果
[root@hdss7-11 ~]# dig -t A traefik.zq.com +short
10.4.7.10

2.3.4 在集群外访问验证

在集群外,访问 http://traefik.zq.com,如果能正常显示 Web 页面.说明我们已经暴露服务成功

mark

原文链接:https://www.cnblogs.com/noah-luo/p/13345211.html

Search

    Table of Contents