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. JSONObject

    JAR包简介: commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.j ...

  2. Android 开发常用命令

    1.生成keystore文件 keytool -exportcert -keystore keystore_path -list -v 2.查看APK签名 keytool -list -printce ...

  3. Android上传图片到服务器

    一.android需要导入异步请求的jar包 AsyncHttpClient  public static void reg(final Context cont,Bitmap photodata,S ...

  4. Xcode7 Cocoapods 安装或更新出现错误

    好长时间没有玩过CocoaPods了,今天在执行 pod install --verbose --no-repo-update 的时候出现了错误如下 [MT] DVTAssertions: ASSER ...

  5. folly::AtomicHashmap源码分析(一)

    本文为原创,转载请注明:http://www.cnblogs.com/gistao/ Atomic的两点背景 看下这个场景,老张去厕所,发现门是锁着的,他就在门口等着里边人出来,此时小王也来了,他想了 ...

  6. SVM

    sDJgfklJGV;LAKi管理科JF看了UFO李开复LKFLKJF EDJFO很疯狂的复活卡划分KJF

  7. codeforces 27E Number With The Given Amount Of Divisors

    E. Number With The Given Amount Of Divisors time limit per test 2 seconds memory limit per test 256 ...

  8. php部分,一个用递归无限分类的方法

    <?php $data[]=array('id'=>1,'parentid'=>0,'name'=>'中国'); $data[]=array('id'=>2,'paren ...

  9. VMvare克隆复制多个操作系统

    目的:完成linux的双机和集群实验 2016-12-06 在网上查找了一些资料现整理如下,以供之后查看和帮助他人. 注意事项: 1.关闭源虚拟机的电源: 操作很简单 选择完整创建 输入源克隆机的用户 ...

  10. HDU-2825 Wireless Password(AC自动机+状压DP)

    题目大意:给一系列字符串,用小写字母构造出长度为n的至少包含k个字符串的字符串,求能构造出的个数. 题目分析:在AC自动机上走n步,至少经过k个单词节点,求有多少种走法. 代码如下: # includ ...