这篇文章是我常用的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,那么扩容到3
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql