kubernetes-deployment运用部署
deployment
Deployment是新一代用于Pod管理的对象,与Replication Controller相比,它提供了更加完善的功能,使用起来更加简单方便。
kubernetes开发了deployment,replicaset、daemonset、statefuleset、job等多种controller。
查看状态
[root@master ~]# kubectl describe deployments.apps nginx-deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 14 Jul 2020 14:56:39 +0800 Labels: run=nginx-deployment Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx-deployment Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=nginx-deployment Containers: nginx-deployment: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deployment-6c94df7599 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m15s deployment-controller Scaled up replica set nginx-deployment-6c94df7599 to 2
查看详细信息
[root@master ~]# kubectl describe replicasets.apps nginx-deployment-6c94df7599 Name: nginx-deployment-6c94df7599 Namespace: default Selector: pod-template-hash=6c94df7599,run=nginx-deployment Labels: pod-template-hash=6c94df7599 run=nginx-deployment Annotations: deployment.kubernetes.io/desired-replicas: 2 deployment.kubernetes.io/max-replicas: 3 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/nginx-deployment Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: pod-template-hash=6c94df7599 run=nginx-deployment Containers: nginx-deployment: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 5m1s replicaset-controller Created pod: nginx-deployment-6c94df7599-bm8pd Normal SuccessfulCreate 5m1s replicaset-controller Created pod: nginx-deployment-6c94df7599-pwpph
查看更加详细的信息
[root@master ~]# kubectl describe pod nginx-deployment-6c94df7599-bm8pd Name: nginx-deployment-6c94df7599-bm8pd Namespace: default Priority: 0 Node: node2/192.168.172.136 Start Time: Tue, 14 Jul 2020 14:57:00 +0800 Labels: pod-template-hash=6c94df7599 run=nginx-deployment Annotations: <none> Status: Running IP: 10.244.2.7 IPs: IP: 10.244.2.7 Controlled By: ReplicaSet/nginx-deployment-6c94df7599 Containers: nginx-deployment: Container ID: docker://eb72829dc2fcf1631469f33248c9fc861e0c9093c4142cb2c8e340b3612d7887 Image: nginx Image ID: docker-pullable://nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd Port: <none> Host Port: <none> State: Running Started: Tue, 14 Jul 2020 14:57:17 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-ptz8b (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-ptz8b: Type: Secret (a volume populated by a Secret) SecretName: default-token-ptz8b Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m20s default-scheduler Successfully assigned default/nginx-deployment-6c94df7599-bm8pd to node2 Normal Pulling 7m19s kubelet, node2 Pulling image "nginx" Normal Pulled 7m2s kubelet, node2 Successfully pulled image "nginx" Normal Created 7m2s kubelet, node2 Created container nginx-deployment Normal Started 7m2s kubelet, node2 Started container nginx-deployment
events记录了pod的启动过程,如果操作失败,也能在这里查看到原因;
过程:
1.用户通过kubectl创建deployment。
2.deployment创建replicaset。
3.replicaset创建pod。
k8s创建资源的两种方式:
1.直接用命令创建。
2.通过配置文件和kubectl apply创建,要完成前面同样的工作,可以执行命令。
两种方式的区别
基于命令的方式:
1.简单直观快捷,上手快。
2.适合临时测试和实验
基于配置文件方式:
1.配置文件描述了what,即应用最终要达到的状态。
2.配置文件提供了创建资源的模板,能够重复部署。
3.可以像管理代码一样管理部署。
4.适合正式的、跨环境的、规模化部署。
5.这种方式要求熟悉配置文件的语法、有一定难度。
以下为两种方式:
1.命令
[root@master ~]# kubectl create deployment test --image=nginx --dry-run -o yaml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: test name: test spec: replicas: 1 selector: matchLabels: app: test strategy: {} template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx resources: {} status: {}
kubectl create deployment test --image=nginx --dry-run -o yaml > nginx1.yml ##配置文件内容较多 语句也比较多 也可以用这个方式获得模板
创键一个deployment 名字叫dis 镜像是nginx 现在不执行 保存的格式为yaml
保存到nginx.yml这个文件里
2.配置文件:
[root@master ~]# cat nginx1.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: test name: test spec: replicas: 2 ##收缩副本的话,调整这里就可以了,然后重新执行kubectl apply -f nginx1.yml selector: matchLabels: app: test template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx
[root@master ~]# kubectl apply -f nginx1.yml
deployment.apps/test created
查看
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-jz2mw 1/1 Running 1 45h 10.244.1.7 node1 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 45h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 60m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-pwpph 1/1 Running 0 60m 10.244.1.9 node1 <none> <none> test-57d9864f4f-k62hd 1/1 Running 0 5m8s 10.244.1.10 node1 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 5m8s 10.244.2.8 node2 <none> <none>
出于安全考虑,默认配置下kubernetes不会pod调度到master节点,如果希望master也当做node节点使用、
执行
kubectl taint node master node-role.kubernetes.io/master-
恢复master不充作节点,执行如下命令:
kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
K8s的故障转移:
关掉node1
查看 [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-jz2mw 1/1 Terminating 1 46h 10.244.1.7 node1 <none> <none> caoyi-c6c994756-q4r44 1/1 Running 0 12m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 89m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-pwpph 1/1 Terminating 0 89m 10.244.1.9 node1 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 12m 10.244.2.9 node2 <none> <none> test-57d9864f4f-c8nxl 1/1 Running 0 12m 10.244.2.11 node2 <none> <none> test-57d9864f4f-k62hd 1/1 Terminating 0 34m 10.244.1.10 node1 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 34m 10.244.2.8 node2 <none> <none>
再开启node1
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 18m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 95m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 18m 10.244.2.9 node2 <none> <none> test-57d9864f4f-c8nxl 1/1 Running 0 18m 10.244.2.11 node2 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 40m 10.244.2.8 node2 <none> <none>
可以看到node1的节点的pod已经停止了
当node1再次上线后停掉的pod会被删除,不会再次回到node1上了
用标签控制pod所在的节点:
添加标签:
[root@master ~]# kubectl label nodes node1 test=caoyi
node/node1 labeled
查看:
[root@master ~]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS master Ready master 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master= node1 Ready <none> 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,test=caoyi node2 Ready <none> 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
将标签添加到nginx1.yml文件里控制pod所在节点:
[root@master ~]# cat nginx1.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: test name: test spec: replicas: 2 selector: matchLabels: app: test template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx nodeSelector: test: caoyi
[root@master ~]# kubectl apply -f nginx1.yml
deployment.apps/test configured
查看pod所在节点 是否所有pod在node1上:
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 26m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 104m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 26m 10.244.2.9 node2 <none> <none> test-6f9575d5ff-c2bp7 1/1 Running 0 21s 10.244.1.12 node1 <none> <none> test-6f9575d5ff-gplfk 1/1 Running 0 41s 10.244.1.11 node1 <none> <none>
把nginx1.yml里指定标签的语句去掉pod就会在node1和node2上了
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 34m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 112m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 34m 10.244.2.9 node2 <none> <none> test-57d9864f4f-776c5 1/1 Running 0 17s 10.244.2.13 node2 <none> <none> test-57d9864f4f-gf97m 1/1 Running 0 5m35s 10.244.0.5 master <none> <none> test-57d9864f4f-l2jzm 1/1 Running 0 5m52s 10.244.1.13 node1 <none> <none>