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
显示出来的InternalIP就是NodeIP。

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
1.3 Cluster IP
Service的IP地址,此为虚拟IP地址。外部网络无法ping通,只有kubernetes集群内部访问使用。
在kubernetes查询Cluster IP
kubectl get svc -n kube-system
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
















