设为首页 收藏本站
查看: 1089|回复: 0

[经验分享] Kubernetes 1.9集群使用traefik发布服务

[复制链接]

尚未签到

发表于 2018-9-15 13:25:16 | 显示全部楼层 |阅读模式
  在前文中介绍了在kubernetes 1.5.2集群环境中使用traefik进行服务发布。Traefik采用daemonset方式部署,连接api-server走的是http协议,也未配置rbac。本文将介绍在k8s 1.9版本中使用deployment方式部署traefik来进行服务发布。
  在开始之前,需要先了解一下什么是RBAC。RBAC(基于角色的访问控制)使用 rbac.authorization.k8s.io  API 组来实现权限控制,RBAC 允许管理员通过 Kubernetes API 动态的配置权限策略。在 1.6 版本中 RBAC 还处于 Beat 阶段,如果想要开启 RBAC 授权模式需要在 apiserver 组件中指定 --authorization-mode=RBAC 选项。
  在 RBAC API 的四个重要概念:
  Role:是一系列的权限的集合,例如一个角色可以包含读取 Pod 的权限和列出 Pod 的权限
  ClusterRole: 跟 Role 类似,但是可以在集群中到处使用( Role 是 namespace 一级的)
  RoloBinding:把角色映射到用户,从而让这些用户继承角色在 namespace 中的权限。
  ClusterRoleBinding: 让用户继承 ClusterRole 在整个集群中的权限。
  简单点说RBAC实现了在k8s集群中对api-server的鉴权,更多的RBAC知识点请查阅官方文档:https://kubernetes.io/docs/admin/authorization/rbac/
  一、给集群的节点打上label
  因为选择deployment方式部署,所以要给集群的节点打上label,后续选择nodeSelector指定traefik=proxy,副本数和集群节点数一致的时候,所有的节点上都会运行一个pod
  

# kubectl get nodes --show-labels  
# kubectl label  node vm1 traefik=proxy
  
# kubectl label  node vm2 traefik=proxy
  
# kubectl get nodes --show-labels
  

DSC0000.jpg

  二、准备yaml文件
  1、rbac文件
  

# cat traefik-rbac.yaml  
---
  
kind: ClusterRole
  
apiVersion: rbac.authorization.k8s.io/v1beta1
  
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
  

  在启用rbac的环境下,如果鉴权未配置清楚,则traefik pod会报错如下
  

E0226 00:15:27.729832 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Service: services is forbidden: User "system:serviceaccount:kube-system:default" cannot list services at the cluster scope  
E0226 00:15:29.013298 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:kube-system:default" cannot list endpoints at the cluster scope
  
E0226 00:15:29.213354 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Secret: secrets is forbidden: User "system:serviceaccount:kube-system:default" cannot list secrets at the cluster scope
  
E0226 00:15:29.698574 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1beta1.Ingress: ingresses.extensions is forbidden: User "system:serviceaccount:kube-system:default" cannot list ingresses.extensions at the cluster scope
  
E0226 00:15:30.411837 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Service: services is forbidden: User "system:serviceaccount:kube-system:default" cannot list services at the cluster scope
  
E0226 00:15:31.912887 1 reflector.go:199] github.com/containous/traefik/vendor/k8s.io/client-go/tools/cache/reflector.go:94: Failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:kube-system:default" cannot list endpoints at the cluster scope
  

DSC0001.jpg

  2、traefik的deployment文件
  

# cat traefik-deployment.yaml  
---
  
apiVersion: v1
  
kind: ServiceAccount
  
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  
---
  
kind: Deployment
  
apiVersion: extensions/v1beta1
  
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
  k8s-app: traefik-ingress-lb
  
