这篇文章是我常用的kubectl使用方法总结,与前面的kubernetes部署环境不同,但使用方法大同小异,注意下即可。

一、kubectl高可用
1.1、kubectl访问细节

kubectl默认是使用apiserve监听的IP和端口进行对集群的访问操作
[root@k8s-master-90 ~]# netstat -lntup|grep apiserve
 tcp 0 0 10.0.10.90:6443 0.0.0.0:* LISTEN 24489/kube-apiserve
 tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 24489/kube-apiserve
 kubectl 访问[root@k8s-master-90 ~]# kubectl -s 127.0.0.1:8080 get pods
 NAME READY STATUS RESTARTS AGE
 nginx-8586cf59-c2j24 1/1 Running 0 32m
 nginx-8586cf59-hxcq9 1/1 Running 0 32m
 nginx-8586cf59-vm6x6 1/1 Running 0 32m
 [root@k8s-master-90 ~]# kubectl -s 10.0.10.90:6443 get pods # api的6443端口需要证书认证才能进行访问
 Unable to connect to the server: net/http: HTTP/1.x transport connection broken: malformed HTTP response “\x15\x03\x01\x00\x02\x02”
 127.0.0.1:8080之所以能访问,是因为该监听地址未经过证书认证,相反10.0.10.90:6443则需要经过证书许可认证才可以连接到集群进行操作。我们的目的是想要在任何linux机器上,使用kubectl工具能访问和管理集群,该如何实现呢?
1.2、部署kubectl
 kubectl本身就是编译好的二进制文件,这里我们将它部署在node-91机器上[root@k8s-master-90 ~]# scp /opt/kubernetes/bin/kubectl 10.0.10.91:/opt/kubernetes/bin/
 [root@k8s-node-91 ~]# echo “export PATH=$PATH:/opt/kubernetes/bin” >>/etc/profile
 [root@k8s-node-91 ~]# source /etc/profile
 [root@k8s-node-91 ~]# which kubectl
 /opt/kubernetes/bin/kubectl
 1.3、运行kubectl
 [root@k8s-node-91 ~]# kubectl get pods
 The connection to the server localhost:8080 was refused - did you specify the right host or port?
 连接失败,找不到服务器,那比如这台kubectl管理节点是在你公司?你如何实现管理线上的k8s集群呢?1.3.1、拷贝需要的证书文件
 到Master节点看一下,在二进制部署Kubernetes集群时,我们已经创建好了证书[root@k8s-master-90 ~]# ls -lh ssl/
 -rw------- 1 root root 1.7K 4月 17 18:43 admin-key.pem
 -rw-r–r-- 1 root root 1.4K 4月 17 18:43 admin.pem
 -rw------- 1 root root 1.7K 4月 17 18:43 ca-key.pem
 -rw-r–r-- 1 root root 1.4K 4月 17 18:43 ca.pem
 admin.pem和admin-key.pem就是为了今后方便管理k8s集群的需要ca证书和admin证书,将证书拷贝过去
[root@k8s-master-90 ~]# scp ssl/adminpem 10.0.10.91:/opt/kubernetes/ssl/
 admin-key.pem 100% 1675 1.6KB/s 00:00
 admin.pem 100% 1399 1.4KB/s 00:00
 [root@k8s-master-90 ~]# scp ssl/capem 10.0.10.91:/opt/kubernetes/ssl/
 ca-key.pem 100% 1679 1.6KB/s 00:00
 ca.pem 100% 1359 1.3KB/s 00:00
 1.3.2、生成.kube/config文件
 kubectl 默认会访问~/.kube目录里的配置文件,通过配置文件里指定的api地址来访问和管理集群。设置集群项中名为kubernetes的apiserver地址与根证书
