Kubernetes常用命令

创建一个nginx实例

1
kubectl create -f Nginx.yaml

删除掉curl这个Pod

1
2
kubectl delete deploy curl
kubectl delete -f https://git.io/kube-dashboard

删除所有的pods

1
kubectl delete pods --all

移除node节点:

1
kubectl delete node k8s-node1

删除rs

1
2
kubectl get deployments
kubectl delete deployments name

删除Terminating状态的pod

1
kubectl delete pods callme-2967103386-vghd9 --grace-period=0 --force

动态扩展,添加一个容器数量

1
kubectl scale rc --replicas=2 nginx-controller

修改pod的数量

1
2
3
kubectl scale rc redis-slave --replicas=3       
//rc是k8s比较老的概念,现在使用deployment代替
kubectl scale deployment redis-slave --replicas=3

从pod复制文件

1
kubectl cp -n kube-system monitoring-grafana-2682286280-79dt4:/etc/grafana/grafana.ini /work/admin/grafana.ini

复制文件到pod

1
kubectl cp  monitoring-grafana-1390170494-f3n9r:/etc/grafana/ -n kube-system

显示集群信息

1
kubectl cluster-info

查看集群中的nodes节点

1
kubectl get nodes

查看所有的pod,以及在哪个node上创建的

1
kubectl get pods --all-namespaces -o wide

查看有哪些replicationcontroller [简写rc]

1
kubectl get rc

查看有哪些services

1
kubectl get svc/services

查看service详细信息

1
kubectl describe service nginx-service-nodeport

查看已经部署,或正在升级的容器

1
kubectl get deployments

查看实例nginx-controller-lv8md的信息

1
kubectl describe pod nginx-controller-lv8md

查看 endpoints 列表

1
kubectl get endpoints

查看集群现在的状态信息

1
kubectl describe svc nginx-service

查看RC详细信息

1
kubectl describe rc mytest-1-0-0 --namespace=test

查看node上信息

1
kubectl describe node 172.16.50.54

查看pod下有哪些容器服务

1
2
kubectl describe pod nginx
kubectl describe rc --all-namespaces

查看dns服务信息

1
kubectl --namespace=kube-system describe svc/kube-dns

查看namespace资源配额

1
2
3
4
kubectl describe limits limits --namespace=quota-example
kubectl describe quota quota --namespace=quota-example
kubectl describe namespace default
kubectl describe resourcequota quota-development --namespace=quota-example

查看k8s 集群roles角色账户

1
kubectl get clusterroles

查看容器日志

1
kubectl logs -f <pod-name> -c <container-name> file

返回仅包含一个容器的pod nginx的日志快照

1
kubectl logs nginx

查看namespace的容器日志

1
kubectl logs kubernetes-dashboard-4184637779-zm3k1 --namespace=kube-system -f

返回pod ruby中已经停止的容器web-1的日志快照

1
kubectl logs -p -c ruby web-1

持续输出pod ruby中的容器web-1的日志

1
kubectl logs -f -c ruby web-1

仅输出pod nginx中最近的20条日志

1
kubectl logs --tail=20 nginx

输出pod nginx中最近一小时内产生的所有日志

1
kubectl logs --since=1h nginx

进入container终端, 默认进入第一个container

1
2
kubectl exec -it <pod-name> -- bash
kubectl exec -it dubbo-controller-szpq5 -c smartservice -- bash -il

在容器中执行命令

1
2
kubectl exec dubbo-controller-7c1jc ls /work/admin
kubectl exec dubbo-controller-7c1jc -c smartservice ls /work/admin

进入系统服务容器

1
kubectl exec -it monitoring-grafana-1833423272-1dkjs --namespace=kube-system /bin/sh

获取configmap的yaml文件

1
kubectl get configmap nginx-config -o yaml

token

查看token服务

1
kubectl  get secret -n kube-system

查看服务对应的token值

1
kubectl describe secret/service-controller-token-9zqbz -n kube-system

节点标签

NoExecute Taint,防止业务容器调度或运行在这些节点

1
kubectl taint nodes 192.168.56.105 LB=NIC:NoExecute

Label,让NIC只部署在打了对应Lable的节点上

1
2
kubectl label nodes 192.168.56.105 LB=NIC
kubectl label nodes 10.6.0.140 ingress=proxy

查看节点上打label标签的pod

1
kubectl get nodes --show-labels

删除标签,只需在命令行最后指定Label的key名并与一个减号相连

1
kubectl label nodes 192.168.56.105 LB-

ingress

查看ingress解析的svc

1
2
3
kubectl get ingress -n kube-system -o wide

kubectl get ing

calico策略

列举所有名字空间profile

1
calicoctl get profile -o wide

获取k8s_ns.advanced-policy-demo的具体规则

