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

k8sservice组件有三个类型
clusterIP,nodePort,Loadbalancer

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

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

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

  • 创建一个nginx的Deployment

    [root@master1 demo]# kubectl@ N | @ * create deployment nginx-deployment  --im0 h V H xage=nginx1.8 --dry-run -o=yaml > nginx-deploymentL 5 6 s E I ) r.yaml
  • 修改yaml文件

    [root@master1 demo]# cat nginx-deployment.yaml^ k @ u G k 5
    apiVersio1 n A G j sn:3 L S ? appsT r ; / e i &/v1
    kind: Deploym, & T K [ p 3 _ 2ent
    metadat+ m [a:M ? . ; X c
    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.8N _ 9 y f J X z
    name] _ . P H !: nginx
    ports:
    - containerPort: 80
  • 创建` , yserviceT i P型为NodePort
[root@master1 dJ $ R [ - : T Femo]# kubD Q * I f Jectl 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]# cF Q Sat nginx-deployg | 3 1 ^ _ G l z-service.yaml
    apiVersion: v1
    kind: Service
    metadaD } wta:
    labels:
    app: nginx-deployment
    name: nginx-deploymen` @ : ~ : u # 6 Nt
    spec:
    ports:
    - port: 80
    protocol: T# k _ D y +CP
    t! V L 3 3 WargetPort: 80
    selector:
    app: nginx-deployment
    type: NodePort

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

  • 创建s d f并查看service

    [root@master1 demo]# kubectl create -f n- j 3 . A * 5ginx-deploy-service.yaml
    service/nginx-deploymt 0 y | T [ a -ent created
    [root@mast_ f v Z l O X Y 1er1 demo]# kubectl get sO _ ) F t j Hvc
    NAME               TYPE        CLUSTER-A p ) 1 2 b hIP   EXTERNAL-IP   PORT(S){ 9 G        AG, p  f z a 9 )E
    kubernetes         ClusterIP   10.0.0.1     <none>        443/TCP        6d7h
    nginx-dD D Y u X w W Deployment   NodePort    10.0.0.238   <none>        80:32256/TCP   5s
  • 本地访问一下端口,并测试外部Node节点ip的端口
[root@master1 demo]# curl 10.0.0.238 32256
<!DOCTYPE html>
<html>
<head>
<titd . B d ) _ 5 Kle>Welcome to nginx!</title>
<style>
body {
width: 35emJ & o $ f G;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
<$ j : 4 . f O W I;/style>
</head>
<bo% j v Udy>
<h1>Welco9 + 4 W 9mev ! W h P [ . to nginx!</h1>
<p>if you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support pleau 4 p ^ 9se refer to
<a hre t | l x a 8 2f="w n W k _ E )http://nginx.org/">nginx.org</a>.<br/>
Commercial suppoo o  @rt is available at
<a href="htb % `tpR M = P o ^://nginx| ( z 7 n % _ @ B.com/">nginx.com</a>.</p>
&li + r Jt;p><em>Thank you for using nginx.</em><v ] B @ l E f =/p>
</body>
<? % 5;/html>j + $ * _ B ^ `
curl: (7) Failed toD , 5 m R V connect to 0.0.126.0: 无效的参数
  • 本地浏览器访问任意node节点ip演示v $ U
    k8s的NodePort类型的service组件以及遇到的问题

如果你的端口只能在生成pod节点node上或者此node节点ip上访问,外部无法x V ; B w访问,则说明node节点配置的iPTables的FORWARD链是有问题的(默认全部DROP,应该r G A f ] c改成ACCEPT)

如图所V A D

我们的集群replicas=1,scheduler通过计算绑定到172.16.1.76节点,NodePort端口为32256
No[ E H 9 V 0dePort类型的s9 g D & J | j | zervice组件会在每个Node节点都会监听32256端口,但是只能访问172.16.1.76节点才能正常访问,访问75和77节点就无法正常通信,那说明我们的iptables有问题

执行下列命令:

iptables -P FORWARD ACCEPT*

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

永久解决方案(修改docker= G . B 3 M.service文件,每次docker启动自动修改FOe B M 3RWARD链W U L i @):

[root@k8s-master ~]# vim /u. + & s S ]sr/lW i i Zib/systemd/system/docker.service
[Service]
...a # 7 = ~ f........K x q.
ExecStartPost=/sbin/iptables -U f f # ] 2I FORWARD -s 0.0.0.0/0 -j **ACCEPy X S ~T**
systemctl dae, . [ J ` X s ymon-reload
systemctl restart docker

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

k8s 1.9以后的版本_ - W P n t ) V建议使用i. c # = B = Lpvs网络代理方案,它和iptables均基于netfilter
差异如下

  • IPVS为大型集群提供了更好的可扩展性和性能。
  • IPVS支持比iptables~ = { o H t U更复杂的负载平衡算法(最小负载,最少连接,位置,加权等)。
  • IPVS支持服务器T h F e w l健康检查和连接重试! S s S