kubectl config set-cluster kubernetes --server=https://10.0.10.90:6443 --certificate-authority=/opt/kubernetes/ssl/ca.pem
设置用户项中cluster-admin用户证书认证字段
kubectl config set-credentials cluster-admin --certificate-authority=ca.pem --client-key=admin-key.pem --client-certificate=admin.pem
设置环境项中名为default的默认集群和用户
kubectl config set-context default --cluster=kubernetes --user=cluster-admin
设置默认环境项为default
kubectl config use-context default
操作过程
[root@k8s-node-91 ~]# kubectl config set-cluster kubernetes --server=https://10.0.10.90:6443 --certificate-authority=/opt/kubernetes/ssl/ca.pem
 Cluster “kubernetes” set.
 [root@k8s-node-91 ~]# kubectl config set-credentials cluster-admin --certificate-authority=/opt/kubernetes/ssl/ca.pem --client-key=/opt/kubernetes/ssl/admin-key.pem --client-certificate=/opt/kubernetes/ssl/admin.pem
 User “cluster-admin” set.
 [root@k8s-node-91 ~]# kubectl config set-context default --cluster=kubernetes --user=cluster-admin
 Context “default” created.
 [root@k8s-node-91 ~]# kubectl config use-context default
 Switched to context “default”.
 查看生成的配置文件[root@k8s-node-91 ~]# cat .kube/config
 apiVersion: v1
 clusters:• cluster:
 certificate-authority: /opt/kubernetes/ssl/ca.pem
 server: https://10.0.10.90:6443
 name: kubernetes
 contexts:• context:
 cluster: kubernetes
 user: cluster-admin
 name: default
 current-context: default
 kind: Config
 preferences: {}
 users:• name: cluster-admin
 user:
 as-user-extra: {}
 client-certificate: /opt/kubernetes/ssl/admin.pem
 client-key: /opt/kubernetes/ssl/admin-key.pem
 我们知道kubectl 客户端是通过证书,去访问apiserver对外监听6443端口来实现管理集群的;上面生成了访问api的配置文件,接着就是使用它1.4、访问k8s集群
 [root@k8s-node-91 ~]# kubectl get cs
 NAME STATUS MESSAGE ERROR
 scheduler Healthy ok
 controller-manager Healthy ok
 etcd-0 Healthy {“health”: “true”}
 etcd-2 Healthy {“health”: “true”}
 etcd-1 Healthy {“health”: “true”}
 [root@k8s-node-91 ~]# kubectl get svc
 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
 kubernetes ClusterIP 10.10.10.1 443/TCP 1d
 nginx NodePort 10.10.10.61 88:37224/TCP 3h
 [root@k8s-node-91 ~]# kubectl get pods
 NAME READY STATUS RESTARTS AGE
 nginx-8586cf59-c2j24 1/1 Running 0 3h
 nginx-8586cf59-hxcq9 1/1 Running 0 3h
 nginx-8586cf59-vm6x6 1/1 Running 0 3h
 [root@k8s-node-91 ~]# kubectl get ns
 NAME STATUS AGE
 default Active 1d
 kube-public Active 1d
 kube-system Active 1d
 [root@k8s-node-91 ~]# kubectl get nodes
 NAME STATUS ROLES AGE VERSION
 10.0.10.91 Ready 1d v1.9.5
 10.0.10.92 Ready 1d v1.9.5
 是的,经过如上步骤,你可以配置多个kubectl客户端来管理线上的k8s集群,做到kubectl高可用。当然,为了方便部署,你也可以将以上操作进行打包,实现在下一个节点上的快速部署。
