k8s常用命令
常用命令:
查看集群信息
[root@k8s-master ~]# kubectl cluster-info
Kubernetes control plane is running at https://172.20.10.88:6443
CoreDNS is running at https://172.20.10.88:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
查看集群配置
kubectl get cm -A
kubectl get cm -n kube-system
kubectl get cm -n kube-system kubeadm-config -o yaml
kubectl edit cm -n kube-system kubeadm-config -o yaml
# 导出配置
kubectl -n kube-system get cm kubeadm-config -o yaml > kubeadm-config.yaml
查看pod
# 查看集群所有的pod信息
kubectl get pods -A
kubectl get pods --all-namespaces
watch kubectl get pods -n kube-system
# 查看pods所在的运行节点
kubectl get pods -A -o wide
kubectl get pods --all-namespaces -o wide
# 查看pods定义的详细信息
kubectl get pods -n kube-system coredns-7bb8bb4dd7-hfj9j -o yaml
按selector名来查找pod
kubectl get pod --selector name=redis
# 在自定义列中列出资源信息
kubectl get pod -n kube-system coredns-7bb8bb4dd7-hfj9j -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
查看pod运行镜像
kubectl describe deployment coredns --namespace kube-system | grep Image | cut -d "/" -f 2
进入pod里的容器
kubectl exec -it podName -c containerName -n namespace -- shell comand
创建目录
kubectl exec -it spark-master-xksl -c spark-master -n spark -- mkdir -p /usr/local/spark
注意:
shell命令前,要加-- 号,不然shell命令中的参数,不能识别
kubectl exec -it etcd-k8s-master -n kube-system /bin/sh
查看Node
kubectl get nodes -o wide
查看namespaces
kubectl get namespace
创建namespaces
kubectl create ns development
# 或者yaml文件创建
apiVersion: v1
kind: Namespace
metadata:
name: development
创建Deployment
# 方式1:
# kubectl run NAME --image=image [--env="key=value"] [--port=port] [--dry-run=server|client] [--overrides=inline-json]
[--command] -- [COMMAND] [args...] [options]
kubectl run nginx --image=nginx --port=80 --replicas=2 #用命令直接创建
# 方式2:
# 生成deployment的yaml文件并apply
kubectl run nginx --image=nginx --port=80 --dry-run -o yaml > nginx-deploy.yaml
kubectl apply -f nginx-deploy.yaml
查看Deployment
# 创建deploy控制器时会自动创建rs控制器,二者具有相同的标签选择器
kubectl get deploy -A
kubectl get deployments.apps -A
kubectl get deployment -A -o wide
kubectl get deployments.apps -n kube-system coredns -o yaml
kubectl get deployments.apps -n kube-system coredns -o yaml > coredns.yaml
kubectl edit deployments.apps -n kube-system coredns -o yaml
查看DaemonSet
kubectl get ds -A
kubectl get daemonsets.apps --namespace=kube-system
kubectl edit daemonsets.apps kube-proxy --namespace=kube-system
查看service服务
kubectl get service -o wide
kubectl get svc -A
查看replicasets
kubectl get rs -A
kubectl get replicasets.apps -A
查看job
kubectl get job -A
查看cornjob
kubectl get cornjob -A
kubectl get jobs -A
暴露服务
kubectl expose deployment nginx --port=80 --type=LoadBalancer
查看详情
kubectl describe node k8s-master
kubectl describe pod -n kube-system etcd-k8s-master
kubectl describe deployments.apps -n kube-system coredns
kubectl describe service -n kube-system kube-dns
查看日志
kubectl logs -f -n kube-system etcd-k8s-master
kubectl logs -f -n kube-system etcd-k8s-master --tail=1000
# Pod 有多个容器,logs 命令中使用 -c <容器名称>,以查找指定容器的日志。
[root@k8s-master ~]# kubectl logs -f -n kube-system metrics-server-v0.3.6-847cd784bf-cpgf6
error: a container name must be specified for pod metrics-server-v0.3.6-847cd784bf-cpgf6, choose one of: [metrics-server metrics-server-nanny]
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl logs -f -n kube-system metrics-server-v0.3.6-847cd784bf-cpgf6 -c metrics-server-nanny
删除容器和服务
kubectl delete deployment
kubectl delete service
配置方式运行&&删除
kubectl create -f
kubectl delete -f
修改pod副本数的方式
# 方式1:
# 编辑coredns的deployment
kubectl edit deployments.apps -n kube-system coredns
# 方式2:
#### 动态扩展和伸缩
kubectl scale deployment -n kube-system coredns --replicas=2
#### 弹性扩容根据CPU的占用率(需要结合资源限制一同使用)
kubectl autoscale deployment -n kube-system coredns --min=2 --max=10 --cpu-percent=80
horizontalpodautoscaler.autoscaling/coredns autoscaled
# 方式3:
修改yaml文件-->kubectl apply -f xxx.yaml
升级pod镜像的方法
#升级并记录,可实现回滚,推荐使用该方法
kubectl set image deploy/nginx nginx=nginx:1.9 --record
修改yaml文件-->kubectl apply -f xxx.yaml
kubectl edit deployments.apps -n kube-system coredns
# 滚动升级是deployment pod升级时的默认策略,也可以修改默认值
用命令kubectl edit deploy nginx可以查看默认值
``
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: coredns
minReadySeconds: 5 #默认看不到,需要手工添加
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
``
默认情况下,当6个pod副本需要升级时:Kubernetes 将终止1个实例(6x25%=1.5个实例,向下舍去=1),创建3个新实例(6x25%=1.5个实例,向上舍入=2,加1个实例来弥补1个终止实例=3个实例),此时总共运行8个副本。
一旦新的pod就绪,它将从旧的副本集中终止另外2个实例,以便将部署恢复到所需的副本数,然后重复这个过程,直到部署完成为止。
- minReadySeconds:Kubernetes在等待设置的时间后才进行升级
- maxSurge:升级过程中最多可以比原先设置多出的POD数量
- maxUnavaible:升级过程中最多有多少个POD处于无法提供服务的状态
# 查看滚动升级历史记录:
kubectl rollout history deployment -n kube-system coredns
滚动升级相关命令
kubectl set image deploy/nginx nginx=nginx:1.7.9 --record
kubectl set image deploy/nginx nginx=nginx --record
kubectl rollout status deploy nginx #查看升级状态
kubectl rollout pause deployment nginx #升级暂停
kubectl rollout resume deployment nginx #恢复升级
kubectl describe deploy nginx #查看升级详情
kubectl rollout history deploy/nginx #查看升级历史
kubectl rollout history deployment httpd
kubectl set image deploy/nginx nginx=nginx:1.7.9 --record=true
kubectl set image deploy/nginx nginx=nginx --record=true
kubectl rollout history deployment nginx --revision=5
kubectl rollout undo deployment/nginx --to-revision=4 #回滚到指定版本
kubectl rollout undo deployment nginx-deploy #回滚到前一个版本
显式指定滚动升级参数
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
run: nginx
minReadySeconds: 5
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
labels:
run: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
DaemonSet用于在每个Kubernetes节点中将守护进程的副本作为后台进程运行,说白了就是在每个节点部署一个Pod副本,当节点加入到Kubernetes集群中,Pod会被自动调度到该节点上运行。
每个节点有一个ds pod,新加入的节点也会自动生成一个ds pod
ds pod不受调度策略控制
使用DaemonSe场景:
1、集群存储守护程序,如glusterd、ceph要部署在每个节点上以提供持久性存储;
2、节点监视守护进程,如Prometheus监控集群,可以在每个节点上运行一个node-exporter进程来收集监控节点的信息;
3、日志收集守护程序,如fluentd或logstash,在每个节点上运行以收集容器的日志
示例:
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
name: nginx-ds
labels:
k8s-app: nginx
spec:
template:
metadata:
labels:
k8s-app: nginx
spec:
containers:
- image: nginx:1.7.9
name: nginx
ports:
- name: http
containerPort: 80
无状态服务(Stateless Service):所有pod只需要共享一个持久存储,并不需要每个pod一个持久存储,并且多个实例对于同一个请求响应的结果是完全一致的
有状态服务(Stateful Service):每个pod都需要一个独立的持久存储,对于这种类型的资源,我们一般是通过创建一个Headless Service类型的服务来暴露服务,将clusterIP设置为None就是一个无头的服务。
1、有状态服务一般使用pvc模板和存储类为每个pod自动生成一对pv和pvc来实现持久化存储。
2、也可以手动创建pv,然后和利用StatefulSet中的volumeClaimTemplates自动生成的pvc进行配对。
手动创建pv用于StatefulSet
1、创建两个pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001 #第二个是pv002
labels:
release: stable
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
hostPath:
path: /tmp/data
2、先创建无头服务
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
role: stateful
3、创建StatefulSet pod使用pv
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx" #使用上面创建的无头服务
replicas: 2
template:
metadata:
labels:
app: nginx
role: stateful
spec:
containers:
- name: nginx
image: cnych/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
volumeClaimTemplates会根据其对应的pv自动生成pvc并自动配对,数量由replicas: 2决定。
使用pvc模板和存储类自动生成pv和pvc
1、创建存储类
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
provisioner: fuseim.pri/ifs
2、先创建无头服务
apiVersion: v1
kind: Service
metadata:
name: nfs-web
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
role: stateful
3、使用存储类创建StatefulSet pod
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: nfs-web
spec:
serviceName: "nfs-web" #使用上面创建的无头服务
replicas: 2
template:
metadata:
labels:
app: nfs-web
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
annotations:
volume.beta.kubernetes.io/storage-class: course-nfs-storage
spec:
accessModes: [ "ReadWriteOnce" ]
#storageClassName: course-nfs-storage 使用存储类
resources:
requests:
storage: 1Gi
会自动生成两对pv和pvc
通过模版生成yaml文件
1、kubectl create deployment web --image=nginx -o yaml --dry-run>test.yaml
以nginx为镜像生成一个名为web的yaml文件,导出到test.yaml (--dry-run不会真正的创建镜像,只是尝试运行)
2、 kubectl get deploy nginx -o=yaml --export > nginx.yaml
查看一个目前已经部署的镜像:kubectl get deploy,再导出nginx的配置,生成一个nginx.yaml文件
新版2.0摒弃了一些过时api改为如下:
kubectl get deploy nginx -o=yaml > nginx.yaml
# 第一种使用kubectl create命令生成初始化yaml文件默认--namespace:default
kubectl create deployment coredns --image=registry.aliyuncs.com/google_containers/coredns:v1.8.6 -o yaml --dry-run > 1deploy-coredns.yaml
# 在 v1.18 中,was的等效标志已dry-run=server被--server-dry-run弃用。
kubectl create deployment coredns --image=registry.aliyuncs.com/google_containers/coredns:v1.8.6 -o yaml --dry-run=client > deploy-coredns.yaml
# 修改coredns的namespace:
vim deploy-coredns.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: coredns
name: coredns
namespace: kube-system
# 第二种方式 当资源已经部署了,从部署资源中,拿出来已经生成好的yaml文件对它做修改。使用kubectl get 命令导出yaml文件。
[root@k8s-master ~]# kubectl get deploy -A
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system calico-kube-controllers 1/1 1 1 20h
kube-system coredns 1/1 1 1 5m16s
kubectl get deployment -n kube-system coredns -o=yaml > mycoredns.yaml
kubectl get deployment -n kube-system coredns -o yaml > deploy-coredns.yaml
kubectl get pod -n kube-system coredns-6d8c4cb4d-cqb7w -o yaml > coredns.yaml
deployment是pod版本管理的工具 用来区分不同版本的pod,Deployment会保障你的容器的运行状态,如果副本数是2,删除一个Pod,Deployment会立即重启一个新的
rollout回滚
创建deployment
kubectl create deploy nginx-test --image=nginx:1.14
scale 副本数量
kubectl scale deployment nginx-test --replicas 10
如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展:
kubectl autoscale deployment nginx-test --min=10 --max=15 --cpu-percent=80
需要注意的是,horizontal pod autoscaling(HPA)作用于Replication Controller 对象时,再对其使用rolling update会变成无效操作,因为RC在滚动更新时,是通过创建新的RC对象来替代旧的对象,但是HPA无法自动绑定到新创建的RC对象上
更新 deployment
更新镜像
kubectl set image deployment/nginx-test nginx=nginx:1.15
回滚到上一个版本:
kubectl rollout undo deployment/nginx-test
也可以使用 --revision参数指定某个历史版本:
kubectl rollout undo deployment/nginx-test --to-revision=2
历史记录:
kubectl rollout history deployment/nginx-test
创建 Deployment 的时候使用了--record参数可以记录命令,我们可以很方便的查看每次 revision 的变化。查看单个revision 的详细信息:
kubectl rollout history deployment nginx-test --revision=1
验证发布:
kubectl rollout status deploy/nginx-test
回滚发布
kubectl rollout undo deployments/nginx-test
回滚到指定版本:还可以通过资源文件进行配置保留的历史版次量
kubectl rollout undo deployment/nginx-test --to-revision=<版次>
原理:
k8s分批次有序地进行着滚动更新,直到把所有旧的副本全部更新到新版本。实际上,k8s是通过两个参数来精确地控制着每次滚动的pod数量:
- maxSurge 滚动更新过程中运行操作期望副本数的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。
- maxUnavailable 滚动更新过程中不可用的最大pod数,但不能为0;也可以为百分数(eg:10%)。默认为25%。
重要参数 maxSurge与maxUnavailable
- maxSurge: 1 表示滚动升级时会先启动1个pod
- maxUnavailable: 1 表示滚动升级时允许的最大Unavailable的pod个数
- 由于replicas为3,则整个升级,pod个数在2-4个之间
剖析部署概况:
- DESIRED 最终期望处于READY状态的副本数
- CURRENT 当前的副本总数
- UP-TO-DATE 当前完成更新的副本数
- AVAILABLE 当前可用的副本数
滚动过程是通过控制两个副本集来完成的
autoscale自动伸缩(扩容)
使用 autoscaler 自动设置在kubernetes集群中运行的pod数量(水平自动伸缩)。
指定Deployment、ReplicaSet或ReplicationController,并创建已经定义好资源的自动伸缩器。使用自动伸缩器可以根据需要自动增加或减少系统中部署的pod数量。
使用默认的自动伸缩策略,指定目标CPU使用率,使其Pod数量在2到10之间。
kubectl autoscale deployment/nginx-test --min=2 --max=10
使其Pod的数量介于1和5之间,CPU使用率维持在80%。
kubectl autoscale deploy/nginx-test --max=5 --cpu-percent=80
通过kubectl api-versions可以看到
[root@k8s-master]# kubectl api-versions
autoscaling/v1
autoscaling/v2
autoscaling/v2beta1
autoscaling/v2beta2
autoscaling/v1 #只支持通过cpu为参考依据,来改变pod副本数
autoscaling/v2beta1 #支持通过cpu、内存、连接数以及用户自定义的资源指标数据为参考依据。
autoscaling/v2beta2 #同上,小的变动
# 使用kubectl explain来快速了解用法
kubectl explain deployment.spec
kubectl explain deployment.spec.strategy
kubectl explain hpa ##默认查询到的是autoscaling/v1版本
kubectl explain hpa --api-version=autoscaling/v2beta1 ##如果使用其他版本,可以使用--api-version指明版本
我们可以简单的通过 kubectl autoscale 命令来创建一个 HPA 资源对象
Controller默认30s轮询一次(可通过 kube-controller-manager 的--horizontal-pod-autoscaler-sync-period 参数进行设置),
查询指定的资源中的 Pod 资源使用率,并且与创建时设定的值和指标做对比,从而实现自动伸缩的功能
kubectl autoscale deployment hpa-demo --cpu-percent=10 --min=2 --max=10
kubectl autoscale deployment nginx-deployment --cpu-percent=10 --min=5 --max=20
kubectl get hpa
kubectl describe hpa nginx-deployment
kubectl edit hpa nginx-deployment
kubectl delete hpa nginx-deployment
或者用yaml 文件
注意一下如果要想让 HPA 生效,对应的 Pod 资源必须添加 requests 资源声明
kubectl describe hpa hpa-demo