k8s的NodePort类型的service组件以及遇到的问题

网友投稿 436 2022-10-27

k8s的NodePort类型的service组件以及遇到的问题

k8s中service组件有三个类型ClusterIP,NodePort,Loadbalancer

Cluster类型是k8s各node之间的内网通信,默认类型 Nodeport类型则是在ClusterIP基础上暴露出一个随机端口至外部[NodeIP]:[NodePort],可让外部进行访问,默认端口范围30000~32767 Loadbalancer类型一般是和云负载一起使用,一般都是运行在云环境上的k8s一起使用。

本篇内容着重对Nodeport类型进行示例;

创建一个nginx的Deployment [root@master1 demo]# kubectl create deployment nginx-deployment --image=nginx1.8 --dry-run -o=yaml > nginx-deployment.yaml 修改yaml文件 [root@master1 demo]# cat nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-deployment name: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx-deployment template: metadata: labels: app: nginx-deployment spec: containers: - image: nginx:1.8 name: nginx ports: - containerPort: 80 创建service类型为NodePort

[root@master1 demo]# kubectl expose deployment nginx-deployment --protocol=TCP --port=80 --target-port=80 --type=NodePort --dry-run -o=yaml > nginx-deploy-service.yaml

修改yaml文件 [root@master1 demo]# cat nginx-deploy-service.yaml apiVersion: v1 kind: Service metadata: labels: app: nginx-deployment name: nginx-deployment spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx-deployment type: NodePort

selector:app: nginx-deployment这个标签是对应的Deployment的app标签。

创建并查看service [root@master1 demo]# kubectl create -f nginx-deploy-service.yaml service/nginx-deployment created [root@master1 demo]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 443/TCP 6d7h nginx-deployment NodePort 10.0.0.238 80:32256/TCP 5s 本地访问一下端口,并测试外部Node节点ip的端口

[root@master1 demo]# curl 10.0.0.238 32256 Welcome to nginx! Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.

curl: (7) Failed to connect to 0.0.126.0: 无效的参数

如果你的端口只能在生成pod节点node上或者此node节点ip上访问,外部无法访问,则说明node节点配置的iptables的FORWARD链是有问题的(默认全部DROP,应该改成ACCEPT)

如图所示

我们的集群replicas=1,scheduler通过计算绑定到172.16.1.76节点,NodePort端口为32256NodePort类型的service组件会在每个Node节点都会监听32256端口,但是只能访问172.16.1.76节点才能正常访问,访问75和77节点就无法正常通信,那说明我们的iptables有问题

执行下列命令:

iptables -P FORWARD ACCEPT*

就可以正常访问,但是这样修改iptables只能临时生效,重启node节点就会失效。

永久解决方案(修改docker.service文件,每次docker启动自动修改FORWARD链):

[root@k8s-master ~]# vim /usr/lib/systemd/system/docker.service [Service] ............ ExecStartPost=/sbin/iptables -I FORWARD -s 0.0.0.0/0 -j **ACCEPT** systemctl daemon-reload systemctl restart docker

k8s 1.9以后的版本建议使用ipvs的网络代理方案,它和iptables均基于netfilter差异如下

IPVS为大型集群提供了更好的可扩展性和性能。 IPVS支持比iptables更复杂的负载平衡算法(最小负载,最少连接,位置,加权等)。 IPVS支持服务器健康检查和连接重试等

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:APISpace 中英文敏感词过滤API
下一篇:Spring在多线程下@Resource注入为null的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~