四 命令入门
4.1 kubectl
kubectl 是 apiserver 的客户端程序,这个客户端程序是通过连接 master 节点上的 apiserver ,实现各种 k8s 对象的增删改查等基本操作,在 k8s 可被管理的对象有很多个
基本命令 (初级):
create 从文件或标准输入创建资源
expose 获取一个复制控制器, 服务, 部署或者暴露一个 POD 将其作为新的 Kubernetes 服务公开
run 创建并运行特定的镜像, 创建使用 deployment 或 job 管理的容器
set 设置对象的特定功能, 例如发布, 每次去set 不用的image tag
基本命令 (中级):
explain 文档或者资源, 可以用来查看资源清单写法
get 显示一个或多个资源
edit 编辑服务器上的资源
delete 按文件名, 标准输入, 资源和名称或资源和标签选择器删除资源
部署命令:
rollout 管理资源的部署
scale 为部署设置新大小, ReplicaSet, Replication Controller, Job
autoscale 自动扩展一个部署, ReplicaSet, 或者 ReplicationController
群集管理命令:
certificate 修改证书资源
cluster-info 显示群集信息
top 显示资源(CPU / 内存/ 存储)使用情况, 需要安装metrics-server
cordon 将节点标记为不可调度
uncordon 将节点标记为可调度
drain 设定 node 进入维护模式
taint 更新一个或多个节点上的污点
故障排除和调试命令:
describe 显示特定资源或资源组的详细信息
logs 在容器中打印容器的日志
attach 附加到正在运行的容器
exec 在容器中执行命令
port-forward 将一个或多个本地端口转发到 pod
proxy 运行代理到 Kubernetes API 服务器
cp 将文件和目录复制到容器, 和从容器复制, 跨容器复制文件
auth 检查授权
高级命令:
diff 针对将要应用的版本的 Diff 实时版本
apply 通过文件名或标准输入将配置应用于资源
patch 使用策略合并补丁更新资源的字段
replace 用文件名或标准输入替换资源
wait 实验阶段命令: 在一个或多个资源上等待特定条件, 定义一个触发器
convert 在不同的API版本之间转换配置文件
kustomize 从目录或远程 URL 构建 kustomization 目标
设置命令:
label 更新资源上的标签
annotate 更新资源上的注释
completion 命令补全相关功能
其他命令:
api-resources 在服务器上打印支持的API资源
api-versions 以 "group/version" 的形式在服务器上打印支持的API版本
config 修改 kubeconfig 文件
plugin 提供与插件交互的实用程序
version 打印客户端和服务器版本信息
复制代码
4.2 run
创建一个名为 nginx 的 deployment,镜像为 nginx:latest ,如果不知道副本数,则为 1
kubectl run nginx --image=nginx:latest
复制代码
kubectl run nginx --image=nginx --replicas=5 # 启动 5 个 POD
复制代码
kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>
复制代码
kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl -Mbignum=bpi -wle 'print bpi(2000)'
复制代码
指定参数 dry-run 可以用来验证写的 yaml 文件是否存在异常,不会真正执行
kubectl run nginx-deploy --image=nginx --port=80 --replicas=1 --dry-run=true
复制代码
kubectl delete pods nginx-deploy-5c9b546997-jsmk6
复制代码
4.3 expose
现在存在一个问题,就是 POD 的 IP 地址可能随时发生变动,所以不能作为访问的入口,那么就需要 service 来代理 POD 来创建一个固定的端点。
在控制器 nginx-deploy 上创建名字为 nginx 的 service , 它工作端口为 80, 代理的后端容器端口 80, 协议为 TCP
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
复制代码
kubectl delete deployment nginx-deploy
复制代码
4.4 cp
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
[root@master ~]# kubectl cp flannel.tar nginx-58cd4d4f44-8pwb7:/usr/share/nginx/html
[root@master ~]# kubectl cp mainfile/ nginx-58cd4d4f44-8pwb7:/usr/share/nginx/html
[root@master ~]# kubectl exec -it nginx-58cd4d4f44-8pwb7 -- /bin/bash
root@nginx-58cd4d4f44-8pwb7:/# ls -l /usr/share/nginx/html/
total 54108
-rw-r--r-- 1 root root 537 Jul 11 2017 50x.html
-rw-r--r-- 1 root root 355 May 27 06:47 dashboard-adminuser.yaml
-rw------- 1 root root 55390720 May 27 01:49 flannel.tar
-rw-r--r-- 1 root root 612 Jul 11 2017 index.html
drwxr-xr-x 4 root root 51 Aug 17 14:16 mainfile
复制代码
4.5 port-forward
kubectl port-forward --address 0.0.0.0 service/nginx 8888 8111
复制代码
kubectl port-forward pod/mypod 8888:5000
复制代码
4.6 coredns
service 提供了对 pod 的固定访问端点,但是 service 本身的变动我们无法知晓,需要 coredns 对 service 做域名解析。
kubectl get pods -n kube-system -o wide |grep coredns
复制代码
kubectl get service -n kube-system
复制代码
dig -t A nginx.default.svc.cluster.local @10.96.0.10
复制代码
kubectl run client --image=busybox --replicas=1 -it --restart=Never
复制代码
/ # cat /etc/resolv.conf
nameserver 10.96.0.10 # kube-dns 地址
search default.svc.cluster.local svc.cluster.local cluster.local # 默认的解析搜索域
options ndots:5
复制代码
wget -O - -q http://nginx:80/
复制代码
4.7 模拟 POD 被删除
kubectl delete pods nginx-deploy-5c9b546997-4w24n
复制代码
wget -O - -q http://nginx:80/
复制代码
4.8 模拟 service 被删除
kubectl delete service nginx
复制代码
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP
复制代码
wget -O - -q http://nginx:80/
复制代码
4.9 labels
为什么 Pod 被删除后,servic 仍然能够正确的调度到新的 POD 上,这就是 k8s 的 labels 这个机制来保证的。
能够使用标签机制不止有 pod、在 k8s 中很多对象都可以使用标签,例如:node、service
kubectl describe service nginx
复制代码
Name: nginx
Namespace: default
Labels: run=nginx-deploy
Annotations: <none>
Selector: run=nginx-deploy # 这个选择器会自动选中 run 标签,且值为 nginx-deploy 的 POD
Type: ClusterIP
IP: 10.101.149.4
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.2.4:80 # 当 service 的后端,当 POD 发生变动则立即会更新
Session Affinity: None
Events: <none>
复制代码
kubectl get pods --show-labels
复制代码
NAME READY STATUS RESTARTS AGE LABELS
client 1/1 Running 0 21m run=client
nginx-deploy-5c9b546997-kh88w 1/1 Running 0 8m37s pod-template-hash=5c9b546997,run=nginx-deploy
复制代码
kubectl describe deployment nginx-deploy
复制代码
kubectl get pods --show-labels -l run=nginx-deploy
复制代码
关系与: KEY,KEY KEY=VALUE2,KEY=VALUE2 # -l run,app
等值关系:KEY = VALUE KEY != VALUE # -l run=nginx-deploy,app!=myapp
集合关系:KYE in|not in (VALUE1,VALUE2) # -l "release in (canary,bata,alpha)"
复制代码
kubectl get pods --show-labels -L run,pod-template-hash
复制代码
kubectl label pods client release=canary
复制代码
kubectl label pods client release=stable --overwrite
复制代码
kubectl label nodes node2 disktype-
复制代码
matchLabels: 直接给定键值
matchExpressions: 基于给定的表达式来定义使用标签选择器: {key:"KEY",operator:"OPERATOR",value:[VAL1,VAL2,...]}
使用 key 与 value 进行 operator 运算, 复合条件的才被选择
操作符:
In, NotIn: 其 value 列表必须有值
Exists, NotExists: 其 value 必须为空
复制代码
kubectl label nodes node2 disktype=ssd
复制代码
kubectl get nodes --show-labels
复制代码
4.10 动态扩容
kubectl scale --replicas=5 deployment nginx-deploy
复制代码
4.11 滚动升级
kubectl set image deployment nginx-deploy nginx-deploy=ikubernetes/myapp:v2
复制代码
kubectl rollout status deployment nginx-deploy
复制代码
[root@node1 ~]# kubectl rollout status deployment nginx-deploy
Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 3 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 4 out of 5 new replicas have been updated...
Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 2 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deploy" rollout to finish: 4 of 5 updated replicas are available...
deployment "nginx-deploy" successfully rolled out
复制代码
kubectl rollout undo deployment nginx-deploy
复制代码
如果防止更新过程中被调度,那么就需要学习就绪性检测才能实现
4.12 集群外访问
kubectl edit service nginx
复制代码
type: ClusterIP -> type: NodePort
复制代码
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
nginx NodePort 10.105.27.11 <none> 80:30982/TCP 42m
复制代码
http://172.16.100.101:30982/
复制代码
4.13 排查日志
kubectl logs pod-demo busybox
复制代码
4.14 连入 POD 容器
kubectl exec -it pod-demo -c myapp -- /bin/sh
复制代码
其他
自己将手记发在:https://github.com/redhatxl/awesome-kubernetes-notes欢迎一键三连。
评论