增
创建一个nginx实例
1 | kubectl create -f Nginx.yaml |
删
删除掉curl这个Pod
1 | kubectl delete deploy curl |
删除所有的pods
1 | kubectl delete pods --all |
移除node节点:
1 | kubectl delete node k8s-node1 |
删除rs
1 | kubectl get deployments |
删除Terminating状态的pod
1 | kubectl delete pods callme-2967103386-vghd9 --grace-period=0 --force |
改
动态扩展,添加一个容器数量
1 | kubectl scale rc --replicas=2 nginx-controller |
修改pod的数量
1 | kubectl scale rc 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 | kubectl describe pod nginx |
查看dns服务信息
1 | kubectl --namespace=kube-system describe svc/kube-dns |
查看namespace资源配额
1 | kubectl describe limits limits --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 | kubectl exec -it <pod-name> -- bash |
在容器中执行命令
1 | kubectl exec dubbo-controller-7c1jc 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 | kubectl label nodes 192.168.56.105 LB=NIC |
查看节点上打label标签的pod
1 | kubectl get nodes --show-labels |
删除标签,只需在命令行最后指定Label的key名并与一个减号相连
1 | kubectl label nodes 192.168.56.105 LB- |
ingress
查看ingress解析的svc
1 | kubectl get ingress -n kube-system -o wide |
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 | calicoctl get profile k8s_ns.advanced-policy-demo -o yaml |
从上面规则可以看到禁止所有外面的访问这个命名空间所有容器.
定义网络策略可以允许其他容器访问nginx
1 | kubectl create -f - <<EOF |
重新查看网络策略
1 | calicoctl get policy -o wide |
节点维护
cordon, drain, uncordon
1.2 版本中新加入的这3个命令可以保证维护节点时,平滑的将被维护节点上的业务迁移到其他节点上,保证业务不受影响。如下图所示是一个整个的节点维护的流程(为了方便demo增加了一些查看节点信息的操作):
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 | kubectl apply -f rolling-update-test.yaml |
命名空间的资源限额
创建命名空间
1 | vim monitoring.yaml |
如果你愿意你也可以在命名空间里设置资源限额。例如当你有一个开发和产品命名空间,开发人员正在不带任何资源限额的开发命名空间上测试他们的容器,此时就会有用处。在开发命名空间上设置资源限额将有助你确保,当一个开发人员意外得使用了太多开发命名空间下的资源,不会影响你在生产命名空间下的应用。
1 | apiVersion:v1 |
你可以保存这个 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 | sudo vim /etc/systemd/system/kubelet.service |
动态伸缩 hpa
以下是完整的hpa.yaml控制器
1 | apiVersion: autoscaling/v1 |
1.配置一个php-apache容器用于测试php-apache-rc.yaml
1 | apiVersion: v1 |
2.再创建一个php-apache的Service,供客户端访问php-apache-svc.yaml
1 | apiVersion: v1 |
3.创建web容器和HPA
1 | kubectl create -f php-apache-svc.yaml |
或:写yaml文件hpa-php-apache.yaml
1 | piVersion: autoscaling/v1 |
4.使用无限循环来访问php-apache服务
1 | while true;do wget -q -O- http://php-apache > /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 | kubectl get secret regcred --output= |
POD高级调度-亲和性/反亲和性
1 | affinity: |