CentOS上安装Kubernetes集群(四)使用Traefi暴露Kubernetes服务

k8s的集群大多数情况需要对外服务,而服务暴露的方式有很多,这里选取traefik来讲解,其它就暂时不详细介绍,包括Istio,代后续更新后再补充上来。一句话,来不及解释,赶紧上车。

Traefkik简介

Traefik是开源边缘路由器,类似 nginx、apache 那样的反向代理服务器、网关,代表系统接收请求,并找出负责处理这些请求的组件。Traefik自动发现适合您服务的配置,同时热更新支持多种负载均衡算法断路器,重试提供监控、管理 UI 界面用 go 语言开发,天然的拥抱 k8s

Traefik 2.0 几个值得关注的功能

  • 使用 CRD 来完成之前 Ingress + 注解的功能
  • 支持多协议的 TCP 端口路由
  • 引入了 MiddleWare,使用中间件完全自定义路由
  • 金丝雀发布

部署Traefik

部署规划

本人的k8s环境是一台华为TaiShan2280v2的ARM服务器+多台x86_64服务器,TaiShan2280v2服务器作为master节点,同时运行traefik组为边界路由和负载均衡器(本人的应用需求没有那么高,想充分利用这台新近的ARM服务器,高可用方面暂时没有考虑,后续会逐渐跟上),而其它服务器则只作为node节点。Traefik作为边界路由、负载均衡,采用了hostport+特定节点的方式进行部署。

部署CRD资源

比较固定,使用官方文档即可

创建traefik-crd.yaml文件

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingre***outes.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Ingre***oute
    plural: ingre***outes
    singular: ingre***oute
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingre***outetcps.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Ingre***outeTCP
    plural: ingre***outetcps
    singular: ingre***outetcp
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: middlewares.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Middleware
    plural: middlewares
    singular: middleware
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: tlsoptions.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TLSOption
    plural: tlsoptions
    singular: tlsoption
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: traefikservices.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TraefikService
    plural: traefikservices
    singular: traefikservice
  scope: Namespaced

创建CRD(CustomResourceDefinition)资源

$ kubectl apply -f traefik-crd.yaml

创建 RBAC 权限

Kubernetes 在 1.6 版本中引入了基于角色的访问控制(RBAC)策略,方便对 Kubernetes 资源和 API 进行细粒度控制。Traefik 需要一定的权限,所以这里提前创建好 Traefik ServiceAccount 并分配一定的权限。

创建 traefik-rbac.yaml 文件

apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: default
  name: traefik-ingress-controller
---
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
  - apiGroups:
      - extensions
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - traefik.containo.us
    resources:
      - middlewares
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingre***outes
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingre***outetcps
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - tlsoptions
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - traefikservices
    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: default

创建RBAC资源

$ kubectl apply -f traefik-rbac.yaml

节点设置(可选)

标签

因为我的集群里面有ARM服务器,想让traefik运行在特定的节点上,该节点也作为负载均衡和路由节点,因此需要设置标签,当然我这里的环境也可以不用设置,因为ARM服务器只有一台),直接利用系统的标签也可以。

设置标签

$ kubectl label node taishan2280v2 IngressProxy=true

查看标签

$ kubectl get nodes --show-lables

通过查看标签命令可以看见默认设置的标签,可以自己加以利用。

设置污点taints和容忍tolerations

查看污点 taint

污点是设置在 Node 节点上,所以我们可以通过查看节点信息来查找该节点是否设置污点以及对污点的信息。查看节点名称如下:

  • 语法:kubectl describe nodes [节点名]
$ kubectl describe node 

显示节点信息如下:

Name: taishan2280v2
Labels: beta.kubernetes.io/arch=arm64
             beta.kubernetes.io/os=linux
             kubernetes.io/hostname=master.k8s
Annotations:  volumes.kubernetes.io/controller-managed-attach-detach=tr
Taints: node-role.kubernetes.io/master:NoSchedule     #污点信息

设置容忍 tolerations

如果计划调度的节点有污点设置,则部署的时候需要相应的设置,详见下面的部署文件。

参考

关于污点taints和容忍tolerations,详见参考文档(待写:))

部署Traefik

部署Traefik采用Daemonset+hostport方式(兼顾后期hostport+特定节点)

创建traefik-deploy.yaml

# 创建和RBAC相关的ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: default
  name: traefik-ingress-controller

---
# 创建traefik服务
apiVersion: v1
kind: Service
metadata:
  name: traefik

spec:
  ports:
    - protocol: TCP
      name: web
      port: 8000
    - protocol: TCP
      name: admin
      port: 8080
    - protocol: TCP
      name: websecure
      port: 4443
  selector:
    app: traefik

---
# 创建traefik的daemonset
kind: DaemonSet
apiVersion: apps/v1
metadata:
  namespace: default
  name: traefik
  labels:
    app: traefik

spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
        - name: traefik
          image: traefik:v2.0.7
          args:
            - --api.insecure
            - --accesslog
            - --entrypoints.web.Address=:8000
            - --entrypoints.websecure.Address=:4443
            - --providers.kubernetescrd
            - --certificatesresolvers.default.acme.tlschallenge
            - [email protected]
            - --certificatesresolvers.default.acme.storage=acme.json
            # Please note that this is the staging Let‘s Encrypt server.
            # Once you get things working, you should remove that whole line altogether.
            - --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
          ports:
            - name: web
              containerPort: 8000
              hostPort: 8000
            - name: websecure
              containerPort: 4443
              hostPort: 4443
            - name: admin
              containerPort: 8080
          resources:
            limits:
              cpu: 2000m
              memory: 1024Mi
            requests:
              cpu: 1000m
              memory: 1024Mi
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
      tolerations: #设置容忍所有污点,防止节点被设置污点
        - operator: "Exists"
      nodeSelector: #设置node筛选器,在特定label的节点上启动
        IngressProxy: "true"

注意:此处的镜像用的是traefik:v2.0.7,写这篇文章的时候2.1.1也出来了,我自己也调试过,换个版本有问题!

部署traefik

kubectl apply -f traefik-deploy.yaml

配置Traefik路由规则

配置 HTTP 路由规则 (Traefik Dashboard 为例)

Traefik 应用已经部署完成,但是想让外部访问 Kubernetes 内部服务,还需要配置路由规则,这里开启了 Traefik Dashboard 配置,所以首先配置 Traefik Dashboard 看板的路由规则,使外部能够访问 Traefik Dashboard。

创建 Traefik Dashboard 路由规则文件 traefik-dashboard-route.yaml

apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: traefik-dashboard-route
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`traefik`)
      kind: Rule
      services:
        - name: traefik
          port: 8080

创建 Traefik Dashboard 路由规则对象

$ kubectl apply -f traefik-dashboard-route.yaml

接下来配置 Hosts,客户端想通过域名访问服务,必须要进行 DNS 解析,由于这里没有 DNS 服务器进行域名解析,所以修改 hosts 文件将 Traefik 指定节点的 IP 和自定义 host 绑定。我自己的如下:

172.17.1.254  traefik 

配置完成后,打开浏览器输入地址:http://traefik 打开 Traefik Dashboard。

配置 HTTPS 路由规则(Kubernetes Dashboard 为例)

Kubernetes 的 Dashboard 看板,它是 Https 协议方式,由于它是需要使用 Https 请求,所以我们配置基于 Https 的路由规则并指定证书。

  • 创建自签名证书
$ openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=kubernetes-dashboard-admin"
  • 将证书存储到 Kubernetes Secret 中
$ kubectl create secret generic kubernetes-dashboard-admin--from-file=tls.crt --from-file=tls.key -n kubernetes-dashboard
  • 创建kubernetes-dashboard的账户和相关绑定。

1.创建文件kubernetes-dashboard-admin.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
   k8s-app: kubernetes-dashboard
  name: dashboard-admin
  namespace: kubernetes-dashboard

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: dashboard-admin-bind-cluster-role
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: dashboard-admin
  namespace: kubernetes-dashboard

2.创建账户和绑定

$ kubectl apply -f kubernetes-dashboard-admin.yaml -n kubernetes-dashboard
  • 创建 Traefik Dashboard 路由规则文件 kubernetes-dashboard-route.yaml
apiVersion: traefik.containo.us/v1alpha1
kind: Ingre***oute
metadata:
  name: kubernetes-dashboard-route
spec:
  entryPoints:
    - websecure
  tls:
    secretName: kubernetes-dashboard-admin
  routes:
    - match: Host(`kubernetes-dashboard`)
      kind: Rule
      services:
        - name: kubernetes-dashboard
          port: 443
  • 创建 Kubernetes Dashboard 路由规则对象
$ kubectl apply -f kubernetes-dashboard-route.yaml -n kubernetes-dashboard
  • 查卡记录token
kubectl describe secret/$(kubectl get secret -n kube-system |grep admin|awk ‘{print $1}‘) -n kubernete-dashboard
  • 配置 Hosts 文件,使用token进行访问
172.17.1.254  kubernetes-dashboard

配置完成后,打开浏览器输入地址:https://kubernetes-dashboard.

有关Kubernetes DashBoard的详细部署见(待写)

原文地址:https://blog.51cto.com/huanghai/2462856

时间: 2024-08-27 00:04:55

CentOS上安装Kubernetes集群(四)使用Traefi暴露Kubernetes服务的相关文章

在CentOS上安装Hadoop集群(一)-- Centos系统配置

