pod
containerPort
containerPort是在pod控制器中定义的,pod中的容器需要暴露的端口,需要暴露什么端口取决于镜像构建时该服务所暴露的端口
例如,mysql 服务需要暴露 3306 端口,redis 暴露 6379 端口
如下是一个nginx的deployment.yaml
配置文件
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
进行访问
[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
配置文件
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端口才可以
[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暴露80端口。
nodePort
nodePort 提供了集群外部客户端访问 Service 的一种方式,nodePort 提供了集群外部客户端访问 Service 的端口,通过 nodeIP:nodePort
提供了外部流量访问k8s集群中service的入口。
比如外部用户要访问k8s集群中的一个Web应用,那么我们可以配置对应service的type=NodePort
,nodePort=30002
。其他用户就可以通过浏览器nodeIP:30002
访问到该web服务(nodeIP为集群中的任意一个ip即可)。
例如访问 172.21.212.151:30002/
即可访问到nginx