Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。pod可以理解为是花生壳,一个pod中好几个花生豆(container),也可能一个pod中一个container,里面的container共享pod内的IP、Network和ns(namespace)等资源,这样就存在容器的多个副本不能直接放在一个pod里的问题,必须靠端口不同来区分一个pod中的不同容器。所有功能都是通过api接口实现。
一个pod有唯一的ip,pod中的副本共享这一个ip,共享一个ip不冲突,但不能在一个pod里启动同一容器的多个副本
1、查看namespace,默认为defalut
[root@server2 network-scripts] kubectl get namespaces
2、查看系统服务组建
[root@server2 network-scripts] kubectl get pod -n kube-system
查看到系统个各个组件都是正常状态
3、查看集群节点
[root@server2 network-scripts] kubectl get node -o wide
[root@server2 network-scripts] kubectl get node
4、查看flanner网络插件的分配的地址
server2
server3
server4
5、查看所有服务
[root@server2 network-scripts] kubectl get all
运行一个名为demo的服务,启用镜像myapp:v1(已经上传在了harbor仓库)
[root@server2 ~] kubectl run demo --image=myapp:v1
[root@server2 ~] kubectl get pod
[root@server2 ~] kubectl get pod -o wide
[root@server2 ~] kubectl describe pod demo
[root@server2 ~] kubectl delete pod demo 删除pod节点demo
1、创建deployment控制器,这种方式可以使用–replicas参数指定创建副本的个数,集群会自动创建Pod,此时查看pod信息可以看到pod中有两个随机调度生成的容器副本
[root@server2 ~] kubectl create deployment demo --image=myapp:v1 --replicas=2
[root@server2 ~] kubectl get pod -o wide
[root@server2 ~] curl 10.244.141.195
[root@server2 ~] kubectl get all
[root@server2 ~] kubectl delete deployments.apps demo 删除控制器下的demo进程
2、自动维持副本数量
(这里删除了刚刚的控制控制器,重新创建的控制器在进行以下操作,所以ip和vip都变了)
删除pod中的某个容器副本后,RS副本控制器自动检测到容器副本数量不足,会重新拉起一个容器副本
3、暴露端口
[root@server2 pod] kubectl expose deployment demo --port=80 --target-port=80 将此pod里面的容器的80端口暴露出来,映射到pod的80端
暴露deployment控制器创建service,设定暴露端口,此时k8s集群会为pod自动分配总的虚拟IP即vip。
4、访问这一vip会轮询pod中的两个容器副本,实现自动负载均衡
5、查看SVC服务
(service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。)
查看到暴露的是pod里面各个副本的80端口
7、自动健康检测
删除pod中的某个容器副本,RS副本控制器重新拉起一个容器副本,可以看到新建容器分配到的ip改变,此时再次查看service的详细属性信息可以看到其包含的两个访问后端的ip也自动进行了更新,我们可以将其理解为另一种形式的健康检测。
svc的端口进行了自动更新
创建两个副本,可以看到这里正好两个副本都在server3
我们删除一个副本,查看发现,数量还是两个,但是对应的名字改变了。这是因为Deployment控制器的机制,他发现副本数量不足2时,他会自动创建,补足两个副本。
集群内部任意节点可以访问Pod,但集群外部无法直接访问。
kubectl expose deployment demo --port=80 --target-port=80
,此时pod客户端可以通过service的名称或ip访问后端的两个Pod,设定可供集群外部访问的虚拟IP
访问该虚拟ip,可以看到负载均衡的落在两个后端上
kubectl describe svc demo 可以详细的看到demo这个服务的虚拟ip和两个后端
Pod扩容,从2个副本变为6个副本
可以看到有六个后端服务
同理,缩容也很简单,多余的副本会被回收(缩容时,最新创建pod的会被最先删除)
1、将镜像从myapp:v1更新为myapp:v2
2、可以看到更新的容器获得了ip
3、查看集群中所有已存在的资源可以发现,原来的RS副本控制器不会删掉,会创建新的RS控制器,这样便于镜像版本回滚,当pod中镜像回滚到原来的版本时,原来的控制器又会再次运行
4、使用deployment控制器回滚pod中容器副本的镜像版本,查看Pod资源的额外信息得到容器分配到的ip, curl访问查询到的ip可以看到生成容器所使用的镜像版本已回滚,这里也可以通过访问service的虚拟vip看到生成容器所使用的镜像版本已回滚,原来的RS控制器再次运行,同理新的RS控制器不会删掉
K8s中所有的内容都抽象为资源,资源实例化之后,叫做对象。集群资源分为:名称空间级别、集群级别、元数据型。
名称空间级别:工作负载型资源:service,pod,Redeployment(控制器,我们很少直接操作pod,而是通过控制器来操作Pod)、ReplicaSet、StatefilSet、Job、Cronjob服务发现及服务均衡资源型资源:Service、Ingress配置与存储型资源:Volume、CSI(容器存储接口,可以扩展各种第三方的存储卷)、ConfigMap、Secret、DownwardAPI特殊类型的存储卷:ConfigMap(当配置中心来使用的资源类型)、Secret(保存敏感数据)、DownwardAPI(把外部环境中的信息输出给容器)集群级别:集群级资源:Namespace、Node、Role、rolebinding、clusterrolebinding元数据型:元数据型资源:HPA、podtemplate、limitrange(限制资源的如cpu、内存等)
参数名 | 字段类型 | 说明 |
---|---|---|
version | String | 这里是指的是K8S API的版本,可以用”kubectl api-versions“命令查询 |
kind | string | 这是指的是yaml文件定义的资源类型和角色,比如:pod |
metadata | Object | 元数据对象,固定值就写metedata |
metadata.name | string | 元数据对象的名字,这里由我们编写,比如命名Pod的名字 |
metadata.namespace | string | 元数据对象的命名空间,由我们自身定义 |
Spec | Object | 详细定义对象,固定值就写Spec |
spec.containers[] | list | 这里是Spec对象的容器列表定义,是个列表 |
spec.containers[].name | string | 这里定义容器的名字 |
spec.containers[].image | string | 这里定义要用到的镜像名称 |
spec.containers[].imagePullPolicy | string | 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选(1)Always:意思是每次都尝试重新拉取镜像(2)Never:表示仅适用本地镜像(3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。上面三个值都没设置的话,默认是Always。 |
spec.containers[].command[] | list | 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。 |
spec.containers[].args[] | list | 指定容器启动命令参数,因为是数组可以指定多个。 |
spec.containers[].workingDir | string | 指定容器的工作目录 |
spec.containers[].volumeMounts[] | list | 指定容器内部的存储卷配置 |
spec.containers[].volumeMounts[].name | string | 指定可以被容器挂载的存储卷的名称 |
spec.containers[].volumeMounts[].mountPath | string | 指定可以被容器挂载的存储卷的路径 |
spec.containers[].volumeMounts[].readOnly | string | 设置存储卷路径的读写模式,ture或者false,默认是读写模式 |
spec.containers[].ports[] | list | 指定容器需要用到的端口列表 |
spec.containers[].ports[].name | string | 指定端口的名称 |
spec.containers[].ports[].containerPort | string | 指定容器需要监听的端口号 |
spec.containers[].ports[].hostPort | string | 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
spec.containers[].ports[].protocol | string | 指定端口协议,支持TCP和UDP,默认值为TCP |
spec.containers[].env[] | list | 指定容器运行前需设置的环境变量列表 |
spec.containers[].env[].name | string | 指定环境变量名称 |
spec.containers[].env[].value | string | 指定环境变量值 |
spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
spec.containers[].resources.limits.cpu | string | 指定CPU的限制,单位为Core数,将用于docker run –cpu-shares参数 |
spec.containers[].resources.limits.memory | string | 指定mem内存的限制,单位为MIB、GiB |
spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
spec.containers[].resources.requests.cpu | string | CPU请求,单位为core数,容器启动时初始化可用数量 |
spec.containers[].resources.requests.memory | string | 内存请求,单位为MIB、GiB,容器启动的初始化可用数量 |
spec.restartPolicy | string | 定义pod的重启策略,可选值为Always、OnFailure、Never,默认值为Always。 1.Always:pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。2.OnFailure:只有pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubectl将不会重启它。3.Never:Pod终止后,kubelet将退出码报告给master,不会重启该pod |
spec.nodeSelector | Object | 定义Node的label过滤标签,以key:value格式指定 |
spec.imagePullSecrets | Object | 定义pull镜像时使用secret名称,以name:secretkey格式指定 |
spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为false。设置True表示使用宿主机网络,不使用docker网桥,同时设置了True将无法在同一台宿主机上启动第二个副本 |
1、在使用API接口时可以查询有哪些API接口的群组和版本
2、创建pod目录并在该目录下编写文件构建资源清单pod.yaml(.yaml文件与.yml文件无区别),应用资源清单,此时可以查看到生成的pod,其中包含了由myapp镜像生成的一个副本
[root@server2 ~] mkdir pod
[root@server2 ~] cd pod/
[root@server2 pod] vim pod.yaml 图1//
apiVersion: v1 %指明api资源属于哪个群组和版本,同一个组可以有多个版本
kind: Pod %标记创建的资源类型,k8s主要支持以下资源类别(Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob)
metadata: %元数据name: pod-example %此pod服务的名称
spec: %定义目标资源的期望状态containers:- name: myapp %container容器名字image: myapp:v1 %指定镜像[root@server2 pod] kubectl apply -f pod.yaml %执行二进制文件
[root@server2 pod] kubectl describe pod pod-example 图2
查看api安装状态
[root@server2 pod] kubectl get pod 图3、查看目前pod节点的运行情况
图1
图2此服务启用在server3上,server3上的操作如下
图3发现pod-example这个pode节点已经启用
3、在刚才基础上添加一个镜像文件
在一个pod里面拥有了两个镜像文件,此时连接进入pod中busybox容器的bash环境,访问地址看到的是pod中myapp容器的发布页面,这是因为pod中所有的副本共享一个ip
vim pod.yaml///
apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:containers:- name: myappimage: myapp:v1- name: busybox 新添加的镜像文件image: busybox:latesttty: truestdin: true
1、应用资源清单,发现会从仓库拉取镜像
2、编辑资源清单,设置拉取策略imagePullPolicy为IfNOtPresent,当本地不存在时再拉取镜像。
删除生成的pod,读取应用资源清单重新创建pod,此时查看pod的详细信息可以看到未重复拉取镜像(资源清单创建的pod不会自动更新,需要读取清单删除后再重建)
[root@server2 pod] cat pod.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresent- name: busyboximage: busybox:latesttty: truestdin: trueimagePullPolicy: IfNotPresent
编辑资源清单,指定生成的pod中容器暴露的端囗号containerPort,指定容器所在主机映射的端口hostPort,默认跟上面containerPort相同
apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 80
容器运行在server4上面,查看server4的端口发现了容器的映射
1、删除由资源清单生成的pod,编辑资源清单,设置主机网络模式hostNetwork值为true即使用宿主机网络,读取应用资源清单重新创建pod
[root@server2 pod] cat pod.yaml /
apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:hostNetwork: true 使用宿主机网络 containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresentports:- containerPort: 80hostPort: 80
2、发现其ip为正式主机的ip
3、查看Pod资源的额外信息可以看到pod的ip为其运行节点主机的ip,curl访问该ip,可以成功访问pod中容器副本的默认发布页面
注意:设置了hostNetwork值为true将无法在同一台宿主机上启动该容器的第二个副本
[root@server2 pod] vim pod.yaml apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresentresources:requests:cpu: "100m"memory: "50Mi"limits:cpu: "200m"memory: "100Mi"//
查看到cpu和内存的限制
[root@server2 pod]# cat pod.yaml apiVersion: v1
kind: Pod
metadata:name: pod-example
spec:nodeName: server4 %使用server4作为后端containers:- name: myappimage: myapp:v1imagePullPolicy: IfNotPresentresources:requests: cpu: "100m"memory: "50Mi"limits: cpu: "200m"memory: "100Mi"
//