1. Kubectl管理工具远程连接集群

kubectl客户端工具主要功能是用于管理Kubernetes集群中的资源。kubectl工具可以对资源进行创建、删除和更改等操作。kubectl工具默认连接本地apiserver127.0.0.1:8080。通过-s选项指定集群HTTP非安全IP地址和端口进行访问,命令如下所示。

[root@master ~]# kubectl -s 127.0.0.1:8080 get nodeNAME STATUS ROLES AGE VERSION192.168.10.10 Ready  3h v1.10.2192.168.10.6 Ready  3h v1.10.2192.168.10.7 Ready  3h v1.10.2192.168.10.8 Ready  3h v1.10.2192.168.10.9 Ready  3h v1.10.2 

kubectl默认通过HTTP访问API集群接口,若想在集群其他节点通过HTTPS去访问集群接口需将kubectl工具拷贝到集群其它的节点中,命令如下所示。

[root@master ~]# scp /opt/kubernetes/bin/kubectl root@192.168.10.6:/usr/local/bin/[root@node-1 ~]# ls /usr/local/bin/kubectl

创建ca证书和admin证书,admin是用于客户端去管理集群的,所以需将admin证书拷贝到客户端访问集群的节点中,命令如下所示。

[root@master ssl]# scp admin*pem root@192.168.10.6:/root/[root@node-1 ~]# cp /opt/kubernetes/ssl/ca.pem ./[root@node-1 ~]# lsadmin-key.pem admin.pem anaconda-ks.cfg ca.pem node node.zip

创建config用于kubectl命令去调用config文件中的配置信息去访问集群,默认会在.kube/目录下创建缓存目录,包括config也要放在此处才会引用,kubectl命令可以快速帮助我们生成config配置文件,只需设置集群项中名为Kubernetes的apiserver地址与根证书即可,命令如下所示。

[root@node-1 ~]# kubectl config set-cluster kubernetes --server=https://192.168.10.5:6443 --certificate-authority=ca.pemCluster "kubernetes" set.[root@node-1 ~]# ls .kube/config

设置用户项中cluster-admin用户证书认证字段,命令如下所示。

[root@node-1 ~]# kubectl config set-credentials cluster-admin --certificate-authority=ca.pem --client-key=admin-key.pem --client-certificate=admin.pemUser "cluster-admin" set.

设置环境项中名为default的默认集群和用户,命令如下所示。

[root@node-1 ~]# kubectl config set-context default --cluster=kubernetes --user=cluster-adminContext "default" created.

设置默认环境项为default,配置完毕后可/root/.kube/config查看配置信息通过命令如下所示。

[root@node-1 ~]# kubectl config use-context defaultSwitched to context "default".[root@node-1 ~]# cat /root/.kube/config

通过kubectl get node命令可以正常获取到集群节点信息说明没有问题,如果将/root/.kube隐藏目录下的config配置文件移走,则会提示你没有指定要连接集群的IP和端口,如图1所示。

ddd9d9e511ceec9e77ab7a690172af7d.png

图1

通过kubectl get all命令即可查看默认命名空间中所有的资源,如图2所示。

a72e70baeec45382e68df0ff76e0fb8f.png

图2

注意

将上述配置和文件打包移植到其他服务器集群的节点中也可实现访问。

2. Kubectl管理命令

如图3所示,表中列出的是kubectl常用的管理命令的功能介绍。

ef3d9fb128f34fd6b41fa1c842b35235.png

图3

图3所示的命令是通过kubectl --help命令列出来的,然而每个列出的命令后面也可加--help查看命令的使用状态,如查看create命令如何使用,命令如下所示。

[root@node-1 ~]# kubectl create --help

3.Kubectl工具管理集群应用

上一节中给大家列出了kubectl管理工具一些指令的概要,kubectl的每个命令都存在哪些作用。若想更好的使用kubectl管理工具的唯一途径是查看帮助文档。帮助文档中会列出很多子指令和一些选项。本节将根据Kubernetes在集群中部署应用管理周期的需求来讲解是如何使用kubectl管理工具的。

3.1Kubectl工具创建资源

删除前面创建的资源,避免混淆,删除资源需删除deployment和service,删除命令如下所示。

[root@master ~]# kubectl delete deploy/nginxdeployment.extensions "nginx" deleted[root@master ~]# kubectl delete svc/nginxservice "nginx" deleted[root@master ~]# kubectl get all

