• Kubernetes部署Ingress


    Ingress基本概念

    通俗来讲,ingress和Service、Deployment,也是一个k8s的资源类型,ingress用于实现用域名的方式访问k8s内部应用。

    通过用户访问的 URL,把请求转发给不同的后端 Service。这种全局的,为了代理不同后端Service而设置的负载均衡服务,就是Kubernetes里的Ingress服务。

    client  >  负载均衡(nginx) > ingress  > service >  pod     (客户请求至负载均衡,负载均衡在到达ingress,ingress分发至不同server,server分配至pod)

    1、部署ingress-nginx

    获取配置文件:https://github.com/kubernetes/ingress-nginx/blob/nginx-0.20.0/deploy/mandatory.yaml

    这边下载失败,直接拷贝内容自己创建mandatory.yaml。

    查看一下文件需要下载一个镜像,镜像比较大,就在一台node上面直接执行下载。

    在两个node上直接下载镜像:docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0

    以上操作完成,在k8s执行:

    kubectl apply -f mandatory.yaml

    执行完成查看:kubectl get pod -n ingress-nginx

    然后将ingress暴露出去:vim  service-nodeport.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
          nodePort: 32080  #http
        - name: https
          port: 443
          targetPort: 443
          protocol: TCP
          nodePort: 32443  #https
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx

    查看暴露出去的ingress服务:kubectl get svc -n ingress-nginx

    2、创建一个server及后端deployment(以nginx为例)

    vim  svc-deployment.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    ###注释:定义pod
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
    ####注释:添加server
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
    spec:
      selector:
        app: myapp
      ports:
      - name: http
        port: 80
        targetPort: 80

    查看创建的pod

    查看创建的server

     测试通过svc访问pod,nginx副本数三个,修改的html文件访问时现实顺序。

    然后将nginx加入ingress中,我们定义的名字为myapp,创建时候需要用到myapp名字。

    vim ingress.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-test
    spec:
      rules:
        - host: www.test.com
          http:
            paths:
            - path: /
              backend:
                serviceName: myapp
                servicePort: 80
    ###注释
    host:添加一个域名,测试时候通过域名访问
    serviceName:将svc添加至ingress中

    创建kubectl   apply -f   ingress.yaml

    查看是否创建:kubectl get ingress

    查看ingrss对外80暴露的端口是32080

    kubectl get svc -n ingress-nginx

    上面我们给ingress的yaml文件中设置了一个域名:www.test.com  我们通过外部windowns访问时就需要修改win的hosts文件

    修改路径:C:\Windows\System32\drivers\etc\hosts

    添加域名,及k8s服务器的ip地址。

    然后测试访问,看是否通过域名可以访问。

    ingress中添加的域名地址为:www.test.com ,ingress的80对外端口是32080,我们通过域名加端口进行访问测试,看是否能访问成功,访问成功是否是轮询访问三台nginx。

     

    由此可见通过ingress访问server,server在分发至pod访问成功。

    ingress扩展

    项目中有的需要https访问时就需要添加证书进行访问,以下就是ingress添加https

    首先测试环境,手动生成一个简单的证书用于测试。

    #创建公私钥
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
    
    #通过kubectl的secret将证书封装,定义一个名称(tls-secret)将其封装进去
    kubectl create secret tls tls-secret --key tls.key --cert tls.crt 

     创建完成执行封装

    创建一个deployment,svc用于实验还是用nginx镜像

    vim  svc-deployment     (跟之前一样deployment,svc是不变的,主要是在ingress里面添加封装的证书)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp-ser
    spec:
      selector:
        app: myapp
      ports:
      - name: http
        port: 80
        targetPort: 80
    

    kubectl apply -f svc-deployment.yaml

    查看是否创建deployment,及svc

     创建ingress:vim  ingress.yaml

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-https
    spec:
      tls:
        - hosts:
          - www.min.com                       #证书添加域名  
          secretName: tls-secret             #指定封装的证书
      rules:
        - host: www.min.com                 #指定域名
          http:
            paths:
            - path: /
              backend:
                serviceName: myapp-ser        #指定server的名称调用server
                servicePort: 80

    创建完成进行查看

    域名访问需要在本地添加hosts    地址:C:\Windows\System32\drivers\etc\hosts

    查看ingress的443对外端口:kubectl get svc -n ingress-nginx

    输入地址测试:https://www.min.com:32443,是否是以https进行访问

    由此可见配置ingress的https访问测试成功。

    ingress的nginx地址重写扩展

    在上面(配置ingress的https)中我们使用的是https访问(https://www.min.com:32443)。为了测试创建一个svc,及deployment,然后通过ingress进行重定向至https网站

    创建一个www.max.com网站,重定向至:https://www.min.com:32443

    vim  svc-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-rewrite
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: myapp1
      template:
        metadata:
          labels:
            app: myapp1
        spec:
          containers:
          - name: myapp1
            image: nginx
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-rewrite-ser
    spec:
      selector:
        app: myapp1
      ports:
      - name: http1
        port: 80
        targetPort: 80

    创建完成查看

     然后创建ingress,进行重定向

    vim  ingress.yaml

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: nginx-inge-wir
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: https://www.min.com:32443
    spec:
      rules:
      - host: www.max.com    #对外提供网站
        http:
          paths:
          - path: /
            backend:
              serviceName: nginx-rewrite-ser
              servicePort: 80
    
    #访问www.max.com,然后重新定向至https的www.min.com网站上去。

     创建完成查看

    还是需要在本地的win系统内hosts添加一个www.max.com的域名

    已经添加hosts,我们访问www.max.com:32080,看是否能跳转至https://www.min.com:32443

     

    ingress的重定向已经完成并且成功。

    ingress还提供了很多功能,可以在官网一一查看学习(Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/)

    作者: 阿隆
    不足之处,欢迎技术指导。
  • 相关阅读:
    常用设计模式
    文件上传相关报错: The current request is not a multipart request或is a MultipartResolver configured?
    Intellij IDEA 与 Gitlab 实现代码上传与下载
    Oracle两表关联,只取B表的第一条记录
    notepad++ 调整行间距
    Ubuntu18.04直接安装python3.7或者升级自带的python3.6版本之后导致终端无法打开的解决办法
    黑苹果之DELL台式机安装Mac OS X 10.13.6版本操作系统
    Windows Ping | Tracert 's Bat 脚本并行测试
    centos 7 修改 sshd | 禁止 root 登录及 sshd 端口脚本定义
    C语言中malloc函数的理解
  • 原文地址:https://www.cnblogs.com/sxshaolong/p/15562104.html
Copyright © 2020-2023  润新知