K8S核心插件-ingress(服務暴露)控制器-traefik
目錄
1 K8S兩種服務暴露方法
前面通過coredns在k8s集群內部做了serviceNAME和serviceIP之間的自動映射,使得不需要記錄service的IP地址,只需要通過serviceNAME就能訪問POD
但是在K8S集群外部,顯然是不能通過serviceNAME或serviceIP來解析服務的
要在K8S集群外部來訪問集群內部的資源,需要用到服務暴露功能
1.1 K8S常用的兩種服務暴露方法
- 使用NodePort型的Service
nodeport型的service原理相當於端口映射,將容器內的端口映射到宿主機上的某個端口。
K8S集群不能使用ipvs的方式調度,必須使用iptables,且只支持rr模式 - 使用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.11
和7.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頁面.說明我們已經暴露服務成功