k8s ingress

Ingress

一、     什么是Ingress

通常情况下,service 和 pod 的 IP 仅可在集群内部访问。集群外部的请求需要通过负载均衡转发到 service 在 Node 上暴露的 NodePort 上,然后再由 kube-proxy 通过边缘路由器 (edge router) 将其转发给相关的 Pod 或者丢弃。

而 Ingress 就是为进入集群的请求提供路由规则的集合 

Ingress 可以给 service 提供集群外部访问的 URL、负载均衡、SSL 终止、HTTP 路由等。为了配置这些 Ingress 规则,集群管理员需要部署一个 Ingress controller,它监听 Ingress 和 service 的变化,并根据规则配置负载均衡并提供访问入口。

二、     Ingress代理结构

用户的请求直接到达Ingress控制器,Ingress控制器是通过Nginx实现的负载均衡。Nginx通过关联的service名称获取到对应pod的ip(endpoint的ip)加入到Nginx的负载均衡中。

官方文档:https://github.com/kubernetes/ingress-nginx/tree/master/deploy

三、     Ingress组成部分

Nginx:实现负载均衡到pod的集合

Ingress Controller:从集群api获取services对应pod的ip到nginx配置文件中

Ingress:为nginx创建虚拟主机

四、     部署Ingress

下载ymal配置文件

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml

如果启用了RBAC,那么还需要下面的两个:

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml

修改镜像地址为国内镜像,国外的需要×××,网速你懂的。

default-backend.yaml:

image: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4

with-rbac.yaml:

image: lizhenliang/nginx-ingress-controller:0.9.0

添加hostNetwork: true在serviceAccountName: nginx-ingress-serviceaccount下边

默认官方下载的没有hostNetwork: true这一项,这样就无法让用户访问到,这是一个坑

开始安装

// 创建命名空间

kubectl create -f namespace.yaml

// 创建默认虚拟主机

kubectl create -f default-backend.yaml

kubectl get pod -n ingress-nginx

// 创建tcp和udp configmap

kubectl create -f tcp-services-configmap.yaml

kubectl create -f udp-services-configmap.yaml

// 创建rbac角色

kubectl create -f rbac.yaml

// 部署Ingress Controller

kubectl create -f with-rbac.yaml

查看是不是部署起来了

kubectl get pod  -n  ingress-nginx

五、创建Ingress虚拟机

先创建两个测试的Pod,httpd和nginx

kubectl run --image=httpd httpd

kubectl run --image=nginx nginx

为pod创建service发布服务:

kubectl expose deployment nginx --port=80

kubectl expose deployment httpd --port=80

分别修改两个pod的默认页面,以后面的实验方便做准备

在node节点上测试访问

五、     创建ingress虚拟机

创建一个ymal文件 www-ingress.ymal

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: httpd-test

spec:

rules:

- host: www.httpd.com

http:

paths:

- backend:

serviceName: httpd

servicePort: 80

- host: www.nginx.com

http:

paths:

- backend:

serviceName: nginx

servicePort: 80

serviceName指定了service的名称,servicePort指定了service的端口,并且都绑定了一个域名进行访问。

kubectl create -f www-ingress.ymal

kubectl get ingress

Kubectl get pod –n ingress-nginx –o wide

在本机hosts文件中添加如下解析:然后访问,如果成功,证明ingress虚拟机部署成功了。

192.168.117.50  www.httpd.com

192.168.117.50  www.nginx.com

六、     Ingress-Controller具体实现

我们已经部署成功了一个ingress虚拟机,那么它是怎么工作的呢?

kubectl get pod -n ingress-nginx -o wide

kubectl exec -ti nginx-ingress-controller-6f64dc8cfb-dbvxj -n ingress-nginx bash

我们使用上面的命令进入到ingress-nginx的控制器中去:

可以看到,ingress使用nginx的upstream功能反向代理了node上的两个pod的endpoints ip和端口

 

七、     Ingress控制器扩容

现在的Ingress控制器只部署在了一个node节点上,这样的话无法通过访问另一个节点的ip来访问service,需要在扩容一个ingress:

kubectl scale --replicas=4  deploy/nginx-ingress-controller -n ingress-nginx

使用上面的命令扩容ingress为4个副本,这样可以保证我们4个Node节点上都有ingress控制器

现在,我们把Host改成如下,然后去浏览器测试一下。

192.168.117.70  www.httpd.com

192.168.117.80  www.nginx.com

八、     配置Ingress通过TLS访问(Ingress https)

创建CA

ca-csr.json

{

"CN": "yy",

"key": {

"algo": "rsa",

"size": 2048

},

"names": [

{

"C": "CN",

"L": "Shenzhen",

"ST": "Guangzhou"

}

]

}

ca-config.json

{

"signing": {

"default": {

"expiry": "168h"

},

"profiles": {

"www": {

"expiry": "8760h",

"usages": [

"signing",

"key encipherment",

"server auth"

]

},

"client": {

"expiry": "8760h",

"usages": [

"signing",

"key encipherment",

"client auth"

]

}

}

}

}

server-csr.json

