上一篇k8s系列文章介绍了使用nginx来给kube-apiserver作反向代理, 除了这个作用, nginx也是常用的ingress controller, 本文介绍如何使用ingress-nginx进行服务暴露(先介绍操作篇, 原理后续再做介绍)。

笔者的datalab k8s集群是v1.19版本的, 使用kubespary安装时,在addon上是打开了ingress-nginx开关的, 安装后的版本如下:
[root@host01~]# kubectl exec -n ingress-nginx -it ingress-nginx-controller-8c9qm -- nginx-ingress-controller --version-------------------------------------------------------------------------------NGINX Ingress controllerRelease: v0.40.2Build: fc4ccc5eb0e41be2436a978b01477fc354f31643Repository: https://github.com/kubernetes/ingress-nginxnginx version: nginx/1.19.3-------------------------------------------------------------------------------
安装后, 查看pod状态如下:
[root@host01~]# kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watchNAME READY STATUS RESTARTS AGEingress-nginx-controller-8c9qm 1/1 Running 0 26hingress-nginx-controller-nq9qj 1/1 Running 0 26hingress-nginx-controller-r5xxj 1/1 Running 0 26hingress-nginx-controller-tdnnv 1/1 Running 0 26hingress-nginx-controller-wzhm7 1/1 Running 0 26h
可以看到,在v.40.2版本下, 5个节点都各自部署了1个实例。 笔者按照官方的教程(https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md ) 配置了一下并没有生效, 从官网的另一篇安装指南文章(https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal) 看到当前版本已经更新到v0.41.2, 于是决定重新安装配置ingress-nginx。
删除掉原来的安装分两部分进行操作, 首先是直接删除整个ingress-nginx的namespace, 这样里面的pod等资源就会一起删除, 然后是从default namespace中删除ingress相关的ClusterRole、ClusterRoleBinding即可。下面介绍重新安装的具体过程和遇到的一些问题。
step 1. 创建刚才删除掉的namespace
kubectl create ns ingress-nginx
step 2. 按照上面的安装指南链接, 采用bare-metal场景下node方式安装:
root@host01 ingress-nginx]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.2/deploy/static/provider/baremetal/deploy.yamlWarning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl applynamespace/ingress-nginx configuredserviceaccount/ingress-nginx createdconfigmap/ingress-nginx-controller createdclusterrole.rbac.authorization.k8s.io/ingress-nginx createdclusterrolebinding.rbac.authorization.k8s.io/ingress-nginx createdrole.rbac.authorization.k8s.io/ingress-nginx createdrolebinding.rbac.authorization.k8s.io/ingress-nginx createdservice/ingress-nginx-controller-admission createdservice/ingress-nginx-controller createddeployment.apps/ingress-nginx-controller createdvalidatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission createdserviceaccount/ingress-nginx-admission createdclusterrole.rbac.authorization.k8s.io/ingress-nginx-admission createdclusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission createdrole.rbac.authorization.k8s.io/ingress-nginx-admission createdrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission createdjob.batch/ingress-nginx-admission-create createdjob.batch/ingress-nginx-admission-patch created# 查看安装结果[root@host01 ~]# kubectl get all -n ingress-nginxNAME READY STATUS RESTARTS AGEpod/ingress-nginx-admission-create-fvssz 0/1 Completed 0 147mpod/ingress-nginx-admission-patch-b47rm 0/1 Completed 0 147mpod/ingress-nginx-controller-5c4dfb5c7b-84wpl 1/1 Running 0 29mNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/ingress-nginx-controller NodePort ip01 <none> 80:30179/TCP,443:32752/TCP 147mservice/ingress-nginx-controller-admission ClusterIP ip02 <none> 443/TCP 147mNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/ingress-nginx-controller 1/1 1 1 147mNAME DESIRED CURRENT READY AGEreplicaset.apps/ingress-nginx-controller-5c4dfb5c7b 1 1 1 29mreplicaset.apps/ingress-nginx-controller-5dbd9649d4 0 0 0 147mreplicaset.apps/ingress-nginx-controller-b98cb849d 0 0 0 143mreplicaset.apps/ingress-nginx-controller-bd947bc79 0 0 0 132mNAME COMPLETIONS DURATION AGEjob.batch/ingress-nginx-admission-create 1/1 3s 147mjob.batch/ingress-nginx-admission-patch 1/1 3s 147m# 查看版本[root@host01 ~]# kubectl exec -n ingress-nginx -it ingress-nginx-controller-5c4dfb5c7b-84wpl -- nginx-ingress-controller --version-------------------------------------------------------------------------------NGINX Ingress controllerRelease: v0.41.2Build: d8a93551e6e5798fc4af3eb910cef62ecddc8938Repository: https://github.com/kubernetes/ingress-nginxnginx version: nginx/1.19.4-------------------------------------------------------------------------------
step 3: 创建tcp-services的configmap, 结果如下:
# 这里配置了mogodb的服务及dashboard服务(base) bash-4.1$ cat ConfigMap-tcp-services.yamlapiVersion: v1kind: ConfigMapmetadata:name: tcp-servicesnamespace: ingress-nginxdata:8998: "kube-system/kubernetes-dashboard:443"8717: "mongodb/bitnami-mongodb-mongodb-sharded:27017"# 部署configmapkubectl apply -f ConfigMap-tcp-services.yaml# 查看结果[root@host01 ~]# kubectl get configmap -n ingress-nginxNAME DATA AGEingress-controller-leader-nginx 0 3h5mingress-nginx-controller 0 169mtcp-services 2 177m
这里补充一下, 用于验证的mongodb服务(如何安装的后续再介绍), 该服务的状态如下:
[root@host01 ~]# kubectl get all -n mongodbNAME READY STATUS RESTARTS AGEpod/bitnami-mongodb-mongodb-sharded-configsvr-0 1/1 Running 0 8hpod/bitnami-mongodb-mongodb-sharded-mongos-77758696fc-6t4kr 1/1 Running 0 8hpod/bitnami-mongodb-mongodb-sharded-shard0-data-0 1/1 Running 0 8hpod/bitnami-mongodb-mongodb-sharded-shard1-data-0 1/1 Running 0 8hNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/bitnami-mongodb-mongodb-sharded ClusterIP ip01 <none> 27017/TCP 8hservice/bitnami-mongodb-mongodb-sharded-headless ClusterIP None <none> 27017/TCP 8hNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/bitnami-mongodb-mongodb-sharded-mongos 1/1 1 1 8hNAME DESIRED CURRENT READY AGEreplicaset.apps/bitnami-mongodb-mongodb-sharded-mongos-77758696fc 1 1 1 8hNAME READY AGEstatefulset.apps/bitnami-mongodb-mongodb-sharded-configsvr 1/1 8hstatefulset.apps/bitnami-mongodb-mongodb-sharded-shard0-data 1/1 8hstatefulset.apps/bitnami-mongodb-mongodb-sharded-shard1-data 1/1 8h[root@host01 ~]#[root@host01 ~]# kubectl get pods -n mongodb -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESbitnami-mongodb-mongodb-sharded-configsvr-0 1/1 Running 0 8h ip01 host01 <none> <none>bitnami-mongodb-mongodb-sharded-mongos-77758696fc-6t4kr 1/1 Running 0 8h ip04 host04 <none> <none>bitnami-mongodb-mongodb-sharded-shard0-data-0 1/1 Running 0 8h ip04 host04 <none> <none>bitnami-mongodb-mongodb-sharded-shard1-data-0 1/1 Running 0 8h ip03 host03 <none> <none>[root@host01 ~]#
可以看到mogodb服务bitnami-mongodb-mongodb-sharded的类型为ClusterIP, 对应的后端的POD位于host04, 这个信息后面将用于验证是ingress nginx配置是否生效。
step 4: 修改ingress nginx的配置文件, 主要包括容器程序启动程序添加上面的configmap为参数, 另外是要打开主机网络的开关,如下:
root@host01 ingress-nginx]# kubectl edit deployment ingress-nginx-controller -n ingress-nginxcontainers:- args:- nginx-ingress-controller- --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller- --election-id=ingress-controller-leader- --ingress-class=nginx- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services......dnsPolicy: ClusterFirsthostNetwork: true # 添加该配置项, 不然无法生效nodeSelector:# 查看配置结果Ports: 80/TCP, 443/TCP, 8443/TCPHost Ports: 80/TCP, 443/TCP, 8443/TCP
step 5: 验证配置是否生效, 主要是通过查看ingress nginx controller所在的机器是否已经开启了相应的端口以及通过mogodb服务进行验证,如下:
[root@host04 ~]# netstat -antp |grep 8717tcp 0 0 0.0.0.0:8717 0.0.0.0:* LISTEN 34685/nginx: mastertcp6 0 0 :::8717 :::* LISTEN 34685/nginx: master# mongo验证[root@host01 ~]# mongo --host host04:8717MongoDB shell version v4.0.3connecting to: mongodb://host04:8717/Implicit session: session { "id" : UUID("ad0399da-6444-47a4-9449-5bb30f3156d2") }MongoDB server version: 4.4.2WARNING: shell and server versions do not matchWelcome to the MongoDB shell.For interactive help, type "help".For more comprehensive documentation, seehttp://docs.mongodb.org/Questions? Try the support grouphttp://groups.google.com/group/mongodb-usermongos>
可以看到mogodb客户端成功连接了服务, 说明服务已经成功通过ingress nginx controller对外暴露了。
从上面看到, 还配置了dashboard服务, 但验证是失败的, 主要原因是https, 这个问题后面文章再介绍如何解决。




