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:显示详细信息,包括数据包和字节计数。
这组规则主要用于将目标端口为 8081 的 TCP 流量转发到内部地址 10.2.3.24 的端口 80。前两条规则则是为了处理来自特定 IP 的流量并进行标记。通过查看包和字节计数,你可以了解这些规则的使用情况。
Server 资源下的 [ Cluster IP] 进行内部访问
## 不同名称空间无法通信,跨名称空间通信
[root@c7-test /]# ping nginx-svc.default.svc.cluster.local
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 ### 类型
#### 一个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
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>
master 和 node 上面都开启30000 端口