在撘完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/