k8s服务发现与暴露
集群内服务发现coreDns
coreDns作用:将service名字和cluster ip自动关联
root@master1:~/k8s# kubectl get all -n kube-system
NAME READY STATUS RESTARTS AGE
pod/coredns-7bdc4cb885-5x56g 1/1 Running 2 (7h25m ago) 4d1h
pod/coredns-7bdc4cb885-wpzvj 1/1 Running 2 (7h25m ago) 4d1h
pod/etcd-master1.lzl.org 1/1 Running 4 (7h25m ago) 4d1h
pod/kube-apiserver-master1.lzl.org 1/1 Running 4 (7h25m ago) 4d1h
pod/kube-controller-manager-master1.lzl.org 1/1 Running 6 (7h25m ago) 4d1h
pod/kube-proxy-d7lbn 1/1 Running 4 (7h25m ago) 4d1h
pod/kube-proxy-n5wz8 1/1 Running 2 (7h25m ago) 4d
pod/kube-proxy-p2mbv 1/1 Running 0 6h30m
pod/kube-scheduler-master1.lzl.org 1/1 Running 6 (7h25m ago) 4d1h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 4d1h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 4d1h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/coredns 2/2 2 2 4d1h
NAME DESIRED CURRENT READY AGE
replicaset.apps/coredns-7bdc4cb885 2 2 2 4d1h
dig命令验证coredns能够解析正常解析域名:
注意:解析的是FQDN(是Fully Qualified Domain Name的缩写,意为“完全限定域名)服务名和cluster ip对应关系
上述域名的来源通过进入一个pod中查看dns配置即可得到答案:
集群外服务暴露ingress
ingress只能调度并暴露7层应用,特指http和https
ingress就是一组基于域名和URL路径,把用户的请求转发到指定service资源的规则,内部形同nginx+go脚本。
ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service
为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
ingress控制器是能够为ingress资源监听某套接字,然后根据ingress规则匹配机制路由调度流量的一个组件。
与作为 kube-controller-manager
可执行文件的一部分运行的其他类型的控制器不同, Ingress 控制器不是随集群自动启动的。
实践前
先明确ngressRoute 和 Ingress 的关系
Traefik 中 IngressRoute 和 Ingress 的关系如下:
IngressRoute 是 Traefik 自身的资源类型,用来定义路由规则。
而 Ingress 是 Kubernetes 原生的资源类型,用来定义进入集群的 HTTP 路由。
两者相比:
IngressRoute 更简单易用,专注于核心路由功能。
Ingress 除了路由外,还提供了其他功能,如基于名称的虚拟主机等。
Traefik 支持以下几种方式定义路由:
IngressRoute:使用 Traefik 自身的 IngressRoute 资源定义路由。这是最简单直接的方式。
Ingress:监听 Kubernetes 的 Ingress 资源,并根据 Ingress 来配置路由。
Annotations:监听 Service 资源的 annotations,根据 annotations 来配置路由。
CRD:监听自定义资源定义(CRD),根据 CRD 来配置路由。
其中使用 IngressRoute 定义路由最简单。
Traefik 会监听 IngressRoute 资源,并根据它来动态配置路由。
所以:
IngressRoute 是 Traefik 的资源,专注于提供路由功能。
Ingress 是 Kubernetes 原生资源,除了路由外还有其他功能。
两者可以用于定义 Traefik 的路由,具体使用哪个看各自需求。
有了 IngressRoute 资源后,可以完全不用 Ingress 资源,只用 IngressRoute 即可。
希望能够解答您的问题,如有疑问请继续提问。
ingressRoute实践
traefik做负载均衡器
以traefik为ingress控制器
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml
daemon方式安装traefik pod
# traefik.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress-controller
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: traefik
labels:
app: traefik
spec:
selector:
matchLabels:
app: traefik
template:
metadata:
labels:
app: traefik
spec:
serviceAccountName: traefik-ingress-controller
hostNetwork: true
containers:
- name: traefik
image: traefik:v2.10
ports:
- name: web
containerPort: 80
- name: admin
containerPort: 8080
args:
- --log.level=INFO
- --accesslog
- --api=true
- --api.dashboard=true
- --api.insecure #启用 api.insecure 模式时,Traefik 会在端口 8080 上公开仪表板。
- --metrics.prometheus=true
- --metrics.prometheus.addentrypointslabels
- --metrics.prometheus.addserviceslabels
- --entrypoints.web.address=:80
- --entryPoints.websecure.address=:443
- --providers.kubernetescrd #ingressRoute是traefik自定义资源,需要开启crd
- --providers.kubernetesingress=true # 允许开启ingress代理
---
apiVersion: v1
kind: Service
metadata:
name: traefik
spec:
ports:
- name: web
port: 80
targetPort: web
- name: websecure
port: 443
- name: admin
port: 8080
targetPort: admin
selector:
app: traefik
创建ingressRoute路由规则:访问http://traefik.lzlor.org的url路径重定向到8080应用即traefik dashboard。
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.lzlor.org`)
kind: Rule
services:
- name: traefik
port: 8080
ingress路由规则:访问http://traefik.lzlor.org/apps路由到whoami应用
kind: Deployment
apiVersion: apps/v1
metadata:
name: whoami
labels:
app: whoami
spec:
replicas: 1
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami
ports:
- name: web
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: whoami
spec:
ports:
- name: web
port: 80
targetPort: web
selector:
app: whoami
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: dashbord-ingress
spec:
rules:
- host: traefik.lzlor.org
http:
paths:
- path: /app
pathType: Exact
backend:
service:
name: whoami
port:
number: 80
效果如下: