关于k8s里Pod中容器应用服务的访问问题

56 阅读2分钟

1.新建一个Deployment资源

kubectl create deployment my-nginx --image=nginx --replicas=3

这种写法是一种简单的写法,也可以通过编写一个my-nginx.deployment的方式实现

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata: 
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx

2.将逻辑资源绑定到物理资源

kubectl apply -f my-nginx.deployment
k get pods -A -o wide  #查看Pod的IP地址

image.png

curl http://IP:80  #因为Nginx默认的端口是80,使用Pod的IP+Nginx的端口可以访问

结果如下:

image.png

3.改用Service(nginx-service.yaml)

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2025-03-01T13:05:39Z"
  labels:
    app: my-nginx
  name: nginx-service
  namespace: default
  resourceVersion: "15021"
  uid: 1ce01f2a-5d49-4e38-a14c-65bf3e64f06d
spec:
  clusterIP: 10.103.85.53
  clusterIPs:
  - 10.103.85.53
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: my-nginx
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

值得注意的是这时候k8s会为Service分配一个ClusterIP,只允许本集群内部进行访问,如下图所示,同时从图中可以看出使用curl http://ClusterIP:80 的方式可以访问Nginx服务

image.png

4.改用Service的NodePort方式

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2025-03-01T13:05:39Z"
  labels:
    app: my-nginx
  name: nginx-service
  namespace: default
  resourceVersion: "15021"
  uid: 1ce01f2a-5d49-4e38-a14c-65bf3e64f06d
spec:
  clusterIP: 10.103.85.53
  clusterIPs:
  - 10.103.85.53
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - port: 80
    protocol: TCP
    nodePort: 32689  #节点端口,会在每个节点含master、node节点都启动该端口,如果不写默认随机生成端口,NodePort端口范围只允许30000-32767
    targetPort: 80
  selector:
    app: my-nginx
  sessionAffinity: None
  type: NodePort     #注意这行的修改
status:
  loadBalancer: {}

这个时候除了集群内部,外部的主机也可以进行访问了,使用 http://主机IP:nodePort 进行访问,我使用的是云服务器,这里的IP需要使用ssh可以远程登录的那个。在我自己的主机的浏览器上可以进行访问,见下图。

image.png

参考文章:service资源讲解、修改nodeport类型的service暴露端口范围-CSDN博客
作者:MssGuo