1
calicoctl get profile k8s_ns.advanced-policy-demo -o yaml

查询calico workloadendpoint(由calico分配ip的容器)

1
calicoctl get workloadendpoint

获取k8s_ns.advanced-policy-demo的具体规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
calicoctl get profile k8s_ns.advanced-policy-demo -o yaml
- apiVersion: v1
kind: profile
metadata:
name: k8s_ns.advanced-policy-demo
tags:
- k8s_ns.advanced-policy-demo
spec:
egress:
- action: allow
destination: {}
source: {}
ingress:
- action: deny
destination: {}
source: {}

从上面规则可以看到禁止所有外面的访问这个命名空间所有容器.

定义网络策略可以允许其他容器访问nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kubectl create -f - <<EOF
kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
name: access-nginx
namespace: advanced-policy-demo
spec:
podSelector:
matchLabels:
run: nginx
ingress:
- from:
- podSelector:
matchLabels: {}
EOF

重新查看网络策略

1
calicoctl get policy -o wide

节点维护

cordon, drain, uncordon
1.2 版本中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。如下图所示是一个整个的节点维护的流程(为了方便demo增加了一些查看节点信息的操作):

图片1

1)首先查看当前集群所有节点状态,可以看到共四个节点都处于ready状态;
2)查看当前nginx两个副本分别运行在d-node1和k-node2两个节点上;
3)使用kubectl cordon d-node1命令将d-node1标记为不可调度;
4)再使用kubectl get nodes查看节点状态,发现d-node1虽然还处于Ready状态,但是同时还被禁能了调度,这意味着新的pod将不会被调度到d-node1上。
5)再查看nginx状态,没有任何变化,两个副本仍运行在d-node1和k-node2上;
6)执行kubelet drain d-node1命令,将运行在d-node1上运行的pod平滑的赶到其他节点上;–ignore-daemonsets
7)再查看nginx的状态发现,d-node1上的副本已经被迁移到k-node1上;这时候就可以对d-node1进行一些节点维护的操作,如升级内核,升级Docker等;
8)节点维护完后,使用kubelet uncordon d-node1命令解锁d-node1,使其重新变得可调度;
9)检查节点状态,发现d-node1重新变回Ready状态

滚动升级

1
kubectl rolling-update hello-rc --image=index.tenxcloud.com/tailnode/hello:v2.0

或:

1
kubectl set image deployment/nginx-deployment nginx=nginx:1.91

1.创建一个使用新版本Pod的RC,hello-rc-4f7ed44b6db1e20aa1bc681c81d63caf
2.依次增加新RC的副本数量、减少旧RC的副本数量
3.当升级成功后,删除旧RC
4.重命名新RC为hello-rc
当Pod中只有一个容器时通过–image参数指定新的Tag,如果有多个容器或其他字段的修改时,需要使用

1
kubectl rolling-update NAME -f FILE指定文件

如果在升级过程中出现问题(比如长时间无响应),可以CTRL+C结束再使用kubectl rolling-update hello-rc –rollback进行回滚,但如果升级完成后出现问题(比如新版本程序出core),此命令无能为力,需要使用同样方法“升级”为旧版本

滚动升级二:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kubectl apply -f rolling-update-test.yaml
kubectl rolling-update nginx-v1 -f nginx-v2.yaml --update-period=10s

或者直接set
kubectl set image deployment/nginx-deployment2 nginx=nginx:1.9
或者使用edit
kubectl edit deployment/nginx-deployment
查看升级进度
kubectl rollout status deployment/rolling-update-test
kubectl rollout status deployments nginx-deployment
kubectl describe deployments
暂停和继续
kubectl rollout pause deployment/nginx-deployment2
kubectl rollout resume deployment/nginx-deployment2

取消升级
kubectl rollout undo deployment/nginx-deployment

回滚
创建pod时需要加上 --record=true
例如:kubectl apply -f deployment.yaml --record
查看部署记录:kubectl rollout history deployment/flow-dispatch -n nimitz
回滚到最近一个版本
kubectl rollout undo deployment/flow-dispatch
回滚到指定版本
kubectl rollout undo deployment.yaml
kubectl rollout undo deployment/flow-dispatch --to-revision=2

命名空间的资源限额

创建命名空间

1
2
3
4
5
vim monitoring.yaml
apiVersion: v1
kind: Namespace
metadata:
name: monitoring

如果你愿意你也可以在命名空间里设置资源限额。例如当你有一个开发和产品命名空间,开发人员正在不带任何资源限额的开发命名空间上测试他们的容器,此时就会有用处。在开发命名空间上设置资源限额将有助你确保,当一个开发人员意外得使用了太多开发命名空间下的资源,不会影响你在生产命名空间下的应用。

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion:v1
kind:ResourceQuota
metadata:
name:quota
spec:
hard:
cpu: "20"
memory: 1Gi
pods: "10"
replicationcontrollers: "20"
resourcequotas: "1"
services: "5"