在集群中创建一个新资源,如创建目前企业主流的Nginx服务,该服务是从docker上获取,命令如下所示。创建后通过kubectl get all命令查看资源的状态,如图4所示。

[root@master ~]# kubectl run nginx --replicas=5 --labels="app=nginx-example" --image=nginx:1.10 --port=80deployment.apps "nginx" created
8f3dc2bb89260f70b5646f11516c3dc1.png

图4

注意

通过run创建的对象默认都是deployment。kubectl run --help可以查看run的帮助信息。

3.2 Kubectl工具查看资源信息

通过kubectl describe命令可以查看该pod的详细信息,重点查看末尾最后几行信息,如图5所示。

0b4e0a1f78f9bc7ddf21d9d9760823f3.png

图5

kubectl get svc可以列出service,如果想列出多个资源可以用逗号作为分隔符,如列出svc和deployment的资源,如图6所示。

d7510f14e78adbd7f7d66832e0cfad50.png

图6

在创建Nginx deployment时指定了一个标签(labels),也可以通过标签去匹配具体的pod,如图7所示。

9dac755a34909fd9e1c24a8714bd5b70.png

图7

通过kubectl get pods -o wide命令可以查看资源的详细信息,如查看pod具体分配到哪个节点上和哪个IP上,通过kubectl get deploy -o wide命令可以具体的查看对象使用了哪些镜像,如图8所示。

181fc38bc7104653fcb8bed63379a82d.png

图8

3.3 Kubectl工具发布应用

部署的应用如果正常就可以发布了。如果部署完应用后不进行发布,用户是无法访问的,通过expose命令使应用在外部暴露一个端口。此方法相当于给应用加负载均衡,因为Pod分配在不同的节点上,所以,对用户只能提供一个入口,最后负载均衡到里面。该需求是由Node节点上的kube-proxy实现的,发布命令如下所示。

[root@master ~]# kubectl expose deployment nginx --port=88 --type=NodePort --target-port=80 --name=nginx-serviceservice "nginx-service" exposed

Nginx服务发布后通过kubectl get svc命令查看创建的service,如图9所示。在图9中可以看到服务的名称,服务的类型和集群的IP,创建的Service都会为集群分配Cluster-IP,Cluster-IP是在启动kube-apiserver组件时指定的网段,如图10所示。

1fdd2cb659cc599abe0c6c705c54e70d.png

图9

fd30d87534dac3f26a2d9c27c564548e.png

图10

通过外部浏览器,输入Node节点IP地址加暴露在外部的NodePort端口号即可访问Nginx页面,如图11所示。也可使用curl命令或elinks命令访问内部IP和端口号进行访问,如图12所示。

3b4fb5dad5b8ba21a2d787821d1a15ac.png

图11

f8b85e50717527c2d2c60a4cbc044f61.png

图12

3.4 Kubectl工具故障排查

在部署应用时是无法做到每次都部署成功的,都会存在一些不可避免的因素。当然出现问题对于我们来说是一件很好的事情,只有出现问题才可以提高我们排查错误的水平和能力。

应用出现问题时可以通过describe命令查看资源事件类型,类型可以是deploy、rs、po。指定类型后加上资源名称,还可查看svc的具体配置信息,命令如下所示。

[root@master ~]# kubectl describe po/nginx-f95d765f9-dss2v[root@master ~]# kubectl describe deploy/nginx[root@master ~]# kubectl describe rs/nginx-f95d765f9[root@master ~]# kubectl describe svc[root@master ~]# kubectl describe svc nginx-service

通过kubectl logs命令可以查看pod运行时输出的日志信息,如图13所示。

3dfbc5f588f8e6d705acae7e78cb4eb8.png

图13

kubectl exec命令可以进入pod查看具体应用的一些状态信息,如修改index.html文件中的内容为HuMingZhe,命令如下所示。

[root@node-1 ~]# kubectl exec -it nginx-f95d765f9-qpx4l bashroot@nginx-f95d765f9-qpx4l:/# cd /usr/share/nginx/html/root@nginx-f95d765f9-qpx4l:/usr/share/nginx/html# echo "HuMingZhe" > index.htmlroot@nginx-f95d765f9-qpx4l:/usr/share/nginx/html# cat index.html HuMingZhe

3.5 Kubectl工具更新应用

