

kubernetes之Deployment - 梨花海棠
source link: https://www.cnblogs.com/xunweidezui/p/16522331.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1.什么是Deployment?
Deployment(简写为deploy)是kubernetes控制器的又一种实现,构建于ReplicasSet控制器之上,可以为Pod和ReplicaSet提供声明式更新。相比较而言,Pod和ReplicaSet很少用来直接使用,而是借助于控制器来使用。Deployment Controller核心功能也是保证Pod资源的正常使用,大部分功能调用ReplicaSet来实现。
1.2我们只需要描述Deployment中目标Pod期望状态,而Deployment控制器以控制更改为实际状态,使其变成期望状态。我们不需要直接使用Pod和ReplicaSet来实现,Deployment控制器在ReplicaSet的基础上增加了部分特性:
1.事件和状态查看: 可以通过特定的命令查看Deployment对象的更新进度和状态;
2.版本记录: 将Deployment对象的历史更新操作都进行保存,以便于后续执行回滚操作使用;
3.多种更新方案: Recreate重建,可以实现单批次更新所有的Pod。RollingUpdate可以实现多批次替换Pod至新版本。
2.Deployment的构成部分
Deployment是标准的k8s资源,Deployment构建于ReplicaSet之上,spec字段嵌套了包含了replicaset控制器支持的selector、replicas、template、minReadySeconds
2.1Selector: 标签选择器,匹配并关联Pod,并对其受控制的Pod进行管理;
2.2Replicas: 期望的Pod的副本数,期望在集群所运行的Pod对象的数量;
2.3template: Pod的模板;实际上定义了Pod的内容,相当于把一个Pod的描述信息以模板的方式嵌套在ReplicaSet;
3.Deployment的资源规范
apiVersion: apps/v1 # API群组及版本;
kind: Deployment # 资源类型;
metadata: # Pod元数据;
name: # 资源名称,在作用域中要唯一;
namespace: <string> # 名称空间,Deployment隶属名称空间级别;
spec:
minReadySeconds: <integer> # Pod就绪后多少秒内任一容器无Crash方可为就绪;
replicas: <integer> # 期望的Pod副本数,默认为1;
selector: <Object> # 标签选择器,必须匹配template字段中Pod模板中的标签;
template: <Object> # Pod模板对象;
revisionHistoryLimit: <integer> # 滚动更新历史记录数量,默认为10;
strategy: <Object> # 滚动更新策略;
type: <string> # 滚动更新类型,可用值有Recreate和Rollingupdate;
rollingUpdaate: <Object> # 滚动更新参数,专用于RollingUpdate类型;
maxSurge: <string> # 更新起见可比期望的Pod数量多出的数量和比例;
maxUnavailable: <string> # 更新期间可比期望的Pod数量缺少的数量或比例;
progressDeadlineSeconds: <integer> # 滚动更新故障超时时长,默认为600;
paused: <boolean> # 是否暂停部署过程;
4.Deployment的配置示例:
# 以Nginx应用为示例配置
root@kubernetes-master01:~# cat nginx-deployment-test.yaml
apiVersion: apps/v1 # 资源群组
kind: Deployment # 资源类型
metadata: # 元数据
name: deployment-nginx-test # Pod名称
namespace: default # Pod所在的名称空间
spec:
replicas: 2 # Pod的副本数
selector: # 标签选择器
matchLabels:
app: nginx-deployment # Pod的标签
template: # 定义Pod的模板
metadata: #
labels: # 标签同上要一致
app: nginx-deployment
spec: # 定义容器的
containers:
- name: nginx # 容器名称
image: nginx # 容器镜像
imagePullPolicy: IfNotPresent # 容器拉取策略
ports: # 定义容器的端口
- name: http
containerPort: 80 # 容器端口为80
#
root@kubernetes-master01:~# kubectl apply -f nginx-deployment-test.yaml
deployment.apps/deployment-nginx-test created
4.1查看Pod,Deployment的名称-Replicaset的名称-随机字符串hash值是由Deployment Controller自动生成。Pod对应的名称遵循ReplicaSet控制器的命名格式,它以Replicaset控制器的名称为签注,后跟5位随机字符。
root@kubernetes-master01:~/cloud-Native/deployment/replicas# kubectl get pods
NAME READY STATUS RESTARTS AGE
deployment-nginx-test-dd5bdc67f-b5dlz 1/1 Running 0 6m12s
deployment-nginx-test-dd5bdc67f-t94j7 1/1 Running 0 6m12s
# NAME: 列出了集群中Deployment的名称。
# READY: 显示应用程序的可用的"副本数"显示的模式是"就绪个数/期望个数"
# UP-TO-DATE: 标识已经达到期望状态的Pod的副本数量。
# AVAILABLE: 表示当前处于可用状态的Pod的数量。
4.2查看replicaset,Deployment控制器会自动创建相关的ReplicaSet控制器资源,并以[DEPLOYMENT-NAME]-[POD-TEMPLATE-HASH-VALUE]格式为其命名,其中的hash值由Deployment控制器自动生成,由Deployment创建的ReplicaSet对象会自动使用相同的标签选择器。
root@kubernetes-master01:~# kubectl get replicaset deployment-nginx-test-dd5bdc67f
NAME DESIRED CURRENT READY AGE
deployment-nginx-test-dd5bdc67f 2 2 2 9m34s
5.为Pod创建Service资源以实现负载均衡。
root@kubernetes-master01:~# cat nginx-service-test.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-deployment-test
namespace: default
spec:
type: ClusterIP # 类型为ClusterIP
selector: # 标签选择器跟Pod的标签相匹配,才能被识别为后端端点。
app: nginx-deployment
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
#
root@kubernetes-master01:~# kubectl apply -f nginx-service-test.yaml
service/nginx-deployment-test created
6.进行访问测试
6.1我提前修改了Nginx的index文件。方便效果。
root@kubernetes-master01:~# echo "nginx-1-haitang.net" > /usr/share/nginx/html/index.html
root@kubernetes-master01:~# echo "nginx2-haitang.com" > /usr/share/nginx/html/index.html
6.2访问Service的IP,因为是ClusterIP,只能在集群内访问。也是没有问题的。
root@kubernetes-master01:~# curl 10.107.246.117
nginx2-haitang.com
root@kubernetes-master01:~# curl 10.107.246.117
nginx-1-haitang.net
root@kubernetes-master01:~# curl 10.107.246.117
nginx2-haitang.com
root@kubernetes-master01:~# curl 10.107.246.117
nginx-1-haitang.net
7.Pod的伸缩
7.1比如现在两个副本有点无法应对突发的流量,可以通过命令的方式修改replicas也可以通过修改配置文件的方式去修改。
1.1# 命令方式来伸缩
root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=3
deployment.apps/deployment-nginx-test scaled
1.2# 缩容的话就是=多少副本数即可。 例如=2
root@kubernetes-master01:~# kubectl scale deployment deployment-nginx-test --replicas=2
1.3# 修改配置文件vim nginx-deployment-test.yaml 修改spec字段的replicas即可。
7.2伸缩完成后,Service就会发现带有同样标签的Pod,Pod就绪后加入到后端的可用端点。
再次访问测试。也是没有问题。
root@kubernetes-master01:~# curl 10.107.246.117
nginx2-haitang.com
root@kubernetes-master01:~# curl 10.107.246.117
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
root@kubernetes-master01:~# curl 10.107.246.117
nginx-1-haitang.net
7.3也可以通过describe命令来查看Events事件。
root@kubernetes-master01:~# kubectl describe deploy deployment-nginx-test
Pod Template:
Labels: app=nginx-deployment
Containers:
nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Progressing True NewReplicaSetAvailable
Available True MinimumReplicasAvailable
OldReplicaSets: <none>
NewReplicaSet: deployment-nginx-test-dd5bdc67f (3/3 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 36s deployment-controller Scaled up replica set deployment-nginx-test-dd5bdc67f to 3
8.故障测试。
8.1现在删除Pod会发生什么?
root@kubernetes-master01:~# kubectl delete pods deployment-nginx-test-dd5bdc67f-2vggw
pod "deployment-nginx-test-dd5bdc67f-2vggw" deleted
# 有控制器管理的Pod删除会自动重建,没有控制器管理的Pod删除就是删除了不可能会自动重建。我们创建的Pod受控于Deployment Controller。所以能重建。
root@kubernetes-master01:~# kubectl get pods
deployment-nginx-test-dd5bdc67f-2vggw 1/1 Running 0 4s
deployment-nginx-test-dd5bdc67f-lc6nm 1/1 Running 0 4s
Recommend
-
11
kubernetes Deployment之滚动更新策略。 kubernetes...
-
12
1.什么是资源限制? 1.1在kubernetes集群中,为了使得系统能够稳定的运行,通常会对Pod的资源使用量进行限制。在kubernetes集群中,如果有一个程序出现异常,并且占用大量的系统资源,如果没有对该Pod进行资源限制的话,可能会影响其...
-
8
1.什么是DaemonSet? 1.1DaemonSet是Pod控制器的又一种实现方式,用于在集群中的全部节点上同时运行一份指定的Pod资源副本,后续加入集群的节点也会自动创建一个相关的Pod对象,当从集群移除节点时,此类...
-
8
1.什么是Service? 在kubernets中,Pod是应用程序的载体,Pod你可以想象成就是容器,为动态的一组Pod提供一个固定的访问入口,它是以一种叫ClusterIP地址来进行标识,而ClusterIP就位于我们集群网络(Cluster Network)当中,我们可以通...
-
5
kubernetes数据持久化StorageClass动态供给(二) - 梨花海棠 - 博客园
-
2
1.什么是Dashboard Dashboard 是基于网页的 Kubernetes 用户界面。 你可以使用 Dashboard 将容器应用部署到 Kubernetes 集群中,也可以对容器应用排错,还能管理集群资源。 你可以使用 Dashboard 获取运行在集群中的应用的概览信息,...
-
5
未安装ArgoCD参考GitOps实践之kubernetes部署Argocd 1. 查看Argocd Service 可以看到是C...
-
5
1. 什么是HTTPS? HTTPS(全称:Hypertext Transfer Protocol Secure),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS在HTTP的基础下加入SSL,HTTPS的安全基础是SSL,因此加密的详细内容...
-
13
1. 什么是Openssl? 在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连线者的身份。这个包广泛被应用在互联网的网页服务器上。 其主要库是以C语言所写成...
-
4
1. 什么是Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。Logstash 和 Beats 有助于收集、聚合和丰富您的数据并将其存储在 Elasticsearch 中。Kibana 使您能够以交互方式探索、可视化和分享对...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK