1. Kubernetes资源介绍
1.1 pod
容器都是由镜像启动的。但在容器外面会通过Pod将容器包裹起来,一个pod里面可以运行一个或者多个容器,这个pod的特征包括
· Pod里的所有容器都会调度到同一个节点上运行
· Pod中的所有容器会共享同一网络,它们有一个唯一的IP,叫PodIP
· Pod中还有一个特殊的容器叫Pause,他会优先启动然后进行IP分配,而后将其他容器都link到该容器上,实现网络共享
网络通讯模式的方式:
1、同一个Pod内的多个容器之间:localhost
2、各Pod之间的通讯:Overlay Network
3、Pod与Service之间的通讯:各节点的Iptables规则
1.2 Deployment
在Pod的上一层就是ReplicaSet控制器,他主要负责管理Pod的副本数,但通常我们并不直接使用ReplicaSet,而是使用比ReplicaSet更高一级的Deployment。由Deployment管理ReplicaSet,它会自动帮我们创建和销毁RS。有了Deployment就可以实现应用的滚动更新。
1.3 Service
Service,是Kubernetes用来实现Pod负载均衡的一个服务;要想实现Pod的负载均衡,首先需要通过labels为Pod打上特定的标签,而后创建Service时使用Selector选择对应的标签,最终通过节点的Kube-proxy来完成负载均衡的规则创建。
1.4 Namespace
在 Kubernetes中,名字空间提供一种机制,将同一集群中的资源划分为互为隔离的组。同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求
· 对资源对象进行隔离:比如: Pod、Deployment、service将其划分为相互隔离的组
· 对资源配额进行隔离:CPU,Memory,限制某个NS的可以使用的CPU和内存
namespace仅能隔离带有命名空间的资源,而不带命名空间的资源不支持隔离,可以通过 kubectl api-resources 查看哪些资源属于空降级别,哪些不属于空间级别。
namespace隔离其实是名称的隔离,并不是物理的隔离,所以重点在于资源隔离。
2.Kubernetes资源实践
通过部署应⽤来理解Kubernetes中的资源
一个yaml文件metadata是作为一种资源的开始,template是pod资源的模板,deployment 通过selector(标签选择器)去管理具有相同标签的pod
2.1 部署应⽤
[root@k8s-master deploy]# more 01-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deploy
namespace: default
spec:
replicas: 3 #期望deploy部署的pod的副本数量是3
selector:
matchLabels:
run: app #selector标签选择器选择带有run=app
template: #创建pod的模板
metadata:
labels:
run: app #给Pod定义一个标签
spec:
containers:
- name: app-container #容器的名字
image: nginx #容器使用的镜像
ports:
- containerPort: 80 #容器对外的端口
2.2 访问应⽤
[root@k8s-master deploy]# more 02-service.yaml
apiVersion: v1
kind: Service
metadata:
name: app-service #这个名称会被CoreDns解析到
namespace: default
spec:
selector: #Service后端是那些pod,通过标签选择
run: app
ports:
- name: http
port: 8080 #负载均衡的端口 user————》serviceIP+port--》podIP+port
targetPort: 80 #容器对外的端口
[root@k8s-master deploy]# kubectl describe service app-service
Name: app-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: run=app
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.105.180.88
IPs: 10.105.180.88
Port: http 8080/TCP
TargetPort: 80/TCP
Endpoints: 10.244.107.193:80,10.244.169.138:80,10.244.36.65:80
Session Affinity: None
Events: <none>
2.3 Scale应⽤
#做副本数操作
kubectl scale deployment app-deploy --replicas=5 #设置能5个
kubectl scale deployment app-deploy --replicas=2 #设置能2个
2.4 滚动更新以及回退
# 语法:kubectl set image 工作负载方式/Pod名称 镜像名称=需要调整的镜像 --record
# --record 用作记录滚动更新的信息, 后面方便版本回退
kubectl set image deployment/app-deploy *=nginx:1.16.1 --record
kubectl set image deployment/app-deploy http=nginx:1.16.1 --record
[root@k8s-master deploy]# kubectl get rs
NAME DESIRED CURRENT READY AGE
app-deploy-5c4b7ddcbf 0 0 0 106m
app-deploy-74bfbbd 3 3 3 7m55s
滚动更新:命令方式:1、需要修改镜像的版本;
kubectl set image deployment app-deploy *=demoapp:v1.1 --record=true
2、回退可以执行命令在部署一次,也可以直接回退到之前历史版本上;
kubectl set image deployment app-deploy *=demoapp:v1.0 --record=true # 重新部署旧版本也算回退了一次,可能会产生新的RS;
1、查看历史的部署记录,看需要回退到那个版本上;
kubectl rollout history deployment app-deploy
2、通过命令直接回退
kubectl rollout undo deployment app-deploy --to-revision=Number
yaml:
更新: 直接修改镜像版本;
回退: 直接修改镜像版本;