pod

containerPort

containerPort是在pod控制器中定义的,pod中的容器需要暴露的端口,需要暴露什么端口取决于镜像构建时该服务所暴露的端口

例如,mysql 服务需要暴露 3306 端口,redis 暴露 6379 端口

如下是一个nginx的deployment.yaml配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: apps/v1
kind: Deployment      
metadata:
  name: pc-deployment
  namespace: dev
spec: 
  strategy: # 策略
    type: Recreate # 重建更新
  replicas: 1
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80	# 此处定义暴露的端口

启动nginx,通过生成的ip:containerPort进行访问

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@clustermaster test]# kubectl apply -f deployment.yaml
deployment.apps/pc-deployment created
[root@clustermaster test]# kubectl get deploy -n dev
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
pc-deployment   1/1     1            1           14s
[root@clustermaster test]# kubectl get pod -n dev
NAME                             READY   STATUS    RESTARTS   AGE
pc-deployment-5d89bdfbf9-qnmc8   1/1     Running   0          31s
[root@clustermaster test]# kubectl get pod -n dev -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES
pc-deployment-5d89bdfbf9-qnmc8   1/1     Running   0          39s   10.244.1.47   clusternode1   <none>           <none>
[root@clustermaster test]# curl 10.244.1.47
...
<h1>Welcome to nginx!</h1>
...

service

如下是一个service.yaml配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
  name: service-nodeport
  namespace: dev
spec:
  selector:
    app: nginx-pod
  type: NodePort # service类型
  ports:
  - port: 8081 # 服务访问端口,集群内部访问的端口
    nodePort: 30002 # NodePort,外部客户端访问的端口 指定绑定的node的端口(默认的取值范围是:30000-32767), 如果不指定,会默认分配
    targetPort: 80 # pod控制器中定义的端口(应用访问的端口)

port

port是暴露在cluster ip上的端口,port提供了集群内部客户端访问service的入口,即 CLUSTER-IP:port

可以看到,通过CLUSTER-IP访问80端口是访问不到的,必须是service中配置的port端口才可以

1
2
3
4
5
6
7
8
9
[root@clustermaster test]# kubectl get service -n dev -o wide
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
service-nodeport   NodePort   10.102.217.51   <none>        8081:30002/TCP   13s   app=nginx-pod
[root@clustermaster test]# curl 10.102.217.51
curl: (7) Failed connect to 10.102.217.51:80; 拒绝连接
[root@clustermaster test]# curl 10.102.217.51:8081
...
<h1>Welcome to nginx!</h1>
...

targetPort

targetPort是pod上的端口,从port/nodePort上来的数据,经过kube-proxy流入到后端pod的targetPort上,最后进入容器。

与制作容器时暴露的端口一致(使用DockerFile中的EXPOSE),例如官方的nginx(参考DockerFile)暴露80端口。

nodePort

nodePort 提供了集群外部客户端访问 Service 的一种方式,nodePort 提供了集群外部客户端访问 Service 的端口,通过 nodeIP:nodePort 提供了外部流量访问k8s集群中service的入口。

比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePortnodePort=30002。其他用户就可以通过浏览器http://nodeIP:30002访问到该web服务(nodeIP为集群中的任意一个ip即可)。

例如访问 http://172.21.212.151:30002/即可访问到nginx

image-20230427213938580