第三章 Kubernetes进阶之kubectl管理命令
一. kubectl管理命令概要
- 基础命令
- create 通过文件名或标准输入创建资源
- expose 将一个新的资源公开为新的service
- run 在集群中运行一个特定的镜像(创建一个容器)
- set 在对象上设置特定的功能
- get 显示一个或多个资源
- edit 使用默认的编辑器编辑资源
- delete 通过文件名、标准输入、资源名称、或标签选择器来删除资源
- 部署命令
- rollout 管理资源的发布
- rolling-update 对给定的复制控制器滚动更新
- scale 扩容或缩容pod数量,Deployment、ReplicaSet、RC、或Job
- autoscale 创建一个自动选择扩容并设置pod数量
- 集群管理命令
- certficate 修改证书资源
- cluster-info 显示集群信息
- top 显示资源(cpu/memory/storage)使用。需要部署Heapster运行
- cordon 标记节点可以调度
- uncordon 标记节点不可调度 (节点维护情况下使用)
- drain 驱逐节点上的应用,准备下线(比如机器故障、更换等停机)
- taint 修改节点taint标记
- 故障诊断和调试命令
- describe 显示特性资源或资源组详细信息
- log 在一个pod中打印一个容器日志,如果pod只有一个容器日志,容器名称是可选的
- attach 附加到一个运行的容器
- exec 执行命令到容器
- port-forward 转发一个或多个本地端口到pod
- porxy 运行一个porxy到kubernetes api server
- cp 拷贝文件或目录到容器中
- auth 检查授权
- 高级命令
- apply 通过文件名或标准输入对资源应用配置
- patch 通过补丁修改、更新资源字段
- replace 通过文件名或标准输入替换一个资源
- covert 不同api版本之间转换配置文件
- 设置命令
- lable 更新资源上的标签
- annotate 更新资源上的注释
- completion 用于实现kubectl工具自动补全
- 其他命令
- api-versions 打印受支持的api版本
- config 修改kubernetes文件(用于访问api,比如配置认证信息等)
- help 所有帮助命令
- plugin 运行一个命令行插件
- version 打印客户端和服务版本信息
二. kubectl工具管理资源生命周期
k8s创建资源会自动调用后端node,部署是使用镜像进行部署
1,创建
#指定名称为nginx 副本数为3 使用镜像为nginx:1.14 端口是80这里的80端口代表的镜像nginx默认的端口80 kubectl run nginx --replicas=3 --image=nginx:1.14 --port=80
使用run创建deployment会出现以下警告信息
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.
意思是参数--generator=deployment/apps.v1会在将来版本移除,使用kubectl run --generator=run-pod/v1或者kubectl create替代
使用以上命令创建pod
kubectl run nginx --image=nginx:1.14 --replicas=3 --port=80 --generator=run-pod/v1
注意:使用该命令创建pod但是不会创建deployment
针对pod使用以下命令创建对应service
kubectl expose pod nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
参数解释
#创建一个service #pod nginx 该service对应的pod名称是nginx #--port=80 k8s中服务之间访问的端口 #--type=NodePort发布类型是NodePort即外部可以访问的端口,会随机生成一个3000以上的端口 #--target-port容器的端口(最根本的端口人口),与制作容器时暴露的端口一致,例如docker.io官方的nginx暴露是80端口 #--name指定service的的名称
删除以上创建的pod和service继续,没有deployment不需要删除
kubectl delete pod nginx kubectl delete svc nginx-service
查看创建的pod,正在创建3个副本容器
# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-7bc87ddb4d-47lrr 0/1 ContainerCreating 0 55s nginx-7bc87ddb4d-4q9nr 0/1 ContainerCreating 0 55s nginx-7bc87ddb4d-sz8hl 0/1 ContainerCreating 0 55s
创建成功后状态为running
# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-7bc87ddb4d-47lrr 1/1 Running 0 6m nginx-7bc87ddb4d-4q9nr 1/1 Running 0 6m nginx-7bc87ddb4d-sz8hl 1/1 Running 0 6m
实际创建了一个包含三个副本的deployment
# kubectl get deploy NAME READY UP-TO-DATE AVAILABLE AGE nginx 3/3 3 3 6m49s
2,发布
创建好的应用需要创建service暴露应用
#创建一个service #deployment nginx 该service对应的deployment名称是nginx #--port=80 k8s中服务之间访问的端口 #--type=NodePort发布类型是NodePort即外部可以访问的端口,会随机生成一个3000以上的端口 #--target-port容器的端口(最根本的端口人口),与制作容器时暴露的端口一致,例如docker.io官方的nginx暴露是80端口 #--name指定service的的名称 kubectl expose deployment nginx --port=80 --type=NodePort --target-port=80 --name=nginx-service
查看,对外暴露了端口为30232
# kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.10.10.1 <none> 443/TCP 3d4h nginx-service NodePort 10.10.10.48 <none> 80:30232/TCP 9m8s
访问 任意node的ip加对应的端口
查看nginx日志
kubectl logs nginx-7bc87ddb4d-sz8hl
如果查看日志出现错误提示
Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log nginx-7bc87ddb4d-sz8hl)
解决办法
绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous
3,更新项目
项目已经部署需要更新
kubectl set image deployment/nginx nginx=nginx:1.15
会下载镜像滚动更新
更新完毕查看nginx版本变成1.15了
kubectl describe pod nginx-6f7d58d4cc-9bj74
4,回滚
查看发布过的版本
# kubectl rollout history deployment/nginx deployment.extensions/nginx REVISION CHANGE-CAUSE 1 <none> 2 <none>
其中最后一个版本即为现在正在运行的版本,比如这里的版本2
回滚到上一个版本
kubectl rollout undo deployment/nginx
指定版本回滚,假如想回滚到版本1
kubectl rollout undo deploy/nginx --to-revision=1
回滚后再查看,已经回滚到1版本现在运行的版本是3
# kubectl rollout history deploy/nginx deployment.extensions/nginx REVISION CHANGE-CAUSE 2 <none> 3 <none>
5,删除
项目下线删除
#删除deployment kubectl delete deployment/nginx #删除service kubectl delete svc/nginx-service
三. kubectl工具远程连接集群
一般管理k8s集群在master进行管理,把管理工具kubectl拷贝至其他主机无法管理集群,本地没有监听的端口8080
# kubectl get node The connection to the server localhost:8080 was refused - did you specify the right host or port?
生产admin证书
# cat admin-csr.json { "CN": "admin", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "BeiJing", "L": "BeiJing", "O": "system:masters", "OU": "System" } ] } cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin
在k8s证书目录下执行生成配置文件,这里连接的IP使用的是VIP 192.168.1.60
kubectl config set-cluster kubernetes \ > --server=https://192.168.1.60:6443 \ > --embed-certs=true \ > --certificate-authority=ca.pem \ > --kubeconfig=config Cluster "kubernetes" set. # kubectl config set-credentials cluster-admin \ > --certificate-authority=ca.pem \ > --embed-certs=true \ > --client-key=admin-key.pem \ > --client-certificate=admin.pem \ > --kubeconfig=config User "cluster-admin" set. kubectl config set-context default --cluster=kubernetes --user=cluster-admin --kubeconfig=config Context "default" created. kubectl config use-context default --kubeconfig=config Switched to context "default".
生成config配置文件
把该配置文件config拷贝至其他主机例如node即可以加配置文件运行kubectl命令
# kubectl --kubeconfig=config get node NAME STATUS ROLES AGE VERSION 192.168.1.65 Ready <none> 3d22h v1.13.4 192.168.1.66 Ready <none> 3d22h v1.13.4
把配置文件放在以下目录即可以不加配置文件即可使用
/root/.kube