{

"CN": "www.mycompany.com",

"key": {

"algo": "rsa",

"size": 2048

},

"names": [

{

"C": "CN",

"L": "Shenzhen",

"ST": "Guangzhou"

}

]

}

签发证书:

cfssl gencert --initca ca-csr.json | cfssljson -bare ca –

生成证书

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem --config=ca-config.json --profile=www server-csr.json | cfssljson -bare server

将证书导入集群

kubectl create secret tls ingress-https --key server-key.pem --cert server.pem

kubectl get secret
  查看证书导入

创建Https的ymal文件 https-ingress.ymal

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

name: https-test

spec:

tls:

- hosts:

- www.yy.com

secretName: ingress-https

rules:

- host: www.yy.com

http:

paths:

- backend:

serviceName: nginx

servicePort: 80

kubectl create -f https-ingress.ymal

浏览器访问,记得加Hosts,解析到任意的节点即可。

原文地址:http://blog.51cto.com/yylinfan/2116863

时间: 2024-08-30 17:40:56

k8s ingress的相关文章

K8s Ingress笔记

一 要理解一个概念,首先要明白它是干什么用的,然后再去理解它是怎么实现的.Ingress的作用就是提供一个集群外部访问集群内部的入口.那么它是怎么实现的呢,我们知道,集群内部的Cluster IP外部是无法直接访问到的,而在 K8s集群中,集群外部访问内部pod中的应用大概有以下几种形式: 1. 通过开启proxy模式访问Cluster IP.这种方式要求我们运行 kubectl 作为一个未认证的用户,因此我们不能用 这种方式把服务暴露到 internet 或者在生产环境使用. 2. 直接访问p

K8s Ingress 模式简介及示例

注: 默认本文读者具备一定的k8s基础,并对k8s的apiserver.service.controller manager等基本概念有所了解. 模式简介: Ingress在service之前加了一层ingress,结构如下: ingress -> service -> label selector -> pods www.ok1.com -> app1-service -> app1 selector -> app1 1234 Port:80 or other -&g

K8s Ingress Nginx 支持 Socket.io

Ingress 及 Ingress Controller 简介 Ingress:是k8s 资源对象,用于对外暴露服务,该资源对象定义了不同主机名(域名)及 URL 和对应后端 Service(k8s Service)的绑定,根据不同的路径路由 http 和 https 流量. Ingress Contoller:是一个pod服务,封装了一个Web前端负载均衡器,同时在其基础上实现了动态感知Ingress 并根据Ingress的定义动态生成前端web负载均衡器的配置文件,比如Nginx Ingre

前后端分离架构+k8s+ingress

一.概述 在前面几篇文章中,已经讲到了前后端分离架构和ingress,链接如下: https://www.cnblogs.com/xiao987334176/p/12195722.html https://www.cnblogs.com/xiao987334176/p/12195797.html 接下来使用k8s进行发布应用 二.演示3.0 环境说明 k8s集群 系统 docker ip 主机名 配置 centos 7.6 19.03.5 192.168.31.150 k8s-master 2核

streamsets k8s 部署试用

使用k8s 进行 streamsets的部署(没有使用持久化存储) k8s deploy yaml 文件 deploy.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: streamsets namespace: big-data labels: app: streamsets spec: replicas: 1 template: metadata: labels: app: streamsets spec

K8S基于ingress-nginx实现灰度发布

摘自:https://www.cnblogs.com/xiaoqi/p/ingress-nginx-canary.html 之前介绍过使用ambassador实现灰度发布,今天介绍如何使用ingre-nginx实现. 介绍 Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试. Nginx Annotations 支持以下 4 种 Canary 规则: nginx.ingress.kubernetes.i

kubernetes 西游记(持续更新中...)

随着微服务架构的流行,驾着云原生的趋势,容器化微服务就成为了持续交付最好的产物,kubernetes就成了运维容器最好的生态系统.实践出真知,自学习kubernetes以来,写了一系列文章,为了能够取长补短,查找知识的漏洞,将知识点形成体系,决定将之前写的文章做一个汇总,方便查看,也方便一目了然地发现欠缺的知识点,查漏补缺,围绕着微服务落地k8s,主要包括持续集成打包微服务成镜像.持续交付微服务镜像到企业私有仓库.持续部署微服务容器到kubernetes,希望打通这整个任督二脉,形成一条高度自动

istio 1.2.5及istio-cni 部署

环境 操作系统:CentOS Linux release 7.6.1810 (Core) 内核版本:Linux node03 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux kubernetes:Server Version: version.Info{Major:"1", Minor:"14", GitVersion:&quo

Tungsten Fabric入门宝典丨TF组件的七种“武器”

Tungsten Fabric入门宝典系列文章,来自技术大牛倾囊相授的实践经验,由TF中文社区为您编译呈现,旨在帮助新手深入理解TF的运行.安装.集成.调试等全流程.如果您有相关经验或疑问,欢迎与我们互动,并与社区极客们进一步交流.更多TF技术文章,请点击公号底部按钮>学习>文章合集. 作者:Tatsuya Naganawa 译者:TF编译组 Tungsten Fabric中有很多不同的组件.接下来我简要描述它们的用法. 概览 总体而言,Tungsten Fabric中包含7种角色和(多达)3