K8S 已经安装完成,接下来就得学习它的基本使用方法,也就是常见的命令使用!
在这之前为了便于使用,可以配置一个 K8S 的命令 TAB 补全功能:
yum install -y bash-completion source /usr/share/bash-completion/bash_completion source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc
此时 kubectl 之后使用 TAB 键就能直接补全命令!
关于 K8S Pod
注意,所有操作都应该在 K8S 的 Master 节点上面执行。和 docker 一样,一开始先了解命令的使用,之后才是编写 docker-compose.yaml 配置文件。
关于 K8S Pod:
1. K8S 最小的调度单元为 Pod,一个 Pod 由一个或多个关系紧密的容器组成,Pod 内部共享网络,存储等,而 Pod 之间的隔离可以采用不同的名称空间。
2. K8S 所有的操作都是为了更好的运行 Pod,且 Pod 可分为:自助式 Pod 和控制器管理的 Pod。
3. 一个或多个相同的 Pod 又组成了一个 Service,其作用在于给一组相同的 Pod 提供一个固定的访问入口(Cluster IP),Service 和 Pod 采用标签进行绑定,而不是 Pod 的 IP,因此不用关心因为 Pod 重构之后 IP 变更的问题,每组 Pod 都应该有单独的 Service 进行调度。
4. 用户请求可以看成:请求到达宿主机 Node IP,转发到 Service 的 Cluster IP,然后分发到 Service 下面的某个 Pod IP,最后 Pod 转发给内部的指定容器。
K8S 基本操作
1. 查看节点情况:
kubectl get nodes
可在后面增加 -o wide 参数,查看详细情况,增加 -w 参数,动态查看,类似 Linux 的 top 命令。
2. 查看名称空间:
kubectl get ns
结果如下:
K8S 本身的系统服务都运行在 kube-system 这个名称空间中,用户在没指定名称空间时运行的都在默认的 default 名称空间中。
3. 查看运行的 Pod:
kubectl get pods
由于现在还没有运行用户自定义的 Pod,所以是空的,可以看看系统运行的:
kubectl get pods -n kube-system
通过 -n 参数指定名称空间。
查看详细信息可以看到服务重启的次数,运行在集群内的哪个节点等。
4. 运行一个简单的 Pod:
kubectl run nginx-pod-demo --image=nginx:1.14-alpine --port=80 --replicas=1
结果如图:
提示大致的意思是 run 的某些参数将会在未来的版本中被移除,建议使用新的参数。不通管,只需要看到最后一行显示 created 即可。
其中参数的意思:
--image:指定容器所使用的镜像版本。
--port:说明服务端口,但是并未映射出来。
--replicas:指定该 Pod 运行的副本数量。
此时查看 Pod:
可以发现它的名称并非我们指定的名称,而是在指定的名称后面增加了一串乱七八糟的字符。那我们指定的名称到底是什么名称?
5. 查看默认控制器:
kubectl get deployment
结果如图:
通过该图可以知道:
1. K8S 的命令其实很多都是可以简写的。
2. deployment 是一种默认 Pod 控制器,后面会详讲,run 的时候指定的名称其实是 deployment 的名称。
kubectl get deployments.apps nginx-pod-demo
甚至可以专门指定查看某个具体的 deployment 的信息:
6. 查看详细信息:
kubectl describe deployment nginx-pod-demo
结果如图:
查看 Pod 的详细信息:
kubectl describe pods nginx-pod-demo-6f9c78b8bd-snplz
结果如下:
7. 访问测试:
可以在集群内部任何宿主机通过 Pod 的 IP 和端口对 Pod 的访问进行访问。但是外部无法访问。
8. pod 扩容:
kubectl scale deployment nginx-pod-demo --replicas=3
查看:
9. 外部访问:
以此时的状态而言,由于不再是单节点,所有以 Pod IP 来访问肯定不现实,此时的做法是在 Pod 上面再加一层 Service。
kubectl expose deployment nginx-pod-demo --name=nginx-demo-svc --port=80 --target-port=80
参数说明:--target-port:指定外部端口。
查看 svc:
kubectl get svc
使用 svc 的 IP 进行访问:
但是这样依然存在一个问题,虽然统一到了 svc 的 IP 地址上面,可外部依然无法访问,只支持集群内部访问。
10. 修改配置:
kubectl edit svc nginx-demo-svc
查看:
保存之后再度查看:
当然,也可以在 expose 的时候通过 --type 指定。外部访问测试:
映射出来的端口是一个大于 30000 的随机端口。
11. 查看 Pod 日志:
kubectl logs nginx-pod-demo-6f9c78b8bd-5jccn
结果如图:
12. 升级和回滚:
kubectl set image deployment nginx-pod-demo nginx-pod-demo:nginx:1.15-alpine --record
镜像版本升级:
查看可以提供给回滚的版本:
kubectl rollout history deployment nginx-pod-demo
结果如图:
回滚到上个版本:
kubectl rollout undo deployment nginx-pod-demo
此时初始版本变成到 3 上面去了:
当然,也可以通过 --to-revision 参数回滚到指定版本。
13. 删除:
删除 Pod:
kubectl delete pods nginx-pod-demo-6f9c78b8bd-2cmn8
结果如图:
由于控制器定义了 replicas 的原因,所以删除了会自动重建新的。
删除 deployment:
kubectl delete deployment nginx-pod-demo
最终会控制器,Pod 一并删除并不重建:
删除 Service:
kubectl delete svc nginx-demo-svc
结果如下:
到此,基础的命令就这些,简单的了解用法即可,具体其它的可以使用 kubectl -h 查看!