k8s-Deployment 使用
Deployment
先运行一个 Deployment
[root@master ~]# kubectl run nginx-1 --image=nginx --replicas=2
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-1 created
查看Deployment 状态:
[root@master ~]# kubectl get deployments.apps nginx-1
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-1 2/2 2 2 19s
还可以详细查看:
[root@master ~]# kubectl describe deployments.apps nginx-1
Name: nginx-1
Namespace: default
CreationTimestamp: Tue, 14 Jul 2020 16:52:13 +0800
Labels: run=nginx-1
Annotations: deployment.kubernetes.io/revision: 1
Selector: run=nginx-1
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-1
Containers:
nginx-1:
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-1-56756dd7cf (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 40s deployment-controller Scaled up replica set nginx-1-56756dd7cf to 2
Events 记录了两个副本 Pod 的创建。
详细查看副本资源:
[root@master ~]# kubectl get replicasets.apps nginx-1-56756dd7cf
NAME DESIRED CURRENT READY AGE
nginx-1-56756dd7cf 2 2 2 2m6s
[root@master ~]# kubectl describe replicasets.apps nginx-1-56756dd7cf
Name: nginx-1-56756dd7cf
Namespace: default
Selector: pod-template-hash=56756dd7cf,run=nginx-1
Labels: pod-template-hash=56756dd7cf
run=nginx-1
Annotations: deployment.kubernetes.io/desired-replicas: 2
deployment.kubernetes.io/max-replicas: 3
deployment.kubernetes.io/revision: 1
Controlled By: Deployment/nginx-1
Replicas: 2 current / 2 desired
Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: pod-template-hash=56756dd7cf
run=nginx-1
Containers:
nginx-1:
Image: nginx
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m48s replicaset-controller Created pod: nginx-1-56756dd7cf-wdvdt
Normal SuccessfulCreate 2m48s replicaset-controller Created pod: nginx-1-56756dd7cf-7plfz
查看Pod:
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-1-56756dd7cf-7plfz 1/1 Running 0 3m1s
nginx-1-56756dd7cf-wdvdt 1/1 Running 0 3m1s
查看 Pod 的详细信息:
[root@master ~]# kubectl describe pod nginx-1-56756dd7cf-7plfz
Name: nginx-1-56756dd7cf-7plfz
Namespace: default
Priority: 0
Node: node1/192.168.19.161
Start Time: Tue, 14 Jul 2020 16:52:13 +0800
Labels: pod-template-hash=56756dd7cf
run=nginx-1
Annotations: <none>
Status: Running
IP: 10.244.1.9
IPs:
IP: 10.244.1.9
Controlled By: ReplicaSet/nginx-1-56756dd7cf
Containers:
nginx-1:
Container ID: docker://b4c9452b04733f4645f42d4c4d68810417cb47b5c4ad996f8ae8247e50ef293a
Image: nginx
Image ID: docker-pullable://nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd
Port: <none>
Host Port: <none>
State: Running
Started: Tue, 14 Jul 2020 16:52:30 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-ctnk4 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-ctnk4:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-ctnk4
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 3m17s default-scheduler Successfully assigned default/nginx-1-56756dd7cf-7plfz to node1
Normal Pulling 3m16s kubelet, node1 Pulling image "nginx"
Normal Pulled 3m kubelet, node1 Successfully pulled image "nginx"
Normal Created 3m kubelet, node1 Created container nginx-1
Normal Started 3m kubelet, node1 Started container nginx-1
过程: 用户通过 kubectl 创建 Deployment,Deployment 创建 ReplicaSet,ReplicaSet 创建 Pod。
对象的命名方式是:子对象的名字 = 父对象名字 + 随机字符串(数字)
k8s 创建资源的两种方式
1.使用 kubectl 直接创建
2.通过配置文件(.yml)和 kubectl apply 创建
可以直接生成一个yml文件:
[root@master ~]# kubectl create deployment nginx --image=nginx --dry-run -o yaml > nginx.yml
[root@master ~]# cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
基于命令的方式:
- 简单直观快捷,上手快
- 适合临时测试或实验
基于配置文件的方式:
- 描述了 What,即应用最终要达到的状态
- 提供了创建资源的模班,能够重复部署
- 可以向管理代码一样管理部署
- 适合正式的,跨环境的,规模化部署
- 要求熟悉配置文件的语法,有一定难度
Deployment YAML
编写一个 yml 文件:
[root@master nginx]# cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas: 2
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deployment
spec:
containers:
- image: nginx
name: nginx
- apiVersion 配置文件格式的版本
- Kind 创键资源的类型
- Metadata 资源的元数据
- Labels 资源的标签
- Name 资源的名字
- Spec这个 资源的规格
- Replicas 副本的个数
- Template pod的模板
- metadata pod的元数据
- labels pod的标签
- spec pod的规格
- -image pod使用那个镜像
- Name pod的名字
开始部署:
[root@master nginx]# kubectl apply -f nginx.yml
deployment.apps/nginx-deployment created
查看其资源:
[root@master nginx]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 41s
[root@master nginx]# kubectl get replicasets.apps
NAME DESIRED CURRENT READY AGE
nginx-deployment-ddd976fc7 2 2 2 78s
[root@master nginx]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-ddd976fc7-frz4p 1/1 Running 0 53s 10.244.1.10 node1 <none> <none>
nginx-deployment-ddd976fc7-hrp2s 1/1 Running 0 53s 10.244.2.11 node2 <none> <none>
删除资源:
[root@master nginx]# kubectl delete -f nginx.yml
deployment.apps "nginx-deployment" deleted
或者
kubectl delete deployment nginx-deployment
Scale Up/Down
伸缩只需修改 yml 文件对应的 副本数即可
将副本数改为 3 个:
[root@master nginx]# cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deployment
spec:
containers:
- image: nginx
name: nginx
部署:
[root@master nginx]# kubectl apply -f nginx.yml
查看副本:
[root@master nginx]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-ddd976fc7-kc6vr 1/1 Running 0 2m5s 10.244.2.12 node2 <none> <none>
nginx-deployment-ddd976fc7-nk9zl 1/1 Running 0 2m5s 10.244.1.11 node1 <none> <none>
nginx-deployment-ddd976fc7-zb7g8 1/1 Running 0 23s 10.244.0.11 master <none> <none>
K8s 的节点如果 down 了,会将其上面的 Pod 标记为 Unknown,并在其他节点上创建 Pod,维持总副本数,即使那个节点恢复了,Unknown 的 Pod 会被删除,不过运行 Pod 也不会调回那个节点了
出于安全考虑,默认配置下 k8s 不会将 Pod 调度到 master 节点,
如果想使用 master 节点,执行下面命令:
[root@master ~]# kubectl taint node master node-role.kubernetes.io/master-
node/master untainted
恢复 master only 的状态:
[root@master ~]# kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
node/master tainted
用 label 控制 Pod 的位置:
label 可以将 Pod 部署到你想部署的节点上面
[root@master nginx]# kubectl label nodes node1 disktype=ssd
node/node1 labeled
[root@master nginx]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
master Ready master 5d 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> 5d v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
node2 Ready <none> 5d 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
disktype=ssd 已经添加到 node1 上面了
编辑 yml 文件,指定:
[root@master nginx]# cat nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-deployment
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx-deployment
template:
metadata:
creationTimestamp: null
labels:
app: nginx-deployment
spec:
containers:
- image: nginx
name: nginx
nodeSelector:
disktype: ssd
在 Pod 的模班 spec 里通过 nodeSelector 指定将此 Pod 部署到具有 label disktype=ssd 的 Node 上。
部署查看:
[root@master nginx]# kubectl apply -f nginx.yml
deployment.apps/nginx-deployment configured
[root@master nginx]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-65458ffb99-555d2 1/1 Running 0 40s 10.244.1.13 node1 <none> <none>
nginx-deployment-65458ffb99-d68hk 1/1 Running 0 52s 10.244.1.12 node1 <none> <none>
nginx-deployment-65458ffb99-t5vjl 1/1 Running 0 23s 10.244.1.14 node1 <none> <none>
删除 label:
[root@master nginx]# kubectl label nodes node1 disktype-
node/node1 labeled