在 k8s 中通过 Ingress 配置域名访问

https://juejin.im/post/5db8da4b6fb9a0204520b310

在上篇文章中我们已经使用 k8s 部署了第一个应用,此时我们可以使用 Ingress 使它可以在互联网上可以被访问到 (当然你要有自己的域名并且指向正确)

以下是官网搬用的关于 Ingress 的一幅图,用以描述 Ingress 的作用。如果你对它一无所知,你可以把它理解为传统的 nginx,用以配置自己网站的域名使之能够通过外网访问。

internet
    |
[ Ingress ]
--|-----|--
[ Services ]
复制代码

其中,Ingress 包含两个组件

  • Ingress: 配置转发规则,类似于 nginx 的配置文件
  • Ingress Controller: 转发,类似于 nginx,它会读取 Ingress 的规则并转化为 nginx 的配置文件

而 Ingress Controller 除了 nginx 外还有 haproxyingress 等等,我们选用 nginx 作为 Ingress Controller

使用 helm 部署 nginx Ingress Controller

我们使用 helm 选择官方的 stable/nginx-ingress chart 进行部署。

nginx-ingress 会配置一个 type 为 LoadBalancer 的 service, 因此需要配置 EXTERNAL-IP 为k8s集群节点的 IP。 在这里 external-ip 会设置为 [172.17.68.39, 172.17.68.40]

我们可以通过 kubectl get nodes 来获取 IP 地址

# 获取node的 INTERNAL-IP,作为 LoadBalancer 的 EXTERNAL-IP
$ kubectl get nodes -o wide
NAME       STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
shanyue    Ready    master   13d   v1.16.0   172.17.68.39   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.6.2
shuifeng   Ready    <none>   13d   v1.16.0   172.17.68.40   <none>        CentOS Linux 7 (Core)   3.10.0-957.21.3.el7.x86_64   docker://18.6.2
复制代码

在这里 external-ip 会设置为 [172.17.68.39, 172.17.68.40]

controller.service.externalIPs[0]=172.17.68.39
controller.service.externalIPs[1]=172.17.68.40
复制代码
# 使用 helm v3 部署,如果使用 helm v2 部署的话,把 release-name 使用 --name 指定
$ helm install nginx-ingress stable/nginx-ingress --set "controller.service.externalIPs[0]=172.17.68.39,controller.service.externalIPs[1]=172.17.68.40"
NAME: nginx-ingress
LAST DEPLOYED: 2019-10-18 21:21:44.115902395 +0800 CST m=+1.904554085
NAMESPACE: default
STATUS: deployed
NOTES:
The nginx-ingress controller has been installed.
It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running 'kubectl --namespace default get services -o wide -w nginx-ingress-controller'

An example Ingress that makes use of the controller:

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    rules:
      - host: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls
复制代码

校验 nginx-ingress 的部署情况

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART
nginx-ingress   default         1               2019-10-18 11:21:44.115902395 +0800 CST deployed        nginx-ingress-1.24.0

# 查看 nginx-ingress 所有的 service
$ kubectl get svc -l app=nginx-ingress
NAME                            TYPE           CLUSTER-IP     EXTERNAL-IP                 PORT(S)                      AGE
nginx-ingress-controller        LoadBalancer   10.101.64.64   172.17.68.39,172.17.68.40   80:30285/TCP,443:31094/TCP   7m19s
nginx-ingress-default-backend   ClusterIP      10.110.76.15   <none>                      80/TCP                       7m19s
复制代码

配置 Ingress 映射域名

与已知知识关联有助于我们更好地学习新知识,以下是关于 nginx 与 ingress 部署一个博客应用的简单配置文件

  1. 外网通过域名 nginx.xiange.tech 来访问应用
  2. 代理服务 nginx 来做负载均衡
  3. nginx 暴露出 80 端口
server {
  listen 80
  server_name nginx.xiange.tech

  location / {
    proxy_pass: http://nginx:80
  }
}
复制代码

使用 Ingress 配置路由规则如下

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-service-ingress
spec:
  rules:
  - host: nginx.xiange.tech
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
        path: /
复制代码

我们使用 Ingress 把它配置到了 nginx.xiange.tech 该域名下,在公网环境下的浏览器中打开域名 nginx.xiange.tech,可以看到熟悉的 nginx 配置页面

小结

部署一个应用从 DeploymentService 再到 Ingress 的完整配置文件如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

---

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nginx-service-ingress
spec:
  rules:
  - host: nginx.xiange.tech
    http:
      paths:
      - backend:
          serviceName: nginx-service
          servicePort: 80
        path: /
复制代码

关注我

欢迎关注公众号山月行,我会定期分享一些前后端以及运维的文章,并且会有技术与生活上的每日回顾与总结,欢迎关注交流

