使用helm部署ingress-nginx

关于ingress-nginx

为了便于将集群中的服务暴露到集群外部,需要使用Ingress。

使用helm安装ingress-nginx——LoadBalancer方式

helm的使用就和yum一样,因此我们直接用以下命令安装ingress-nginx,

helm install stable/nginx-ingress --set rbac.create=true -n nginx-ingress --namespace ingress-nginx

开启rbac鉴权,在nginx-ingress命名空间中创建名为nginx-ingress的pod,安装后查看服务状态,

[root@CentOS-7-4 /home/k8s/helm/nginx-ingress]# kubectl get svc --all-namespaces
NAMESPACE       NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   nginx-ingress-controller        LoadBalancer   10.96.97.70           80:30848/TCP,443:31972/TCP   8s

我们发现服务一直pending状态,无法对外服务,这是因为helm默认部署是以LoadBalancer方式,这种方式需要平台的支持,比如在AWS、GCE或者阿里云等平台。而我们自己搭建的集群没办法使用这种方式。不过我们可以通过设置externalIPs的方式使用内部ip,再通过统一的负载均衡接入外网。

[root@CentOS-7-4 /home/k8s/helm/nginx-ingress]# helm delete --purge nginx-ingress
[root@CentOS-7-4 /home/k8s/helm/nginx-ingress]# helm install stable/nginx-ingress --set rbac.create=true,controller.service.externalIPs[0]=192.168.0.101,controller.service.externalIPs[1]=192.168.0.102 -n nginx-ingress --namespace ingress-nginx
[root@CentOS-7-4 /home/k8s]# kubectl get svc --all-namespaces
NAMESPACE       NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                     PORT(S)                      AGE
ingress-nginx   nginx-ingress-controller        LoadBalancer   10.98.90.251     192.168.0.101,192.168.0.102   80:32478/TCP,443:31196/TCP     10s

我们指定集群中两个node的IP作为externalIPs,这样就能通过这两个个ip来引入外部流量。我们尝试从集群外部范围这两个个ip,

[root@CentOS-7-2 ~]# curl http://192.168.0.101:80
default backend - 404
[root@CentOS-7-2 ~]# curl http://192.168.0.102:80
default backend - 404

由于我们集群内部还没有服务,因此请求转到nginx-ingress的default backend中。

创建应用并使用nginx-ingress对外暴露服务

我们创建一个nginx web服务器作为测试,

---

apiVersion: v1
kind: Pod
metadata:
 name: nginx
 namespace: ingress-nginx
 labels:
   app: web
spec:
 hostNetwork: false
 containers:
   - name: nginx
     image: nginx

---

kind: Service
apiVersion: v1
metadata:
  name: webservice
  namespace: ingress-nginx
spec:
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 10080
    targetPort: 80
~              

创建该应用,

[root@CentOS-7-4 /home/k8s]# kubectl apply -f nginx.yaml 
pod/nginx created
service/webservice created
[root@CentOS-7-4 /home/k8s]# kubectl get svc -n ingress-nginx
NAME                            TYPE           CLUSTER-IP       EXTERNAL-IP                     PORT(S)                      AGE
webservice                      ClusterIP      10.105.175.150                             10080/TCP                    6s

为了便于测试,我们进入这个pod将这个测试web服务的主页内容修改一下,

[root@CentOS-7-4 /home/k8s]# kubectl exec -ti nginx -n ingress-nginx -- /bin/bash
root@nginx:/# echo "This is my webservice!" > /usr/share/nginx/html/index.html
root@nginx:/# cat /usr/share/nginx/html/index.html
This is my webservice!
root@nginx:/# exit
exit

确保服务正常,我们在集群内通过ClusterIP测试一下,

[root@CentOS-7-5 ~]# curl http://10.105.175.150:10080
This is my webservice!

可见,服务创建正常,但是该服务目前只能在集群内使用,集群外无法访问该服务。

下面我们通过ingress-nginx来将该服务暴露到集群外部。

首先定义我们的服务的对外要暴露的访问域名,这里假设为webservice.com

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
  namespace: ingress-nginx
spec:
  rules:
  -  host: webservice.com
     http:
      paths:
      - path: /
        backend:
          serviceName: webservice
          servicePort: 10080

之后创建ingress资源,

[root@CentOS-7-4 /home/k8s]# kubectl apply -f my-ingress.yaml 
ingress.extensions/test-ingress configured
[root@CentOS-7-4 /home/k8s]# kubectl get ingress --all-namespaces
NAMESPACE       NAME           HOSTS            ADDRESS   PORTS   AGE
ingress-nginx   test-ingress   webservice.com             80      8d

创建好后,我们试着在集群外部来访问。

[root@CentOS-7-2 ~]# curl -H "Host: webservice.com" http://192.168.0.101:80
This is my webservice!
[root@CentOS-7-2 ~]# curl -H "Host: webservice.com" http://192.168.0.102:80
This is my webservice!

可见,通过ingress-nginx,我们在集群外部也能访问集群内部的服务。

此时我们可以查看下ingress-nginx内部的配置文件,

[root@CentOS-7-4 ~]# kubectl exec -ti nginx-ingress-controller-54ddb7c6c-4hnnr -n ingress-nginx -- cat /etc/nginx/nginx.conf
	...
    upstream ingress-nginx-webservice-10080 {

        # Load balance algorithm; empty for round robin, which is the default
        least_conn;
        keepalive 32;
        server 10.244.3.25:80 max_fails=0 fail_timeout=0;
    }
	...
    ## start server webservice.com
    server {
        server_name webservice.com ;
        listen 80;
        listen [::]:80;
      	...
        location / {
           port_in_redirect off;
           set $proxy_upstream_name "ingress-nginx-webservice-10080";
           ...
       }
		...
    }
    ## end server webservice.com

可见此时ingress-nginx里面已经自动生成了webservice服务的转发规则,无需我们手动再去添加。再看下后端服务ip10.244.3.25是哪个pod,

[root@CentOS-7-4 ~]# kubectl get pods --all-namespaces -o wide | grep 10.244.3.25
ingress-nginx   nginx                                           1/1     Running   0          22h     10.244.3.25      centos-7-3              

正是我们启动的nginx服务。

这样就实现了将集群内部服务暴露到外部。

你可能感兴趣的:(Kubernetes,ingress-nginx,helm,k8s)