devops(2)- traefik安装

原文链接:https://blog.scorpii.net/2019/11/08/traefik/

先熟悉k8s

这一节我们先熟悉一下 k8s,并且利用这个过程了解为什么需要 traefik。如果你已经做过调研,可以安全的跳过这一节。

这一节的任务是部署一个 nginx 。我们需要编写配置文件,应用到 k8s 中。之后 k8s 会根据配置文件中的设置自动下载 nignx 的镜像并且运行。

首先第一个文件是 nginx-deployment.yml ,内容如下:

apiVersion: apps/v1 # 1.9.0 之前使用 apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1 # 告诉k8s只运行一个实例
  template: # 这下面是pod
    metadata:
      labels:
        app: nginx # 记住这里
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # nginx镜像
        ports:
        - containerPort: 80

这个配置文件部署了两个东西, poddeployment。它们的关系如下图所示。

[图片上传失败...(image-2561bb-1573183728438)]

podk8s 中调度的最小单位, deployment 是一个 controller 我们下面都称作控制器,它的目的就是按照配置文件所描述的那样控制 pod 的状态。如果 pod 挂了, deployment 负责重启 pod 。而如果 replicas 设置为2,就会变成下面这样:

[图片上传失败...(image-70b936-1573183728438)]

编写好以后,我们直接应用

应用配置文件

然后我们来看看 pod 的状态。

查看pod

看到已经 running 了,并且 ready 也是 1/1 了。

但是这个时候,我们只能在 k8s 内部访问这个 pod ,而不能从外部访问。

要想从外部访问,我们需要再写一个配置文件 nginx-service.yml 。看代码:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: nginx # 这里对应上面的 *记住这里*
  ports:
    - protocol: TCP
      port: 80 # k8s中服务的访问端口,用于k8s内部访问
      nodePort: 30000 # 映射到物理服务器上的端口,用于k8s外部访问,记住这个端口号
      targetPort: 80 # pod的端口

service 也是一个 controller,它的作用是暴露 pod 的服务。暴露哪个 pod 的服务呢?其实就是 selector 选中的 pod 。我们也来应用一下:

再一次应用配置文件

接着我们用命令看看这个 service

看看service

kubernetes 这个服务本来就有,我们先不管它。我们看到我们的 my-service 已经存在了。接着我们来访问访问。

no1
no2
no3

你猜的没错,我换 ip 了,不要在意这些细节。我们能看到的是,我们部署了一个 nginx ,而三台服务器相同的端口下面都能访问到。一般情况下,在线上只需要暴露一个服务器到公网即可。

配置文件可以合并,如果你愿意,可以把上面的两个配置文件的内容复制到一个文件中,用---(三个短横线)分割。

如果你深入研究 k8s 你会发现你找不到一个方法来做域名路由,实际上 k8s 也没有提供这样一个方法。也就是说,当你需要部署两个网站的时候,你只能通过端口号来区分它们。要想解决这个问题,我们就需要 traefik 了(终于绕回来了~)。

treafik

traefik 有一样作用的还有 nginx-ingress ,我们这里只研究 traefik

不过首先,我们需要修改一下 k8s 的配置。上面 nginx 的端口我设置的 30000 ,其实我是想设置 8080 的,但是失败了。

失败

上面说有效的端口是 30000-32767 ,这可不是我们想要了。所以,我们需要修改 api-server 这个 pod 的配置文件来让 k8s 接管几乎所有的端口。
api-server 这个 podk8s 自身的组件,它的配置文件是 /etc/kubernetes/manifests/kube-apiserver.yaml 。我们在启动参数中加入一项。
修改配置

由于这个系统组件的配置文件是常驻的,所有我们只需要保存,被修改的 pod 就会自动重启。
api-server 组件重启期间你是无法使用 k8s 命令的,这也说明其实真正执行我们命令的就是 api-server 组件。
观察

就在前段时间 traefik 发布了2.0版本,我们也直接来尝尝鲜。文档里其实已经讲的很详细了,上面说我们需要写四个配置文件。我们照着这个上面来,先应用第一个配置。就是文档里面的 IngressRoute Definition 节的第一个代码块。

traefik ingress route

第二个, traefikservice 配置(文档里面 service 节的第一个代码块),不过这里,我们需要改一改。

