

使用ingress-nginx访问k8s内服务
source link: https://www.jianshu.com/p/46dd82cb4d68
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用ingress-nginx访问k8s内服务
在撘完kubernetes后,外部流量无法访问内部的服务。目前阿里云无法使用LoadBalancer模式,所以通过ingress-nginx进行流量的转发。
安装ingress-nginx
进入master节点,下载配置文件(需要翻墙):
https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
对外开放的时候需要固定node上的端口,所以修改deploy.yaml。
找到 Source: ingress-nginx/templates/controller-service.yaml
在ports上添加nodePort,对应的值就是node节点开放给外部使用的端口。
这里http端口设置为31234,https端口设置为31235。如下图:
另外,由于国内使用,无法访问k8s.gcr.io下的镜像,所以,我将该镜像下载后重新传到aliyun的镜像服务中:
继续编辑deploy.yaml,找到 # Source: ingress-nginx/templates/controller-deployment.yaml
找到下面对应的镜像文件:us.gcr.io/k8s-artifacts-prod/ingress-nginx/controller:v0.34.1@sha256:0e072dddd1f7f8fc8909a2ca6f65e76c5f0d2fcfb8be47935ae3457e8bbceb20
替换为:registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.34.1@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe
$ kubectl apply -f deploy.yaml
之后系统会自动进行安装配置。可以通过如下命令检查是否安装成功:
$ kubectl get pods -n ingress-nginx \
-l app.kubernetes.io/name=ingress-nginx --watch
等到出现如下提示,说明安装成功
NAME READY STATUS RESTARTS
ingress-nginx-admission-create-fh95h 0/1 Completed 0
ingress-nginx-admission-patch-d95c5 0/1 Completed 0
ingress-nginx-controller-55497dff78-ld6cf 1/1 Running 0
输入如下命令,检查配置是否生效
$ kubectl -n ingress-nginx get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
ingress-nginx-controller NodePort 10.10.10.187 <none> 80:31234/TCP,443:31235/TCP
ingress-nginx-controller-admission ClusterIP 10.10.77.102 <none> 443/TCP
看到以上两条信息说明配置已经生效,且对应的80和443端口已经绑到31234和31235端口上。
接下来讲如何将对应的流量转发到k8s的服务上
首先创建一个文件,ingress-nginx-service.yml。内如如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
# use the shared ingress-nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myservicea.foo.org
http:
paths:
- path: /
backend:
serviceName: nginx-service
servicePort: 80
以上文件创建了一个Ingress的规则,将myservicea.foo.org域名对应的http请求,转发到nginx-service服务上。服务端口为80.
接下来,创建对应的Deployment和Service,文件名nginx.yml,内容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
该文件创建一个Deployment,该Deployment创建一个使用nginx镜像的容器,容器端口为80。接着创建对应的Service来开放端口。
注意,Service的name及port必须和 Ingress的serviceName和servicePort一致
$ kubectl apply -f ingress-nginx-service.yml
$ kubectl apply -f nginx.yml
查看Ingress
$ kubectl describe Ingress ingress-nginx
Name: ingress-nginx
Namespace: default
Address: xxx.xxx.xxx.xxx
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
Host Path Backends
---- ---- --------
myservicea.foo.org
/ nginx-service:80 (192.168.3.65:80)
Annotations: nginx.ingress.kubernetes.io/rewrite-target: /
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 45m nginx-ingress-controller Ingress default/ingress-nginx
看到上面Rules对应的规则,其中有一条nginx-service:80 (192.168.3.65:80) 。这个是服务nginx-service创建的,可以在master节点上通过curl测试服务是否正常
$ curl 192.168.3.65:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
接下来,本地测试,可以修改hosts,将myservicea.foo.org域名指向其中一个node节点。然后在浏览器中输入http://myservicea.foo.org:31234/ 。看到如下图说明配置都正常了。
目前还剩两个问题:
1、服务使用的端口不是80的,所以需要手动加上端口。
2、该方式只能指向其中一个节点,无法访问其他node。
可以通过添加负载均衡服务器解决以上两个问题,负载均衡配置不在此讨论,可以直接使用阿里云的,也可以自己使用nginx进行配置。
参考文章:
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
https://kubernetes.github.io/ingress-nginx/deploy/
Recommend
-
43
由于 nginx 的优秀性能表现,所以很多企业在Kubernetes 中选择 Ingress Controller 的时候依然会选择基于 nginx 的 ingress-nginx ,前面文章中我们更多的是介绍更加云原生配...
-
16
之前家里Kubernetes上托管的一些服务,如portal, emby, weave scope等等,是使用的service ip来访问的,访问起来稍微有点麻烦,主要是ip要记。 Kubernetes为了解决load balancer类型service的问题(vip消耗,L7负载特性等),提供了
-
14
作者林育新,腾讯云容器产品工程师。目前主要负责腾讯云TKE的控制台的相关研发工作。 在开源社区当中,Kubernetes 的 Ingress Controller 的实现有多种方式,Nginx Ingress 只是其中的一种实现方式,当然也是目前社区中使用量最大的一种 Ingress Contro...
-
7
k8s 使用 ingress 接口卡住 V2EX › Kubernetes k8s 使用 ingress 接口卡住
-
3
V2EX › Kubernetes k8s tomcat 进程 killed 访问 nginx 502 问题 dunhanson · 3 小时 36 分钟...
-
6
使用Nginx Ingress实现灰度发布和蓝绿发布 ...
-
7
kubernetes 中 nginx ingress 的优化分两部分 一、系统sysctl部分优化 首先是对nginx启动前的系统性能进行优化,这部分调整网络的缓冲区,减小闲置 socket 关闭的时间 以阿里 ACK 为例,我们可以编辑 deployments 的 nginx-ingress-cont...
-
5
k8s部署-43-带你深入学习ingress-nginx(下)_12376780的技术博客_51CTO博客很多情况下,nginx会代理https协议,那么我们的ingress-nginx是如何实现这个功能呢,下面看看。我这里没有https证书,所以需要自己生成https证书;
-
4
【K8S】Nginx-Ingress-Controller部署,用域名的方式访问服务 推荐 原创 ...
-
7
出于简单,Linkerd 本身并没有提供内置的 Ingress 控制器,Linkerd 旨在与现有的 Kubernetes Ingress 解决方...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK