Ingress 介绍

Kubernetes 上部署的微服务运行在它的私有网络中, 通过Pod实例的hostPort或Service实例的NodePort可以暴露到主机端口上,便于用户访问。但这样的方法会占有多台主机的HTTP端口或一台主机的多个端口,既浪费端口资源又增加管理难度和安全风险。

K8S的 Ingress 对象提供了另一种服务暴露的方法,它只占用一台主机的 HTTP 端口,通过虚拟主机或者虚拟目录的方式为K8S上的所有HTTP服务提供暴露服务,还能实现 HTTPS、负载均衡、状态统计等功能。

K8S 的 nginx ingress 的作用类似于 mesos 的 marathon-lb,不同点是:前者基于 nginx;后者基于 haproxy。

关于nginx ingress的安装,K8S有相关说明,网上也有很多文档可参考:

https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx

但在前期安装中,按照官网的说明并没有成功,查阅了大量资料,并结合实践最终排除了问题。下面分享一下我的安装过程。

1. 准备安装环境

K8S 1.2

2. 启用Kubernetes API 认证

http://kubernetes.io/docs/admin/authentication/

这一步不能忽略,否则nginx ingress无法启动;

还有几点要特别注意,否则nginx ingress启动时会出现TLS握手失败的错误:

1)必须生成serviceAccount证书

证书生成好后参考官网文档在apiserver和controller-manager中启用

2)必须将Kubernetes的内网IP或域名加入到server.crt

#Add Cluster IP of kubernetes to server.crt
subjectAltName=`kubectl get services --all-namespaces |grep 'default'|grep 'kubernetes'|grep '443'|awk '{print $3}'`
echo subjectAltName=IP:${subjectAltName} > extfile.cnf

#According to the ca.key, ca.crt and server.csr generate the server.crt:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out server.crt -days 10000

3)更新证书后重启 K8S 并更新 secret 和 serviceaccount

kubectl get secret --all-namespaces

kubectl get serviceaccount --all-namespaces

查看 default 开头的 secret 和 serviceaccount,将其删除,系统会自动重新生成;

如果上述操作后某些 pod 仍出现TLS握手错误,则删除相关 deployment 或者 replicant后重新部署。

3. 安装 Nginx Ingress

做完上述准备工作后,就可以按照官方文档进行安装了:

https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx

注:为了显示 nginx_status,需要在80, 443 之外再暴露 nginx ingress 的8080端口:

        ports:
- containerPort: 80
hostPort: 80
- containerPort: 8080
hostPort: 8080
- containerPort: 443
hostPort: 443

同时部署一个configmap文件,启用nginx的vts模块:

apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-load-balancer-conf
data:
enable-vts-status: "true"
~

4. 实例

下面使用 nginx ingress 基于虚拟主机对 kubernetes-dashboards 进行服务暴露,并增加HTTPS功能:

4.1 创建 dashboard secret

https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/examples/tls/README.md

注意:创建密钥时,请填入虚拟主机名,比如:k8s-dashboard.xxxxx.com,否则HTTPS访问会被拒绝。

4.2 部署 dashboard

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
app: kubernetes-dashboard
version: v1.1.0
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
spec:
containers:
- name: kubernetes-dashboard
image: 172.31.17.36:5000/kubernetes-dashboard-amd64:v1.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9090
protocol: TCP
args:
# Uncomment the following line to manually specify Kubernetes API server Host
# If not specified, Dashboard will attempt to auto discover the API server and connect
# to it. Uncomment only if the default does not work.
- --apiserver-host=http://172.31.17.81:8080
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
---
kind: Service
apiVersion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
ports:
- port: 80
targetPort: 9090
selector:
app: kubernetes-dashboard

注:请将service 的port 设置为80

4.3 创建 dashboard Ingress 实例

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: k8s-dashboard
namespace: kube-system
spec:
tls:
- hosts:
- k8s-dashboard.xxxxx.com
secretName: k8s-dashboard-secret
rules:
- host: k8s-dashboard.xxxxx.com
http:
paths:
- backend:
serviceName: kubernetes-dashboard
servicePort: 80
path: /

注:请设置 tls, 虚拟主机名,backend service等参数

