下文给大家带来Deployment的概述及其使用场景,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用亿速云在行业内累计的经验来做一个解答。
Deployment是kubernetes 1.2引入的概念,用来解决Pod的编排问题。Deployment可以理解为RC的升级版(RC+Reolicat Set)。特点在于可以随时知道Pod的部署进度,即对Pod的创建、调度、绑定节点、启动容器完整过程的进度展示。
创建一个Deployment对象来生成对应的Replica Set并完成Pod副本的创建过程。
检查Deployment的状态来确认部署动作是否完成(Pod副本的数量是否达到预期值)。
更新Deployment以创建新的Pod(例如镜像升级的场景)。
如果当前Deployment不稳定,回退到上一个Deployment版本。
挂起或恢复一个Deployment。
Service定义了一个服务的访问入口地址,前端应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,Service与其后端的Pod副本集群之间是通过Label Selector来实现“无缝对接”。RC保证Service的Pod副本实例数目保持预期水平。
IP类型 | 说明 |
---|---|
Node IP | Node节点的IP地址 |
Pod IP | Pod的IP地址 |
Cluster IP | Service的IP地址 |
主机 | IP地址 | 服务 |
---|---|---|
master | 192.168.1.21 | k8s |
node01 | 192.168.1.22 | k8s |
node02 | 192.168.1.23 | k8s |
基于https://blog.51cto.com/14320361/2464655 的实验继续进行
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1
[root@master ~]# kubectl apply -f xgp.yaml --record
[root@master ~]# kubectl get pod
[root@master ~]# curl 10.244.2.16
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 4
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1
[root@master ~]# kubectl apply -f xgp.yaml --recore
[root@master ~]# kubectl get pod
副本数量加一,如果yaml文件的副本为0,则副本数量还是之前的状态,并不会更新。
[root@master ~]# vim xgp-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: xgp-svc
spec:
selector:
app: xgp-server
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 10.107.119.49
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1
ports:
- containerPort: 80 #提示端口
注意:在Delpoyment资源对象中,可以添加Port字段,但此字段仅供用户查看,并不实际生效
[root@master ~]# kubectl apply -f xgp.yaml
[root@master ~]# vim xgp-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: xgp-svc
spec:
type: NodePort
selector:
app: xgp-server
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30123
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl exec -it xgp-web-8d5f9656f-8z7d9 /bin/bash
//根据pod名称进入pod之中
root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# echo xgp-v1 > htdocs/index.html
root@xgp-web-8d5f9656f-8z7d9:/usr/local/apache2# exit
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl get svc
[root@master ~]# iptables-save
//查看已配置的规则
SNAT:Source NAT(源地址转换)
DNAT:Destination NAT(目标地址转换)
MASQ:动态的源地址转换
[root@master ~]# iptables-save | grep 10.107.119.49
[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S
[root@master ~]# iptables-save | grep KUBE-SEP-ZHDQ73ZKUBMELLJB
[root@master ~]# kubectl get pod -o wide
Service实现的负载均衡:默认使用的是iptables规则。IPVS
[root@master ~]# kubectl delete -f xgp.yaml
[root@master ~]# kubectl delete -f xgp-svc.yaml
[root@master ~]# vim xgp1.yaml (三个文件名不相同)
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1 (三台版本不同)
ports:
- containerPort: 80
此处3个yaml文件 指定不同版本的镜像
[root@master ~]# kubectl apply -f xgp-1.yaml --record
[root@master ~]# kubectl apply -f xgp-2.yaml --record
[root@master ~]# kubectl apply -f xgp-3.yaml --record
[root@master ~]# kubectl rollout history deployment xgp-web
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get svc
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1
//这里指定的是版本信息的编号
[root@master ~]# curl 127.0.0.1:30123
[root@master ~]# kubectl rollout history deployment xgp-web
编号1已经被编号2替代,从而生的是一个新的编号4
默认情况下,scheduler会将pod调度到所有可用的Node,不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
kubernetes通过label来实现这个功能
label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-node1 是配置了 SSD 的节点
[root@master ~]# kubectl label nodes node02 disk=ssd
[root@master ~]# kubectl get nodes --show-labels | grep node02
[root@master ~]# kubectl delete -f xgp-1.yaml
deployment.extensions "xgp-web" deleted
[root@master ~]# kubectl delete svc xgp-svc
[root@master ~]# vim xgp-1.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
revisionHistoryLimit: 10
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1
ports:
- containerPort: 80
nodeSelector: #添加节点选择器
disk: ssd #和标签内容一致
[root@master ~]# kubectl apply -f xgp-1.yaml
[root@master ~]# kubectl get pod -o wide
现在pod都在node02上运行
[root@master ~]# kubectl label nodes node02 disk-
[root@master ~]# kubectl get nodes --show-labels | grep node02
没有disk标签了
[root@master ~]# kubectl label nodes node01 disk=ssd
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v1
ports:
- containerPort: 80
nodeSelector:
disk: ssd
[root@master ~]# vim xgp-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: xgp-svc
spec:
type: NodePort
selector:
app: xgp-server
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30123
[root@master ~]# kubectl apply -f xgp.yaml --recore
[root@master ~]# kubectl apply -f xgp-svc.yaml
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v2 #修改版本为二
ports:
- containerPort: 80
nodeSelector:
disk: ssd
[root@master ~]# kubectl apply -f xgp.yaml --record
[root@master ~]# kubectl rollout history deployment xgp-web > pod.txt
[root@master ~]# vim xgp.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: xgp-web
spec:
replicas: 3
template:
metadata:
labels:
app: xgp-server
spec:
containers:
- name: web
image: 192.168.1.21:5000/web:v3 #修改版本为二
ports:
- containerPort: 80
nodeSelector:
disk: ssd
[root@master ~]# kubectl apply -f xgp.yaml --record
Service实现的负载均衡:默认使用的是iptables规则。IPVS
[root@master ~]# iptables-save | grep 10.107.27.229
//根据service的暴露IP,查看对应的iptabes规则
[root@master ~]# iptables-save | grep KUBE-SVC-ESI7C72YHAUGMG5S
这里显示了各节点的负载比例
[root@master ~]# iptables-save | grep KUBE-SEP-VDKW5WQIWOLZMJ6G
[root@master ~]# kubectl get pod -o wide
[root@master ~]# kubectl rollout undo deployment xgp-web --to-revision=1
//这里指定的是版本信息的编号
[root@master ~]# curl 127.0.0.1:30123
排错思路
[root@master ~]# less /var/log/messages | grep kubelet [root@master ~]# kubectl logs -n kube-system kube-scheduler-master [root@master ~]# kubectl describe pod xgp-web-7d478f5bb7-bd4bj
看了以上关于Deployment的概述及其使用场景,如果大家还有什么地方需要了解的可以在亿速云行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,亿速云技术工程师在行业内拥有十几年的经验了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。