apiVersion: v1
kind: Service
metadata:
  name: traefik
spec:
  type: NodePort
  ports:
    - protocol: TCP
      name: web
      port: 80
      nodePort: 80
    - protocol: TCP
      name: admin
      port: 8080
      nodePort: 8080
    - protocol: TCP
      name: websecure
      port: 443
      nodePort: 443
  selector:
    app: traefik

我们应用它:

traefik service

最后是 deployment (文档里面 deployments 节的第一个代码块),也要改一改:

apiVersion: v1
kind: ServiceAccount
metadata:
  namespace: default
  name: traefik-ingress-controller
---
kind: Deployment
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
          args:
            - --api.insecure
            - --accesslog
            - --entrypoints.web.Address=:80 # http访问80
            - --entrypoints.websecure.Address=:443 # https访问443
            - --providers.kubernetescrd # 这个定式,固定写就好
            - --certificatesresolvers.default.acme.tlschallenge # 这个是let's Encrypt配置,跟下面两个固定写,可以自动帮你申请证书,你没有看错,是自动的。
            - --certificatesresolvers.default.acme.email=foo@you.com # 这地方填你自己邮箱地址,这样你能收到let's Encrypt对你这个域名的通知。
            - --certificatesresolvers.default.acme.storage=acme.json # 定式
          ports:
            - name: web # 端口可以命名,这样service就可以直接使用端口名代替端口,往上看service的配置文件。
              containerPort: 8000
            - name: websecure
              containerPort: 4443
            - name: admin
              containerPort: 8080

好,我们应用它:

traefik deployment

接着我们查看一下 pod

view pod

可以看到 traefikpod 已经 running 了,怎么确定它已经部署成功了呢?我们试试访问 808080443 我就不访问,因为是在本地虚拟机上面,公网到不到,所以 let's Encrypt 无法自动设置 https )。

80
8080

上面 404 是因为我们还没有部署任何服务, traefik 找不到要代理的东西,无奈的打出了 404
接下来我们看看怎么使用它。老规矩,上 nginx

apiVersion: apps/v1 # 1.9.0 之前使用 apps/v1beta2
kind: Deployment
metadata:
  name: new-nginx-deployment
spec:
  selector:
    matchLabels:
      app: new-nginx
  replicas: 1 # 告诉k8s只运行一个实例
  template: # 这下面是pod
    metadata:
      labels:
        app: new-nginx # 记住这里
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # nginx镜像
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: new-my-service
spec:
  # type: NodePort traefik会自己将服务暴露出来,所以不用我们自己暴露了
  selector:
    app: new-nginx # 这里对应上面的 *记住这里*
  ports:
    - protocol: TCP
      port: 80 # k8s中服务的访问端口,用于k8s内部访问
      # nodePort: 30000 # traefik会自己将服务暴露出来,所以不用我们自己暴露了
      targetPort: 80 # pod的端口

这个配置文件跟上面的没有太大区别,就是没有暴露服务,和改了名字。并且将 servicedeployment 合到了一起。应用它:

new nginx

关键的来了,为了让 traefik 暴露我们的服务,我们还需要一个配置:

# 这个是http
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: simpleingressroute
  namespace: default
spec:
  entryPoints:
    - web # 也就是traefik的80端口
  routes:
  - match: Host(`your.domain.com`) # 里面填你的域名,match还有其他函数(我们姑且就叫函数吧),可以参考文档
    kind: Rule
    services:
    - name: new-my-service # 填服务的名字
      port: 80

---
# 这个是https
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroutetls
  namespace: default
spec:
  entryPoints:
    - websecure # 也就是traefik的443端口
  routes:
  - match: Host(`your.domain.com`) # 里面填你的域名
    kind: Rule
    services:
    - name: new-my-service # 填服务的名字
      port: 80
  tls:
    certResolver: default

盘它~:

nginx ingress route

我们再来访问(访问之前记得添加 host ):

hosts
http

还是看一看 https 会是什么效果:

https

最后我们再来看看 traefik 管理端的情况:

dashboard
http

对了, traefik 2.0 加入的新特性之一就是支持 tcp 连接了,因为我了解到有一些变态大佬已经开始用二进制(比如 protobuf)来做前后端数据交互了。

tcp

上一篇:devops(1)- k8s安装记录

下一篇:devops(3)- helm的安装记录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容