4.4 设置 DNS 或 hosts文件

在 DNS 或 hosts文件中创建 k8s-dashboard.xxxxx.com 记录,之后就可以通过 http://k8s-dashboard.xxxxx.com 或者 https://k8s-dashboard.xxxxx.com 来访问 dashboard 了。

nginx status:

[经验交流] Kubernetes Nginx Ingress 安装与使用的更多相关文章

  1. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

  2. kubernetes nginx ingress 使用记录

    前言 ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service. ingress controller是来管理所 ...

  3. [经验交流] kubernetes v1.11 更新了高可用方案

    kubernetes v1.11已经发布了一段时间,和以前相比,一个显著亮点是更新了高可用方案: https://kubernetes.io/docs/setup/independent/high-a ...

  4. Kubernetes 服务入口管理与 Nginx Ingress Controller

    Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...

  5. Helm 安装Nginx Ingress

    为了便于将集群中的服务暴露到集群外部,需要使用Ingress.接下来使用Helm将Nginx Ingress部署到Kubernetes上. Nginx Ingress Controller被部署在Ku ...

  6. kubernetes 1.14安装部署ingress

    简单介绍: Ingress是Kubernetes API的标准资源类型之一,它其实就是一组基于DNS名称或URL路径把请求转发至指定的Service资源的规则,用来将集群外部的请求流量转发至集群内部. ...

  7. Kubernetes 部署 Nginx Ingress Controller 之 nginxinc/kubernetes-ingress

    更新:这里用的是 nginxinc/kubernetes-ingress ,还有个 kubernetes/ingress-nginx ,它们的区别见 Differences Between nginx ...

  8. Kubernetes用Helm安装Ingress并踩一下使用的坑

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Ingress是Kubernetes一个非常重要的Controller,它类似一个路由转发的组件,可以让外界访问Kubern ...

  9. 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx

    前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现.一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容 ...

随机推荐

  1. 关于LDA的几何表示——MATLAB实现

    承接这个PCA的练习,还有一个关于LDA的几何表示. 题目如下: 代码实现LDA如下:LDA.m clear clc % 生成training sample MU1 = [6 10]'; MU2 = ...

  2. GitHub菜鸟日志1——20160531

    好吧,事实上很早就知道有github这个东西了,然而就有一种莫名的力量一直阻止着我向这“未知的领域”涉足(which is called lazy). 然后,前略...总之,默默的就开始了github ...

  3. 用H5和js写一个移动端自定义播放器

    前言 由于html5自带的播放器样式不怎么好看,大多数人都是自己写一个来满足业务需求.这一次的需求如下: 1.不要上一曲下一曲 2.有进度条和播放暂停按钮 3.有时间显示 demo实现功能 1.进度条 ...

  4. mysql查询语句中用户变量的使用

    先上代码吧 SELECT `notice`.`id` , `notice`.`fid` , `notice`.`has_read` , `notice`.`notice_time` , `notice ...

  5. 如何查看PYTHON Django的保存路径

    如何查看PYTHON Django的保存路径 $ python -c " import sys sys.path = sys.path[1:] import django print(dja ...

  6. SQLiteDeveloper破解

    Sqlite 管理工具 SQLiteDeveloper及破解 功能特点 表结构设计,数据维护,ddl生成,加密数据库支持,sqlite2,3支持 唯一缺憾,收费,有试用期 下载地址: http://w ...

  7. parsec-2.1 编译错误

    OS: Ubuntu 14.04 LTS (x86_64) 参考:https://forums.freebsd.org/threads/security-openssl-build-failure.4 ...

  8. sql关于Group by

    SELECT JBGS.XMID, SUM(JBGS.JBGS * JBYXXS.YXXS) / (SELECT  SUM(B.GS)  FROM T_XMCBHZ B  WHERE  B.XMID= ...

  9. 移动web开发和移动app开发的区分

    1.移动web开发 这部分跟web前端开发差别不大,使用的技术都是html+css+js.区别为手机浏览器是webkit的天下,pc端是IE的天 下.手机网页可以理解成pc网页的缩小版加一些触摸特性. ...

  10. Recylerview的使用系列教程

    转发自:http://edu.csdn.net/course/detail/2877