pod

pod是一个node里面的基本单元,一个pod里面可以有多个容器,但是一般一个pod只含有一个容器,这是因为一个pod里面的所有容器是共享该pod的ip地址和端口的,若有多个容器则往往会导致端口冲突

pod也是k8s扩缩容的基本单位,若一个pod里面有多个容器(如一个前端和一个后端),那么扩容的时候,就会复制两个容器的内容,但是往往只需要两个前端和一个后端,所以多扩充了一个后端,会造成资源的浪费

同一个pod里面的所有容器使用一个network和UTS命名空间,并且共享相同的主机名和网络接口

1.一个pod不会跨多个节点工作
2.pod里面有多个容器的情况往往是多个容器需要一起运行、多个容器需要作为一个整体运行或者是多个容器需要一起扩缩容

#查看集群中所有pod的统计信息,使用--show-labels选项可以看到每个节点的label信息,使用-o wide可以显示pod的ip以及pod运行的宿主节点
kubectl get pods
#查看集群中指定pod的统计信息
kubectl get pod podname
#查看指定pod的详细信息
kubectl describe pod podname
#改变节点的label,其中podname是指要更改pod的name值,labelkey是要更改的label标签,labelvalue指更改的标签值,若是label可以已经存在在该节点的label中,那么就需要添加选项--overwrite来重写该labelkey的值
kubectl label pod podname labelkey=labelvalue
#查看指定pod的日志,若pod中包含多个容器,则可以使用-c+容器名字查看指定容器的日志
kubectl logs podname
#查看具有指定标签的pod,若在labelkey后面添加选择(labelkey=labelvalue)则就起到了标签选择器的作用
kubectl get pod -l labelkey
#将pod服务发布出去
kubectl expose pod podname --type=LoadBalancer

利用yaml文件创建pod资源,也可使用json文件去创建pod资源,yaml文件内容如下:

apiVersion: v1
kind: Pod
metadata: 
    name: pod-learning
spec:
    containers:
    -  image: nginx
       name: nginx
       ports:
       -  containerPort: 8081

然后使用kubectl create -f pod-learning.yaml来创建pod资源
查看该pod的json文件:
kubectl get pod pod-learning -o json

pod管理器

pod管理器的详解

node

node是K8s集群中的组成单元,node分为两种类型,分别是master节点和worker节点。

master节点:负责kubernetes的控制和管理整个集群系统
worker节点:负责运行应用的部署和管控

#1.展示集群中的node节点
kubectl get nodes
#2.查看某个node的详细信息
kubectl describe node nodename
#3.给节点打标签
kubectl label node nodename labelkey=lablevalue

service

service能够保证k8s发布应用的ip地址始终不变,k8s使用server去为一组功能相同的pod提供单一不变的接入点,当service存在时,该服务的ip和端口号始终不变
示例图如下:
在这里插入图片描述
从上图可以看出,service的作用类似与于路由器,用来做流量转发,service并不会提供服务,提供服务的是后台的3个pod
通过yaml文件创建service服务,文件内容如下:
在这里插入图片描述
其中的sessionAffinity字段是用来设置会话一致性的,默认为None值,当值为ClientIP时,其作用就类似于nginx的iphash算法。且该服务暴露了两个端口,一个监听80端口,一个监听8080端口
service是用来发布服务的,其有三种类型,详情见如下链接
nodeport、loadbalancer、clusterip

获得当前集群中服务的IP地址和端口信息

方式一:通过环境变量获得

在pod开始运行的时候,k8s会初始化一系列的环境变量,包括服务的环境变量,因此在service创建之后的pod运行时,都会有关于该service的环境变量,

#创建一个服务,用yaml文件创建
kubectl create -f service-learning.yaml
#创建一个pod
kubectl create -f pod-learning.yaml
#查看新创建容器里面的环境变量
kubectl exec pod-learning env

1.kubectl attach和kubectl exec的区别在于kubectl exec会重新运行一个进程,而kubectl attach会附属到容器中正在运行的主进程中

可以看到环境变量分别对应着该集群中的两个服务,
在这里插入图片描述

方式二:通过DNS获得

查看两个service的详细信息,发现learningservice的endpoints为none(这是因为创建service时没有指定pod选择器,导致服务不知道该包含哪些pod,因此不会有endpoints资源),但是kubernetes的enpoints为nodeIp:端口号
在这里插入图片描述

进入集群中pod的内部:

kubectl exec -it podname /bin/bash

在这里插入图片描述
然后在pod里面通过dns的方式去访问服务,由于服务的集群IP是一个虚拟IP,需要配合服务的端口使用才有意义,因此单独ping ip地址是ping不通的
在这里插入图片描述
可以看到开启了endpoints字段的服务能够正常访问,但是没有endpoints字段的服务访问不了

卷-configmap、secret

endpoint

服务并不是直接和pod相连的,是通过endpoint资源将服务和pod连接起来的,endpoint资源是暴露一个服务的Ip地址和端口的列表。而在编写yaml文件时指定的选择器就是用来构建IP地址和端口列表,并存储在endpoint资源中。若创建服务的时候没有指定selector,则不会创建endpoint资源,若想要服务能够访问,则需要手动去创建endpoint资源

#获取endpoint资源的信息
kubectl get endpoints servicename

可以手动的去配置endpoint资源,让上面的learningservice服务可以访问。编写yaml文件如下:
在这里插入图片描述
然后查看是否已经存在了endpoints资源,若存在则进行删除,不存在则直接进行创建并且将service映射到对应的endpoints上

#查看服务是否已经创建了endpoints资源
kubectl get ep learningservice
#删除服务对应的endpoints资源
kubectl delete -f learning-service-endpoint.yaml/kubectl delete ep learningservice
#创建endpoints资源
kubectl create -f learning-service-endpoint.yaml

在这里插入图片描述

#发布服务,可以使用yaml文件,也可以使用如下方式发布服务
kubectl expose pod podname --type=LoadBalancer
##查看发布的服务
kubectl get services
##查看发布服务的详细信息
kubectl describe servive/svc servicename

Ingress

ingress则可以通过一个IP对外发布多个服务,相当于7层的负载均衡,loadbalancer是三层的负载均衡
Ingress会根据请求的主机名和路径决定请求转发的服务,因为转发了数据包,所以源IP地址会进行nat转换,因此看不到客户端的IP地址
minikube中开启ingress功能,注意,开启该功能之前,必须要保证本机的80端口没有被占用:

#查看minikube中的所有组件
minikube addons list
#启动ingress组件
minikube addons enable ingress
#查看ingress是否启动
kubectl get pods -n kube-system

看到如图所示界面的红色记录即可:
在这里插入图片描述
确保ingress启动之后,通过yaml文件创建Ingress资源,文件内容如下:
在这里插入图片描述
查看ingress内容:
在这里插入图片描述
这里必须保证集群中存在nginxservicenodeport服务,查看ingress,有相应的地址记录即可,然后通过在虚拟机中修改hosts文件(添加记录:ADDRESS的值 HOSTS的值),访问hxy.te.com:
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