你可以保存这个 YAML 并把资源配额应用到命名空间下。

1
kubectl create -f resource-quota.yaml --namespace=development

https://kubernetes.io/docs/concepts/policy/resource-quotas/

etcd集群备份与恢复

线上所有集群每隔1小时都会自动做一次备份,并且发邮件通知备份成功与否。
恢复则分为原地恢复和利用原集群的数据另外启动一个集群恢复两种方式,大致的恢复流程如下:

将原etcd数据目录备份
另选3台机器,搭建一个全新的etcd集群(带证书认证)
将新etcd集群的etcd停止,数据目录下的内容全部删除
将备份数据拷贝到3台新etcd机器上,使用etcdctl snapshot restore逐个节点恢复数据,注意观察恢复后id是否一致。数据恢复完成后查看endpoint status状态是否正常。

k8s 主机资源预留

1
2
3
4
5
sudo vim /etc/systemd/system/kubelet.service
--eviction-hard=memory.available<500Mi \
--system-reserved=cpu=500m,memory=500Mi \
--eviction-pressure-transition-period=20s 、
--max-pods=30

动态伸缩 hpa

以下是完整的hpa.yaml控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
creationTimestamp: 2017-06-29T08:04:08Z
name: nginxtest
namespace: default
resourceVersion: "951016361"
selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginxtest
uid: 86febb63-5ca1-11e7-aaef-5254004e79a3
spec:
maxReplicas: 5 //资源最大副本数
minReplicas: 2 //资源最小副本数
scaleTargetRef:
apiVersion: extensions/v1beta1
kind: Deployment //需要伸缩的资源类型
name: nginxtest //需要伸缩的资源名称
targetCPUUtilizationPercentage: 50 //触发伸缩的cpu使用率
status:
currentCPUUtilizationPercentage: 48 //当前资源下pod的cpu使用率
currentReplicas: 2 //当前的副本数
desiredReplicas: 2 //期望的副本数
lastScaleTime: 2017-07-03T06:32:19Z

1.配置一个php-apache容器用于测试php-apache-rc.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: v1
kind: ReplicationController
metadata:
name: php-apache
spec:
replicas: 1
template:
metadata:
name: php-apache
labels:
app: php-apache
spec:
containers:
- name: php-apache
# image: gcr.io/google_containers/hpa-example
image: pilchard/hpa-example
imagePullPolicy: IfNotPresent
resources:
limits:
cpu: 300m
memory: 52Mi
requests:
cpu: 200m
ports:
- containerPort: 80

2.再创建一个php-apache的Service,供客户端访问php-apache-svc.yaml

1
2
3
4
5
6
7
8
9
apiVersion: v1
kind: Service
metadata:
name: php-apache
spec:
ports:
- port: 80
selector:
app: php-apache

3.创建web容器和HPA

1
2
kubectl create -f php-apache-svc.yaml
kubectl autoscale rc php-apache --min=1 --max=10 --cpu-percent=50

或:写yaml文件hpa-php-apache.yaml

1
2
3
4
5
6
7
8
9
10
11
12
piVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: v1
kind: ReplicationController
name: php-apache
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationRercentage: 50

4.使用无限循环来访问php-apache服务

1
2
while true;do wget -q -O- http://php-apache > /dev/null;done
while true;do curl -Ik http://php-apache | grep 200> /dev/null;done

5.等待一段时间后,观察搜集到的pod CPU使用率

1
kubectl get hpa

6.查看RC php-apache副本数量的变化

1
kubectl get rc

在测另一个容器中模拟请求

1
while true; do wget -q -O- http://php-apache > /dev/nul; done

如果报错 请使用

journalctl -f -t etcd 和 journalctl -u etcd 来定位问题

#无状态的,通过 Deployment 来管理;有状态的应用,通过 StatefulSet 来管理

secret

创建harbor镜像仓库create

1
kubectl create secret docker-registry harbor-pro --namespace=nimitz --docker-server=harbor.linglongtech.com --docker-username=pro --docker-password=T2nmkvsCaVGlTuVd --docker-email=pro@linglongtech.com

要了解regcred刚刚创建的Secret 的内容,首先要查看YAML格式的Secret:

1
2
kubectl get secret regcred --output=
kubectl get pod -n nimitz dispatch-2672864077-8dhk4 --output=yaml

POD高级调度-亲和性/反亲和性

1
2
3
4
5
6
7
8
9
10
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- session
topologyKey: "kubernetes.io/hostname"
-------------本文结束感谢您的阅读-------------