[转帖]在 k8s 中通过 Ingress 配置域名访问的更多相关文章

  1. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

  2. k8s 中的 ingress 使用细节

    k8s中的ingress 什么是ingress Ingress 如何使用 ingress 使用细节 参考 k8s中的ingress 什么是ingress k8s 中使用 Service 为相同业务的 ...

  3. 修改Host,配置域名访问

    修改Host,配置域名访问   虽然我们已经能够通过localhost访问本地网站了,为了提高逼格,我们可以修改host文件,设置一个自己喜欢的域名指向本地网站,岂不是更高大上. 明确需求 通过配置, ...

  4. openstack配置域名访问

    #openstack配置域名访问 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html #主要是在默认配置的基础上,做了个 ...

  5. vue配置域名访问

    vue配置域名访问其实很简单,新建一个vue的项目,不废话,直接上截图 红色框住的两行就是设置访问的域名以及端口,默认是host: localhost port: 8080 像这样修改之后,重启项目, ...

  6. 如何为k8s中的pod配置QoS等级?

    1.概述 本文介绍如何为pod分配特定的QoS等级. 我们知道,在k8s的环境中,通过使用QoS等级来做决定,在资源紧张的时候,将哪些的pod进行驱逐,或者说如何对pod进行调度. OK,话不多说,让 ...

  7. linux下xampp(apache)中配置域名访问,以及遇到的问题

    xampp中apache使用域名访问 一.首先找到/opt/lampp/etc/httpd.conf: # Virtual hosts Include etc/extra/httpd-vhosts.c ...

  8. Nginx (安装+ 配置域名+ 访问认证 +发布文件)

    一.Nginx介绍: Nginx是一款高性能的HTTP和反向代理服务器,能够选择高效的epoll(linux2.6内核).kqueue(freebsd).eventport(solaris10)作为网 ...

  9. 阿里云服务器CentOS6.9 tomcat配置域名访问

    之前一直是ip访问项目,今天申请到一个测试域名,想要用设置用域名访问项目. 1.进入阿里云服务器中,修改tomcat中server.xml文件 cd /usr/local/apache-tomcat/ ...

随机推荐

  1. Dubbo源码分析:ThreadPool

    定义了通过URL对象作为参数获取Executor对象的getExecutor方法.所有实现ThreadPool接口的类都是基于ThreadPoolExecuotr对象来实现的. 类图

  2. 题解 UVa11461

    题目大意 多组数据,每组数据给出两个正整数 \(a,b\),请求出 \(a,b\) 之间的完全平方数的个数. 分析 前缀和即可. #include<bits/stdc++.h> using ...

  3. SQL Server 中PAGELATCH_x和PAGEIOLATCH_x解析

    0.参考文献 Microsoft SQL Server企业级平台管理实践 第11章 Buffer Latch Timeout的解析 什么是PAGELATCH和PAGEIOLATCH 1.PAGELAT ...

  4. BZOJ 4477: [Jsoi2015]字符串树 可持久化trie树

    这个是真——可持久化字典树..... code: #include <bits/stdc++.h> #define N 100006 #define setIO(s) freopen(s& ...

  5. C++中继承 声明基类析构函数为虚函数作用,单继承和多继承关系的内存分布

    1,基类析构函数不为虚函数 #include "pch.h" #include <iostream> class CBase { public: CBase() { m ...

  6. .NET体系结构

    主要内容包括: C#与.NET的关系.公共语言运行库.中间语言.程序集..NET Framework类.名称空间.内层管理... C#与.NET的关系 C#是门高级编程语言,.NET(Framewor ...

  7. 函数(定义、参数、return、变量、作用域、预解析)

    一.函数定义 1.方式一       function 函数名(参数){  函数体  }——————函数声明的方法 function fn(a){ console.log(a); }: 2.方式二  ...

  8. Redis BGSAVE因为内存不足 fork 失败导致目标 Redis 无法访问的问题

    中秋的时候正在外面愉快的在外卖喝着咖啡玩电脑......突发 redis 报警从 sentry 应用端曝出的错误 MISCONF Redis is configured to save RDB sna ...

  9. nRF51822 的两路 PWM 极性

    忙了一阵这个PWM,玩着玩着终于发现了些规律.Nordic 也挺会坑爹的. nRF51822 是没有硬件 PWM 的,只能靠一系列难以理解的 PPI /GPIOTE/TIMER来实现,其实我想说,我醉 ...

  10. hive 整合ranger

    一.安装hive插件 1.解压安装 #  tar zxvf ranger-2.0.0-SNAPSHOT-hive-plugin.tar.gz -C /data1/hadoop/ 2.修改install ...