spec:
  replicas: 2
  selector:
  matchLabels:
  k8s-app: traefik-ingress-lb
  template:
  metadata:
  labels:
  k8s-app: traefik-ingress-lb
  name: traefik-ingress-lb
  spec:
  serviceAccountName: traefik-ingress-controller
  hostNetwork: true
  nodeSelector:
  traefik: proxy
  terminationGracePeriodSeconds: 60
  containers:
  - image: traefik
  name: traefik-ingress-lb
  ports:
  - name: web
  containerPort: 80
  hostPort: 80
  - name: admin
  containerPort: 8081
  args:
  - --web
  - --web.address=:8081
  - --kubernetes
  

  3、traefik的service文件
  

# cat traefik-service.yaml  
apiVersion: v1
  
kind: Service
  
metadata:
  name: traefik-web-ui
  namespace: kube-system
  
spec:
  selector:
  k8s-app: traefik-ingress-lb
  ports:
  - port: 80
  targetPort: 8081
  

  4、通过yaml文件创建clusterrole、clusterrolebinding、deployment、serviceaccount、service
  

# ls  
# kubectl create -f traefik-rbac.yaml
  
# kubectl create -f traefik-deployment.yaml
  
# kubectl create -f traefik-service.yaml
  

DSC0002.jpg

  

# kubectl get pod -n kube-system  
# kubectl get svc -n kube-system
  
# kubectl get svc
  

DSC0003.jpg

  可以看到集群中default namespace中存在一个frontend服务。kube-system namespace中存在nginx-test、traefik-web-ui、kubernetes-dashboard三个服务。我们后续将创建4个ingress
DSC0004.jpg

  通过web-ui可以看到在两个节点上各运行了一个pod
  三、通过yaml文件创建ingress
  

# cat ui.yaml  
apiVersion: v1
  
kind: Service
  
metadata:
  name: traefik-web-ui
  namespace: kube-system
  
spec:
  selector:
  k8s-app: traefik-ingress-lb
  ports:
  - port: 80
  targetPort: 8081
  
---
  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
  kubernetes.io/ingress.class: traefik
  
spec:
  rules:
  - host: traefik-ui
  http:
  paths:
  - backend:
  serviceName: traefik-web-ui
  servicePort: 80
  

# cat webui-ing.yaml  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  name: traefik-ingress
  namespace: kube-system
  annotations:
  kubernetes.io/ingress.class: traefik
  
spec:
  rules:
  - host: k8s.webui
  http:
  paths:
  - backend:
  serviceName: kubernetes-dashboard
  servicePort: 443
  

# cat redis-ing.yaml  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  name: traefik-ingress
  namespace: default
  annotations:
  kubernetes.io/ingress.class: traefik
  
spec:
  rules:
  - host: k8s.frontend
  http:
  paths:
  - backend:
  serviceName: frontend
  servicePort: 80
  

# cat nginx-ing.yaml  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  name: traefik-nginx-ingress
  namespace: kube-system
  annotations:
  kubernetes.io/ingress.class: traefik
  
spec:
  rules:
  - host: test.fjhb.cn
  http:
  paths:
  - backend:
  serviceName: nginx-test
  servicePort: 80
  

# kubectl create -f ui.yaml  
# kubectl create -f webui-ing.yaml
  
# kubectl create -f redis-ing.yaml
  
# kubectl get ingress
  
# kubectl get ingress -n kube-system
  

DSC0005.jpg

  三、验证
  1、通过访问traefik service对应的nodeport端口,4个ingress配置都加载到了
DSC0006.jpg

  2、修改测试机hosts文件,将4个域名的解析分配到两台节点上
DSC0007.jpg

  3、浏览器访问测试
DSC0008.jpg

  这里出现500错误的原因是,后端的kubernetes-dashboard配置的是https协议
DSC0009.jpg

DSC00010.jpg

DSC00011.jpg

  可以在health页面看到http状态码的统计信息
DSC00012.jpg




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-583595-1-1.html 上篇帖子: 实用干货:Kubernetes中的负载均衡全解 下篇帖子: 如何在Rancher 2.0 TP2 Kubernetes集群中添加自定义节点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表