应用部署起来后,后期会做一些升级,或者更换一些镜像。更新镜像可以通过kubectl set命令进行更新,如前面小节中Nginx镜像版本是1.10,现在更新为1.13.8,查询是否更新成功可使用 kubectl describe命令进行查看,命令如下所示。

[root@master ~]# kubectl set image deployment/nginx nginx=nginx:1.13.8deployment "nginx" image updated[root@master ~]# kubectl describe pod nginx-f56ffcb44-4lpg5Containers: nginx: Container ID: docker://4bac9958cbd72c64a23f874af4c6a9b82b80ffaafdde7c0840319395929f5d1a Image: nginx:1.13.8 Image ID: docker-pullable://nginx@sha256:0ffc09487404ea43807a1fd9e33d9e924d2c8b48a7b7897e4d1231a396052ff9 Port: 80/TCP State: Running Started: Fri, 02 Mar 2018 21:45:27 +0800

通过kubectl edit命令编辑Nginx的资源,找到Nginx版本所在位置,将nginx:1.13.8改为nginx:1.12,命令如下所示。

[root@master ~]# kubectl edit deploy/nginx spec: containers: - image: nginx:1.12deployment "nginx" edited[root@master ~]# kubectl describe pod nginx-667655d949-8gtrznginx: Container ID: docker://8ddb2c2326542bf08c856c3a1f713c3c0616adfa06a53ed279e780a019d9c062 Image: nginx:1.12 Image ID: docker-pullable://nginx@sha256:813be5ee155f914d063e8ed39878267995d31d7046a9010001f0a9e8192412a5

通过curl -I 指定内部IP地址和端口号也可以查看Nginx的版本信息,命令如下所示。

[root@node-1 ~]# curl -I 10.10.10.155:88HTTP/1.1 200 OKServer: nginx/1.12.2Date: Sat, 21 Apr 2018 13:41:57 GMTContent-Type: text/htmlContent-Length: 10Last-Modified: Sat, 21 Apr 2018 13:40:02 GMTConnection: keep-aliveETag: "5adb3f32-a"Accept-Ranges: bytes

项目升级到最新版本后,通过kubectl rollout status命令可以查看发布的状态信息,命令如下所示。

[root@master ~]# kubectl rollout status deploy/nginxdeployment "nginx" successfully rolled out

kubectl rollout history命令可以查看发布的版本,通过查看共显示了三个版本。第一个版本是1.10,第二个版本是1.13.8,第三个版本是1.12.2,命令如下所示。

[root@master ~]# kubectl rollout history deploy/nginxdeployments "nginx"REVISION CHANGE-CAUSE1 2 3 

查看时发现默认全部为none,这是因为没有记录版本信息造成的,可以再修改nginx版本信息的后面加上--record选项,让其记录命令,命令如下所示。

[root@master ~]# kubectl set image deployment/nginx nginx=nginx:1.13.8 --recorddeployment "nginx" image updated[root@master ~]# kubectl rollout history deploy/nginxdeployments "nginx"REVISION CHANGE-CAUSE1 3 5 6 7 kubectl set image deployment/nginx nginx=nginx:1.13.8 --record=true

现有3个Nginx副本数提供服务,在618或双11这种购物节日,访问量会倍增,此时,就需要更多的Nginx服务来支支撑更大的并发,所以,需要进行扩容来增加pod的数量。kubectl scale命令可以针对deploy进行伸缩处理,如将Nginx副本数改为10,扩容在在查看pods会变为10个,当购物节过去后,此时不在需要这么多,可以改回3个,如图14所示。

99e19f37aad9db1ddff49fbedfd0b23e.png

图14

3.6 Kubectl工具资源回滚

更新镜像到最新版本后发现镜像存在问题,可以通过kubectl rollout undo命令实现回滚,默认回滚到上一个版本,命令如下所示。

[root@master ~]# kubectl rollout undo deployment/nginxdeployment "nginx" 

3.7 Kubectl工具删除资源

现在维护应用的生命周期已经接近尾声,此时不在需要这些应用,所以,可以进行删除,先删除deployment,在删除service,命令如下所示。

[root@master ~]# kubectl get all[root@master ~]# kubectl delete deploy/nginx deployment "nginx" deleted[root@master ~]# kubectl delete svc/nginx-serviceservice "nginx-service" deleted[root@master ~]# kubectl get allNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEsvc/kubernetes ClusterIP 10.10.10.1  443/TCP 2h
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