Fork me on GitHub

kubernetes系列之《Kubectl管理工具常用方法》

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

一、kubectl高可用

1.1、kubectl访问细节

kubectl默认是使用apiserve监听的IP和端口进行对集群的访问操作

1
2
3
[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 访问

1
2
3
4
5
6
7
[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机器上

1
2
3
4
5
[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

1
2
[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集群时,我们已经创建好了证书

1
2
3
4
5
[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证书,将证书拷贝过去

1
2
3
4
5
6
[root@k8s-master-90 ~]# scp ssl/admin*pem 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/ca*pem 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地址来访问和管理集群。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 设置集群项中名为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".

查看生成的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[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 <none> 443/TCP 1d
nginx NodePort 10.10.10.61 <none> 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 <none> 1d v1.9.5
10.0.10.92 Ready <none> 1d v1.9.5

是的,经过如上步骤,你可以配置多个kubectl客户端来管理线上的k8s集群,做到kubectl高可用。

当然,为了方便部署,你也可以将以上操作进行打包,实现在下一个节点上的快速部署。

1
2
3
4
5
6
7
8
[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、创建

1
2
$ kubectl run nginx --replicas=3 --labels="app=example" --image=nginx:1.10 --port=80
$ kubectl create xxxx-deployment.yaml

2.2.2、查看

1
2
3
4
$ kubectl get deploy
$ kubectl get pods --show-labels
$ kubectl get pods -l app=exampl
$ kubectl get pods -o wide

2.2.3、发布

1
2
$ kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-service
$ kubectl describe service nginx-service

2.2.4、故障排查

1
2
3
$ kubectl describe TYPE NAME_PREFIX
$ kubectl logs nginx-xxx
$ kubectl exec -it nginx-xxx bash

2.2.5、更新

1
2
3
4
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、回滚

1
2
3
4
5
$ 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、删除

1
2
$ 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

1
kubectl scale --replicas=3 rs/foo

2、从yaml文件中进行缩容

1
kubectl scale --replicas=3 -f foo.yaml

3、如果deployment名为mysql的当前副本集是2,那么扩容到3

1
kubectl scale --current-replicas=2 --replicas=3 deployment/mysql

参考文章:

-------------本文结束感谢您的阅读-------------