1 k8s集群里的三种IP

Kubernetes集群里有三种IP地址,分别如下:

Node IP:Node节点的IP地址,即物理网卡的IP地址。
Pod IP:Pod的IP地址,即docker容器的IP地址,此为虚拟IP地址。
Cluster IP:Service的IP地址,此为虚拟IP地址。

1.1 Node IP

可以是物理机的IP(也可能是虚拟机IP)。每个Service都会在Node节点上开通一个端口,外部可以通过NodeIP:NodePort即可访问Service里的Pod,和我们访问服务器部署的项目一样,IP:端口/项目名。

在kubernetes查询Node IP。

(1)kubectl get nodes
(2)kubectl describe node nodeName

kubernetes指定服务ip kubernetes service ip_kubernetes


显示出来的InternalIP就是NodeIP。

kubernetes指定服务ip kubernetes service ip_nginx_02

1.2 Pod IP

Pod IP是每个Pod的IP地址,他是Docker Engine根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络。

(1)同Service下的pod可以直接根据PodIP相互通信。
(2)不同Service下的pod在集群间pod通信要借助于cluster ip。
(3)pod和集群外通信,要借助于node ip。

在kubernetes查询Pod IP。

(1)kubectl get pods
(2)kubectl describe pod podName

kubernetes指定服务ip kubernetes service ip_IP_03

1.3 Cluster IP

Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。

在kubernetes查询Cluster IP

kubectl get svc -n kube-system

kubernetes指定服务ip kubernetes service ip_kubernetes指定服务ip_04


Cluster IP是一个虚拟的IP,但更像是一个伪造的IP网络,原因有以下几点:

(1)Cluster IP仅仅作用于Kubernetes Service这个对象,并由Kubernetes管理和分配P地址。

(2)Cluster IP无法被ping,他没有一个“实体网络对象”来响应。

(3)Cluster IP只能结合Service Port组成一个具体的通信端口,单独的Cluster IP不具备通信的基础,并且他们属于Kubernetes集群这样一个封闭的空间。

(4)在不同Service下的pod节点在集群间相互访问可以通过Cluster IP。

2 基本操作

前面已经可以通过Controller创建应用,可是当我们访问应用时,发现一个问题:由于Pod的状态不是人为控制的,Pod IP是在创建时分配的,如果在Pod被误删除,Controller重新拉起一个新的Pod时,我们发现Pod IP地址是变化着的。
我们如果访问,必须更换IP地址,这样对于大量的Pod运行应用来说,我们对Pod完全是无法控制的。
因此在k8s集群中引入另外一个概念Service。

(1)Service介绍
不是实体服务;
是一条iptables或ipvs的转发规则。

(2)Service作用
通过Service为pod客户端提供访问pod方法,即客户端访问pod入口;
Service通过Pod标签与Pod进行关联。

(3)Service类型
ClusterIP--------->>>默认,分配一个集群内部可以访问的虚拟IP
NodePort-------->>>在每个Node上分配一个端口作为外部访问入口
LoadBalancer---->>>工作在特定的Cloud Provider上,例如Google Cloud、AWS、OpenStack
ExternalName—>>>表示把集群外部的服务引入到集群内部中来,即实现了集群内部Pod与集群外部的服务进行通信

(4)Service参数
port--------->>>访问service使用的端口
targetPort–>>>Pod中容器端口
NodePort—>>>通过Node实现外网用户访问k8s集群内service(30000-32767)

(5)Service创建
默认创建的Service是ClusterIP类型
(5-1)命令行创建
首先创建Deployment控制器类型的应用
#kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1
#kubectl get deployments查看是否成功

然后创建相应的Service
#kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80
service/nginx-app exposed
#kubectl get service查看
或# kubectl get svc查看
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 8d
nginx-app ClusterIP 10.96.72.34 80/TCP 44s

#curl http://10.96.72.34

#kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.0.138:6443 8d
nginx-app 10.244.2.5:80 5m58s

#kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-app-84c4bb6478-kf72k 1/1 Running 0 9m6s 10.244.2.5 myuse2

(5-2)资源清单文件创建
#vi create.yaml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginxapp2-c
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginxapp2-svc
spec:
  type: ClusterIP
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

#kubectl apply -f create.yaml 创建
deployment.apps/nginx-app2 created
service/nginxapp2-svc created
[root@mymaster ~]# kubectl get deployment查看
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-app 1/1 1 1 18m
nginx-app2 2/2 2 2 31s
[root@mymaster ~]# kubectl get svc查看
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 8d
nginx-app ClusterIP 10.96.72.34 80/TCP 16m
nginxapp2-svc ClusterIP 10.111.61.149 80/TCP 40s
在pod所在的节点操作
#curl http://10.111.61.149
[root@mymaster ~]# kubectl get endpoints
NAME ENDPOINTS AGE
kubernetes 192.168.0.138:6443 8d
nginx-app 10.244.2.5:80 18m
nginxapp2-svc 10.244.1.5:80,10.244.2.6:80 2m42s

(6)资源清单文件创建NodePort类型的service

可以在集群外部访问
#vi create-nodeport.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app3
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx3
  template:
    metadata:
      labels:
        app: nginx3
    spec:
      containers:
      - name: nginxapp3-c
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginxapp3-svc
spec:
  type: NodePort
  selector:
    app: nginx3
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30001

#kubectl apply -f create-nodeport.yaml
deployment.apps/nginx-app3 created
service/nginxapp3-svc created

#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 8d
nginx-app ClusterIP 10.96.72.34 80/TCP 26m
nginxapp2-svc ClusterIP 10.111.61.149 80/TCP 11m
nginxapp3-svc NodePort 10.105.66.82 80:30001/TCP 24s
其中30001是Node主机的port端口
http://192.168.0.138:30001/ http://192.168.0.83:30001/ http://192.168.0.160:30001/均可以访问到

(7)删除service

#kubectl get svc
 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
 kubernetes ClusterIP 10.96.0.1 443/TCP 8d
 nginx-app ClusterIP 10.96.72.34 80/TCP 30m
 nginxapp2-svc ClusterIP 10.111.61.149 80/TCP 14m
 nginxapp3-svc NodePort 10.105.66.82 80:30001/TCP 3m33s#kubectl delete service nginx-app命令行删除service “nginx-app” deleted
 #kubectl delete -f create-nodeport.yaml 资源清单文件删除
 deployment.apps “nginx-app3” deleted
 service “nginxapp3-svc” deleted