[root@k8s-node-91 ~]# tar zcf kubectl-admin.tar.gz .kube/config /opt/kubernetes/ssl/{admin-key.pem,admin.pem,ca.pem} /opt/kubernetes/bin/kubectl
 tar: 从成员名中删除开头的“/”
 [root@k8s-node-91 ~]# tar tf kubectl-admin.tar.gz # 直接部署这个文件即可
 .kube/config
 opt/kubernetes/ssl/admin-key.pem
 opt/kubernetes/ssl/admin.pem
 opt/kubernetes/ssl/ca.pem
 opt/kubernetes/bin/kubectl
 二、kubectl命令
 2.1、kubectl命令分类表
 命令 描述create 通过文件或标准输入创建资源(常用)
 expose 将一个资源公开为一个新的Service
 run 在集群中运行一个特定的镜像
 set 为objects设置一个指定的特征
 get 显示一个或多个资源(常用)
 explain 查看资源的文档
 edit 在服务器上编辑一个资源
 delete 通过文件名、标准输入、资源名称或标签选择器来删除资源(常用)
 2.1.2、部署命令
 命令 描述rollout 管理资源的发布
 rolling-update 对指定的复制控制器(rs)滚动升级
 scale 扩容或缩容Pod数量,Department、ReplicaSet、RC或Job
 autoscale 创建一个能自动调整Department、ReplicaSet、RC的副本数量
 2.1.3、集群管理命令(不常用)
 命令 描述certificate 修改证书资源
 cluster-info 显示集群信息
 top 显示资源(CPU/Memory/Storage)使用情况,需要运行Heather
 cordon 标记节点不可调度
 uncordon 标记节点可调度
 drain 维护期间排除节点
 taint 更新一个或多个节点上的污点
 2.1.4、故障诊断和调试命令(常用)
 命令 描述describe 显示指定资源或资源组的详细信息(常用)
 logs 输出容器在Pod中的日志(跟docker logs功能相同)
 attach 附加到一个运行的容器(跟docker attach功能相同)
 exec 在一个容器里执行命令(跟docker attach功能相同)
 port-forward 转发一个或多个本地端口到一个Pod上
 proxy 运行一个proxy到kubernetes API server
 cp 拷贝文件或目录到容器中
 auth 检查授权
 2.1.5、高级命令
 命令 描述apply 通过文件名或标准输入对资源进行配置
 patch 使用补丁修改、更新资源的字段
 replace 通过filename或标准输入替换一个资源
 convert 在不同的API server上转换配置文件
 2.1.6、设置命令
 命令 描述label 更新资源上标签
 annotate 更新一个资源的注解
 completion 用于实现kubectl工具自动补全
 2.1.7、其他命令
 命令 描述api-versions 打印支持的API版本
 config 修改kubeconfig文件(用于访问API,比如配置认证信息)
 help 所有命令帮助(最应该学会的命令参数)
 plugin 运行一个命令行插件
 version 打印client和server版本信息
 2.2、kubectl命令实践
 2.2.1、创建
 $ kubectl run nginx --replicas=3 --labels=“app=example” --image=nginx:1.10 --port=80
 $ kubectl create xxxx-deployment.yaml
 2.2.2、查看
 $ kubectl get deploy
 $ kubectl get pods --show-labels
 $ kubectl get pods -l app=exampl
 $ kubectl get pods -o wide
 2.2.3、发布
 $ kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service
 $ kubectl describe service nginx-service
 2.2.4、故障排查
 $ kubectl describe TYPE NAME_PREFIX
 $ kubectl logs nginx-xxx
 $ kubectl exec -it nginx-xxx bash
 2.2.5、更新$ kubectl set image deployment/nginx nginx=nginx:1.11
 $ kubectl set image deployment/nginx nginx=nginx:1.12 --record # 滚动升级,记录操作命令(生产必须使用)
 or
 $ kubectl edit deployment/nginx
 2.2.6、回滚
 $ kubectl rollout history deploy/nginx # 查看更新历史记录
 $ kubectl rollout status deploy/nginx # 查看更新状态$ kubectl rollout undo deployment/nginx-deployment # 回滚到前一个版本
 $ kubectl rollout undo deployment/nginx-deployment --to-revision NUM # 指定回滚到哪个版本
 2.2.7、删除
 $ kubectl delete deploy/nginx
 $ kubectl delete svc/nginx-service
 3、Pod扩容
 Usage:
 kubectl scale [–resource-version=version] [–current-replicas=count] –replicas=COUNT (-f FILENAME | TYPE NAME)1、将名为foo的副本缩容到3
kubectl scale --replicas=3 rs/foo
 2、从yaml文件中进行缩容kubectl scale --replicas=3 -f foo.yaml
 3、如果deployment名为mysql的当前副本集是2,那么扩容到3kubectl scale --current-replicas=2 --replicas=3 deployment/mysql