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

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

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

1 K8S两种服务暴露方法

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

但是在K8S集群外部,显然是不能通过serviceNAME或serviceIP来解析服务的

要在K8S集群外部来访问集群内部的资源,需要用到服务暴露功能

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

  1. 使用NodePort型的Service
    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

traefik:GITHUB官方地址

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 delepoly资源清单

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

........

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页面.说明我们已经暴露服务成功

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
运维 Kubernetes 持续交付
ACK One GitOps:让全球化游戏服务持续交付更简单
ACK One GitOps 致力于提供开箱即用的多集群 GitOps 持续交付能力,简化游戏等服务的多集群/多地域统一部署,让您更加专注于业务开发。
|
Kubernetes 监控 调度
【赵渝强老师】K8s的DaemonSet控制器
DaemonSet控制器确保每个节点上运行一个Pod副本,适用于监控、日志收集等场景。通过示例创建DaemonSet并查看Pod信息,展示了其自动扩展和回收的能力。视频讲解和代码示例详细说明了DaemonSet的使用方法和调度机制。
180 1
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Job控制器单工作队列的串行方式
Kubernetes中的Job控制器用于管理一次性任务,确保任务完成后不再重启。本文介绍了Job的工作原理、运行方式及示例,包括创建Job、查看Job和Pod信息等步骤,并附有视频讲解。
174 0
|
11月前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes Ingress:灵活的集群外部网络访问的利器
《Kubernetes Ingress:集群外部访问的利器-打造灵活的集群网络》介绍了如何通过Ingress实现Kubernetes集群的外部访问。前提条件是已拥有Kubernetes集群并安装了kubectl工具。文章详细讲解了Ingress的基本组成(Ingress Controller和资源对象),选择合适的版本,以及具体的安装步骤,如下载配置文件、部署Nginx Ingress Controller等。此外,还提供了常见问题的解决方案,例如镜像下载失败的应对措施。最后,通过部署示例应用展示了Ingress的实际使用方法。
380 2
|
存储 Kubernetes 网络协议
k8s的无头服务
Headless Service 是一种特殊的 Kubernetes 服务,其 `spec:clusterIP` 设置为 `None`,不会分配 ClusterIP,通过 DNS 解析提供服务发现。与普通服务不同,Headless Service 不提供负载均衡功能,每个 Pod 都有唯一的 DNS 记录,直接映射到其 IP 地址,适用于有状态应用的场景,如与 StatefulSet 一起部署数据库。示例中通过创建 Nginx 的 StatefulSet 和 Headless Service,展示了如何直接访问单个 Pod 并进行内容修改。
317 3
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
245 0
|
存储 Kubernetes 调度
【赵渝强老师】K8s中Deployment控制器与StatefulSet控制器的区别
K8s中的Deployment控制器用于管理无状态应用程序,关注Pod数量、更新方式等;而StatefulSets控制器则管理有状态应用程序,提供持久存储和唯一标识符,适用于需要稳定网络标识符和持久化存储的场景。两者的主要区别在于是否维护状态和顺序。
417 0
|
存储 Kubernetes 调度
【赵渝强老师】K8s的有状态控制器StatefulSet
在Kubernetes中,StatefulSets用于部署有状态应用程序,提供持久存储和唯一标识符。与Deployment不同,StatefulSets确保Pod的标识符在重新调度后保持不变,适用于需要稳定网络标识符和持久存储的场景。本文介绍了StatefulSets的创建、扩容与缩容、更新与回滚等操作,并提供了具体示例和视频讲解。
455 0
|
Kubernetes Linux 调度
【赵渝强老师】K8s的周期性任务控制器CronJob
本文介绍了K8s中的CronJob控制器,它类似于Linux的crontab命令,用于管理和调度定时作业。CronJob可以设置在未来某一时间运行作业一次或在指定时间点重复运行作业。文章通过一个示例展示了如何创建和使用CronJob控制器,包括创建配置文件、应用配置、查看Pod信息和日志等步骤。同时,还解释了CronJob的时间表示方式及其限制。
239 0
|
Kubernetes 调度 容器
【赵渝强老师】K8s的Job控制器多工作队列的并行方式
Kubernetes Job 是一次性任务控制器,用于控制 Pod 中的容器执行特定任务。本文介绍了 Job 控制器的工作原理、运行方式及多工作队列并行执行的示例。示例中创建了 5 个作业,以 3 个队列并行执行,整个过程需 2 分钟。文中还提供了详细的 YAML 文件配置和执行命令。
260 0

推荐镜像

更多
下一篇
oss云网关配置