Kubernetes的Server资源


server资源介绍

通过前面的实验我们已经掌握了使用Pod控制器来管理Pod,我们也会发现,Pod的生命周期非常短暂,每次镜
像升级都会销毁以及创建,而我们知道每个Pod都拥有自己的IP地址,并且随着Pod删除和创建,这个IP是会
变化的。
当我们的Pod数量非常多的时候前端的入口服务该怎么知道后面都有哪些Pod呢?
为了解决这个问题k8s提供了一个对象Service和三种IP,创建的Service资源通过标签可以动态的知道后端
的Pod的IP地址,在PodIP之上设计一个固定的IP,也就是ClusterIP,然后使用NodePort来对外暴露端口
提供访问。
接下来我们先认识一下K8s里的三种IP及其作用。

进行外部通信的三种方式

pod资源内进行端口映射(ports)

#### 这是一个简单的基于防火墙的端口转发  
apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  namespace: default
spec:
  containers:
  - name: nginx-container-v2
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    ports:
    - name: http-port
      containerPort: 80
      hostPort: 8081
      
## 只能node03 的8081 端口转发  
## 通过iptable  无法通过iptable查看

iptables -t nat -L -n -v
-t nat:指定要查看的表是 nat 表。
-L:列出规则链。
-n:不解析主机名和服务名,直接显示 IP 地址和端口号,速度更快。
-v:显示详细信息,包括数据包和字节计数。

image-20240924160720531image-20240924160807358

image-20240924161612549

这组规则主要用于将目标端口为 8081 的 TCP 流量转发到内部地址 10.2.3.24 的端口 80。前两条规则则是为了处理来自特定 IP 的流量并进行标记。通过查看包和字节计数,你可以了解这些规则的使用情况。

Server 资源下的 [ Cluster IP] 进行内部访问

## 不同名称空间无法通信,跨名称空间通信
[root@c7-test /]# ping nginx-svc.default.svc.cluster.local

image-20240924165436817

Node IP:宿主机的IP地址
POD IP:容器的IP地址
Cluster IP:容器的负载均衡IP

## Service资源涉及到的网络
	ClusterIP:IP地址
	NodePort:端口
	
对一组拥有同样标签的pod进行代理  通过CoreDNS进行域名解析 
apiVersion: "v1"
kind: "Service"
metadata:
  name: nginx-svc     ### server资源名
  namespace: default
spec:
  selector:           ### 用于选择与服务关联的 Pod。
    run: nginx-deploy  ## pod标签
  ports:
  - name: http-nginx   ### port端口名
    port: 80           ### server监听的端口	
    protocol: TCP      ### 连接方式
    targetPort: 80     ### pod内的端口
  type: ClusterIP      ### 类型  

image-20240924161856841

#### 一个dp资源清单  ser.yaml 
apiVersion: "apps/v1"
kind: "Deployment"
metadata:
  name: nginx-dp
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      run: nginx-c
  template:
    metadata:
      name: nginx-c
      namespace: default
      labels:
        run: nginx-deploy
    spec:
      containers:
      - name: nginx-container
        image: nginx:alpine
        imagePullPolicy: IfNotPresent

### 一个server清单下的cluster IP   dp.yaml
apiVersion: "v1"
kind: "Service"
metadata:
  name: nginx-svc
  namespace: default
spec:
  selector:
    run: nginx-deploy
  ports:
  - name: http-nginx
    port: 88
    protocol: TCP
    targetPort: 80
  type: ClusterIP
### 运行两个标签
[root@master ser]# kubectl apply -f ser.yaml 
service/nginx-svc created
[root@master ser]# kubectl  apply -f dp.yaml 
deployment.apps/nginx-dp created

[root@master ser]# kubectl get pod -owide
NAME                          READY   STATUS    RESTARTS   AGE   IP          NODE     
nginx-dp-6589d5f54-7hgc7      1/1     Running   0          9s    10.2.2.12   node02   
nginx-dp-6589d5f54-glx6r      1/1     Running   0          9s    10.2.1.13   node01   
nginx-dp-6589d5f54-zdk85      1/1     Running   0          9s    10.2.3.25   node03  

[root@master ser]# kubectl get service nginx-svc -owide
NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE     SELECTOR
nginx-svc   ClusterIP   10.1.245.125   <none>        88/TCP    5m31s   run=nginx-deploy

[root@master ser]# kubectl describe service nginx-svc 
Name:              nginx-svc
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          run=nginx-deploy
Type:              ClusterIP
IP:                10.1.245.125
Port:              http-nginx  88/TCP
TargetPort:        80/TCP
Endpoints:         10.2.1.13:80,10.2.2.12:80,10.2.3.25:80
Session Affinity:  None
Events:            <none>
### 写三个
[root@master ser]# kubectl exec -it nginx-dp-6589d5f54-zdk85 -- sh
/ # echo node03 > /usr/share/nginx/html/index.html 

### curl cluster ip  是进行负载均衡的
[root@master ser]# curl 10.1.245.125:88
node02
[root@master ser]# curl 10.1.245.125:88
node01
[root@master ser]# curl 10.1.245.125:88
node03

###  通过ping server资源名 进行通信
[root@master ser]# kubectl exec -it nginx-test -- sh
/ # ping nginx-svc
PING nginx-svc (10.1.245.125): 56 data bytes
64 bytes from 10.1.245.125: seq=0 ttl=64 time=0.042 ms
64 bytes from 10.1.245.125: seq=1 ttl=64 time=0.075 ms
64 bytes from 10.1.245.125: seq=2 ttl=64 time=0.068 ms
64 bytes from 10.1.245.125: seq=3 ttl=64 time=0.076 ms
^C
--- nginx-svc ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.042/0.065/0.076 ms

/ # curl nginx-svc:88
node02
/ # curl nginx-svc:88
node01
/ # curl nginx-svc:88
node03

image-20240924165307068

Server 资源下的 [ NodePort] 进行外部访问

将拥有同一个标签的pod分为一组  对外映射端口(30000-65535)  进行负载
宿主机 30000 --- > serIP:80 -----> podip:80
apiVersion: "v1"                      # 定义 Kubernetes API 版本,使用核心 API 版本 v1。
kind: "Service"                        # 对象类型为 Service,用于暴露一组 Pods 作为网络服务。
metadata:
  name: nginx-port                     # Service 的名称为 nginx-port,用户自定义名称。
  namespace: default                   # Service 所在的命名空间为 default,若未指定则默认使用 default 命名空间。
spec:
  selector:
    run: nginx-deploy                  # selector 匹配的标签是 run: nginx-deploy,这表示该 Service 会选择带有此标签的 Pods。
  ports:
  - name: http-nginx                   # 给端口定义一个名称 http-nginx,便于在多个端口时进行区分。
    port: 80                           # Service 公开的端口号为 80,外部流量将通过这个端口访问。
    protocol: TCP                      # 使用的网络协议为 TCP。
    targetPort: 80                     # Service 将流量转发到 Pod 内的目标端口 80,通常是容器内的服务端口。
    nodePort: 30000                    # 在每个节点上分配的特定端口,外部客户端可以通过节点 IP 和这个端口访问服务。
  type: NodePort                       # Service 类型为 NodePort,意味着它会在每个节点的指定端口上公开服务。

[root@master ser]# kubectl get service nginx-port 
NAME         TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-port   NodePort   10.1.221.130   <none>        80:30000/TCP   3m48s
[root@master ser]# kubectl describe service nginx-port 
Name:                     nginx-port
Namespace:                default
Labels:                   <none>
Annotations:              <none>
Selector:                 run=nginx-deploy
Type:                     NodePort
IP:                       10.1.221.130
Port:                     http-nginx  80/TCP
TargetPort:               80/TCP
NodePort:                 http-nginx  30000/TCP
Endpoints:                10.2.1.13:80,10.2.2.12:80,10.2.3.25:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

image-20240924170855319

image-20240924170520159

master 和 node 上面都开启30000 端口

image-20240924171041195

image-20240924171118281