ingress安装和使用测试

 

ingress安装和使用测试

本文档可能存在错误,欢迎修改及更新,另外k8s官方文档更新较快,此文档仅供参考,实际可根据官网进行安装。 
部署参考网址:https://github.com/kubernetes/ingress-nginx/blob/df61bd756505275baaa5fdc2a3dc4648e62dae95/docs/deploy/index.md 

ingress部署项目:https://github.com/kubernetes/ingress-nginx/tree/master/deploy 
pod,service创建参考网址:https://kubernetes.io/docs/concepts/ 
TCP以及UDP协议参考网址:https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md 

1 ingress 安装

1.1 环境

(1)配置代理 
配置网络代理,打开配置文件/etc/systemd/system/docker.service.d/http-proxy.conf,在文件中添加以下内容: 

[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:3080" "HTTPS_PROXY=http://xxx.xxx.xxx.xxx:3080" "NO_PROXY=localhost,127.0.0.1,mirror.aliyuncs.com,aliyuncs.com"

表示除了localhost,127.0.0.1,mirror.aliyuncs.com,aliyuncs.com这几个ip和域名,其他都通过代理xxx.xxx.xxx.xxx:3080去访问外网。 


(2)其他环境 
必须安装了k8s,docker,kubectl等等必要的环境(这里不做介绍)。

1.2 安装

(1)创建命名空间ingress-nginx

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml \
    | kubectl apply -f -

ingress相关的资源会部署在该命名空间下 (2)安装default-backend 前端的nginx最终负载到后端的services上,此时需要部署一个默认后端(default-backend),当不存在的域名访问进来,请求将负载到该后端上,用于返回404状态。

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml \
    | kubectl apply -f -

(3)安装configmap

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml \
    | kubectl apply -f -

(4)安装tcp-services-configmap 用于支持TCP功能

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml \
    | kubectl apply -f -

(5)安装udp-services-configmap 用于支持UDP功能

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml \
    | kubectl apply -f -

(6)安装ingress 
ingress安装可采用带RBAC以及不带RBAC两种方法。 
1、with RBAC 
RBAC用于权限管理,我安装了带RBAC

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml \
    | kubectl apply -f -

官网上的下一步是执行

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml \
    | kubectl apply -f -

但是安装好后发现官网的该文件存在bug,服务所在的主机上并未启动服务所需的端口。因此在本地创建with-rbac.yaml文件,并在官网内容的基础上添加hostNetwork: true。

serviceAccountName: nginx-ingress-serviceaccount
hostNetwork: true

安装with-rbac

# kubectl create -f ./with-rbac.yaml

2、without RBAC

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/without-rbac.yaml \
    | kubectl apply -f -

以上步骤已经完成了ingress的安装。

2 ingress 使用

整个使用过程分为三步:(1)创建pod资源;(2)发布服务svc;(3)ingress路由服务; 
创建pod资源以及发布服务svc支持两种方式,可采用kubectl命令或者yaml文件的方式创建,建议采用yaml的方式创建。(下面为了快速理解原理,采用kubectl命令快速创建的一个简单的案例)。 
(1)创建pod资源 
创建http pod

# kubectl run --image=httpd httpd

查看pod

# kubectl get pods
NAME                                    READY     STATUS     RESTARTS   AGE
httpd-5db7c66c79-vlhh6                  1/1       Running    0          19h

(2)发布服务svc pod是动态变化的,随时都有可能被销毁并重新创建。因此通过服务的方式发布出去,对外只提供服务对象,从而解决对外公布动态变化的pod IP带来的问题。

# kubectl expose deployment httpd --port=80
service "httpd" exposed

查看当前的服务

# kubectl get svc -o wide
NAME                   TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE       SELECTOR
httpd                  ClusterIP   10.233.63.150           80/TCP     2d        run=httpd

该服务对外提供的IP和端口是10.233.63.150:80,此时在集群内部可以通过10.233.63.150:80访问第一步创建的pod(注意:仅支持在集群内部访问)。

# curl 10.233.63.150:80

It works!

(3)ingress路由服务 通过第二步可以看出,服务发布出来后仅支持集群内部访问,但很多场景下需要支持外网访问,因此有了ingress。 
创建ingress的yaml文件

# cat ingress_httpd.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: httpd-test
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: httpd
          servicePort: 80

将 foo.bar.com映射到httpd服务,httpd服务内部地址是10.233.63.150:80。 
创建ingress

# kubectl create -f ingress_httpd.yaml 
ingress.extensions "httpd-test" created

(4)验证 
查看nginx-ingress的IP地址

# kubectl get pod -n ingress-nginx -o wide
NAME                                        READY     STATUS    RESTARTS   AGE       IP               NODE
nginx-ingress-controller-78f4f94678-gvdnn   1/1       Running   1          1d        192.168.13.5    k8s-test2-node1

ingress部署在k8s-test2-node1上,node1的ip地址为192.168.13.5
在测试的主机上映射foo.bar.com域名到192.168.13.5。

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.13.5 foo.bar.com foo.bar.com

在该主机上访问k8s集群上的http服务。

# curl foo.bar.com

It works!

以上内容已完成了ingress的初步使用。

3 ingress 四层协议功能使用

上一个步骤中我们测试了ingress的七层协议。接下来我们测试一下ingress的四层协议(这里简单测试下tcp协议)。 
在第一部分ingress安装步骤中用到了tcp-services-configmap.yaml以及udp-services-configmap.yaml,ingress四层协议的使用就需要用到这两个文件。 
我们这边采用mysql作为案例,同样整体步骤分为四个部分(1)创建pod资源;(2)发布服务svc;(3)ingress路由服务; 
(1)创建pod资源 
这里采用yaml的方式创建。

# cat mysql.yaml 
apiVersion: apps/v1
kind: Deployment                     
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:  
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: daocloud.io/library/mysql:5.7.4
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

创建pod

# kubectl create -f mysql.yaml

(2)发布服务svc

# kubectl expose deployment mysql-deployment --port=3306

也可以采用yaml的方式发布svc,kubectl create -f mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

查看服务

# kubectl get svc --all-namespaces
NAMESPACE       NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
default         mysql-deployment        ClusterIP   10.233.60.38            3306/TCP         17h

(3)ingress路由服务svc 
更改tcp-services-configmap.yaml文件。 
在原来的基础上添加内容3306: “default/mysql-deployment:3306”。如下: 

# cat tcp-services-configmap.yaml 
kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  3306: "default/mysql-deployment:3306"

重新应用该文件。

# kubectl apply -f tcp-services-configmap.yaml 

(3)验证 
登录nginx-ingress-controller,查看/etc/nginx/nginx.conf中多了以下内容 

# cat /etc/nginx/nginx.conf
stream {
        log_format log_stream [$time_local] $protocol $status $bytes_sent $bytes_received $session_time;
        access_log /var/log/nginx/access.log log_stream;
        error_log  /var/log/nginx/error.log;
        # TCP services
        upstream tcp-3306-default-mysql-deployment-3306 {
                server                  10.233.105.236:3306;
        }
        server {
                listen                  3306;
                listen                  [::]:3306;
                proxy_timeout           600s;
                proxy_pass              tcp-3306-default-mysql-deployment-3306;
        }
        # UDP services
}

表示通过TCP协议将ingress的本地地址192.168.13.2的3306映射到10.233.105.236的3306端口。 
此时在测试主机上telnet 192.168.13.2 3306,可以正常访问。

 

 

 

PS

下方是我个人订阅号,会一直更新各类技术文章,欢迎关注  :)

你可能感兴趣的:(k8s)