在CentOS上安装Hadoop集群(一) 1.  Centos的系统配置 1.1打开终端方式: 方式1:在桌面单击右键,>>Open in terminal 方式2:Applications菜单上选择System tools -> Terminal 打开了 1.2配置网络环境 查看ip地址命令:ifconfig 网络安装命令:setup 重启网络服务命令:service network restart 网络连接命令:ifup eth0 如图所示,电脑有个红叉表示网络未连接 ifconf

CentOS7.5 使用 kubeadm 安装配置 Kubernetes 集群(四)

在之前的文章,我们已经演示了 yum 和二进制方式的安装方式,本文我们将用官方推荐的 kubeadm 来进行安装部署. kubeadm 是 Kubernetes 官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验kubeadm可以学习到Kubernetes官方在集群配置上一些新的最佳实践. 一.环境准备 1.软件版本 软件 版本 kubernetes v1.12.2 CentOS 7.

在CentOS 7上安装Kafka集群

一.安装准备1.修改系统配置#关闭selinux.firewall#修改/etc/security/limits.conf添加以下内容: soft nofile 65536 hard nofile 65536 soft nproc 65536 hard nproc 65536 #修改/etc/security/limits.d/20-nproc.conf soft nproc 655363.创建账户.目录groupadd -g 800 kafkauseradd -u 800 -g kafka k

Windows Server 2008 R2系统上安装SQLServer2012集群(简略)

4台服务器(1台AD.2台SQL服务器.1台iSCSI存储服务器) 9个IP(1个AD的IP.2个SQL服务器的IP.2个心跳IP.1个iSCSI存储服务器的IP.1个集群IP.1个DTC的IP.1个集群的IP) 1.搭建域环境 DCServer的IP地址配置为192.168.80.200,DNS:192.168.80.200 在DCServer上运行dcpromo安装AD 2.node1和node2以及存储服务器加入域 3.在存储服务器上安装StarWind,再添加一个硬盘并且格式化,打开St

Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)

1下载hadoop 2安装3个虚拟机并实现ssh免密码登录 2.1安装3个机器 2.2检查机器名称 2.3修改/etc/hosts文件 2.4 给3个机器生成秘钥文件 2.5 在hserver1上创建authorized_keys文件 2.6将authorized_keys文件复制到其他机器 2.7 测试使用ssh进行无密码登录 2.7.1在hserver1上进行测试 2.7.2在hserver2上进行测试 2.7.3在hserver3上进行测试 3安装jdk和hadoop 3.1安装JDK 3

kubernetes集群内通过endpoint访问外部服务

kubernetes内的服务访问集群外独立的服务最好通过endpoint方式,例如MySQL 1.创建mysql-service.yaml apiVersion: v1 kind: Service metadata: name: mysql-production namespace: ms spec: ports: - port: 3306 targetPort: 3306 protocol: TCP 2.创建mysql-endpoints.yaml kind: Endpoints apiVer

CentOS 7 安装 zookeeper集群

1.安装jdk yum -y install java-1.8.0-openjdk 2.下载并解压 tar -zxvf zookeeper-3.4.12.tar.gz -C /usr/local 3.改名 cd /usr/localmv zookeeper-3.4.12 zookeeper 上面的操作,三台虚拟机相同 4.修改配置文件 将/conf目录下的zoo_sample.cfg文件拷贝一份, 命名为为zoo.cfgcd /usr/local/zookeeper/confcp zoo_sam

CentOS 7.5 使用 yum 源安装 Kubernetes 集群(二)

一.安装方式介绍 1.yum 安装 目前CentOS官方已经把Kubernetes源放入到自己的默认 extras 仓库里面,使用 yum 安装,好处是简单,坏处也很明显,需要官方更新 yum 源才能获得最新版本的软件,而所有软件的依赖又不能自己指定,尤其是你的操作系统版本如果低的话,使用 yum 源安装的 Kubernetes 的版本也会受到限制,通常会低于官方很多版本,我安装的时候目前官方版本为1.12,而 yum 源中的版本为1.5.2. 2.二进制安装 使用二进制文件安装,好处是可以安装

Centos7 下安装入门级别的kubernetes集群

前情说明: 三台Centos7系统的虚拟机(1个master+2个node),三台机器上的防火墙,SELINUX全部关掉.我的实验坏境可以上网,默认的YUM源就可以用. 1.什么是kubernetes Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部:Borg).在Docker技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性. Kubernetes优势: - 容器编排         - 轻量级

二进制部署 Kubernetes 集群

二进制部署 Kubernetes 集群 提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. kubeadm Kubeadm也是一个工具,提供kubeadm init和kubeadm join指令,用于快速部署Kubernetes集群. 二进制包 从官方下载发行版的二进制包,手动部署每个组件,组成Kubernetes集群. 小结:生产环境中部署Kub