本文档可能存在错误,欢迎修改及更新,另外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)配置代理
配置网络代理,打开配置文件/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)创建命名空间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的安装。
整个使用过程分为三步:(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的初步使用。
上一个步骤中我们测试了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
下方是我个人订阅号,会一直更新各类技术文章,欢迎关注 :)