Kubernetes 实战之命令行
1. NameSpace
中文名称:命名空间。 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性能方面的帮助!
Namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:
- default:你的资源默认被创建于default命名空间。
- kube-system:kubernetes系统组件使用。
- kube-node-lease: kubernetes集群节点租约状态,v1.13加入
- kube-public:公共资源使用。但实际上现在并不常用。
这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的service(服务)分割成更容易管理的块
作用:
多租户情况下,实现资源隔离
属于逻辑隔离
属于管理边界
不属于网络边界
可以针对每个namespace做资源配额
1.1 查看命令空间
kubectl get namespacs 简写: kubectl get ns
#查看所有命名空间的pod资源
kubectl get pod --all-namespaces
kubectl get pod -A
我们看到刚初始化的只有系统命名空间组件 kube-system
说明:
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态,v1.13加入
kube-system kubernetes集群在使用
1.2 创建NameSpace
kubectl create namespace qiang001
简写:
kubectl create ns qiang001
1.3 删除NameSpace
kubectl delete namespace qiang001
简写命令
kubectl delete ns qiang001
2. Pod
2.1 简介
Pod是kubernetes集群能够调度的最小单元。Pod是容器的封装 。
在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。
这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。
-
2个必知道的特点
-
网络
每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口。在同一个Pod中的容器可以和localhost进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。
-
存储
Pod能够被指定共享存储卷的集合,在pod中所有的容器能够访问并共享存储卷,允许这些容器共享数据。存储卷也允许在一个pod持久化数据,以防止其中的容器需要被重启。
-
-
工作方式
K8s一般不直接创建Pod。 而是通过控制器和模版配置来管理和调度
-
pod模板: 后面再说
-
pod重启:
在Pod中的容器可能会由于异常等原因导致其终止退出,Kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略
1. Always:只要退出就会重启。 2. OnFailure:只有在失败退出(exit code不等于0)时,才会重启。 3. Never:只要退出,就不再重启
注意,这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上
-
资源限制:Kubernetes通过cgroups限制容器的CPU和内存等计算资源源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等。
-
2.2 查看pod
#查看default命名空间下的pods
kubectl get pods
#查看kube-system命名空间下的pods
kubectl get pods -n kube-system
#查看所有命名空间下的pods
kubectl get pod --all-namespaces
kubectl get pod -A
2.3 创建pod
-
下载镜像
#在每个节点都下载以下镜像: 选择不同基础镜像,镜像大小也不同 docker pull tomcat:9.0.20-jre8-alpine 108MB docker pull tomcat:9.0.37-jdk8-openjdk-slim 305MB docker pull tomcat:9.0.37-jdk8 531MB
-
运行pod
#在default命名空间中创建一个pod副本的deployment kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080 kubectl get pod kubectl get pod -o wide #使用pod的IP访问容器 crul ***:8080
2.4 扩容
#将副本扩容至5个
kubectl scale --replicas=5 deployment tomcat9-test
kubectl get deployment -o wide
:
kubectl get pod -o wide
:
我们发现每一个pod都分配了独立的ip地址, 同一个node的pod都在同一个网段
可以通过curl ip:8080的方式访问
但如何通过宿主机访问呢?看下面的服务
2.5 创建服务
pod 由deployment管理, 通过service对外提供服务
kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort
--port=8888 是集群内部服务间调用端口
--target-port=8080 容器的端口(最终的流量端口),如tomcat集群端口是8080
--type=NodePort 是相当于指定外部流量访问集群,如果不指定端口, 会在创建完后随机生成一个访问端口,
默认端口范围: 30000-32767
通过--service-node-port-range=20000-22767 修改默认范围
kubectl get svc 或 kubectl get svc -o wide
: 查看service如下,发现生成的对外端口为30646
小插曲:启动服务后,发现不能访问,master节点通过curl ip:8080也不能访问,即我的3台k8s集群服务器之间pod不能互相通信,因为我用的是华为云服务器,采用了白名单和端口限制,于是就重新配置了白名单ip网段和端口号,这时候,需要重新初始化k8s集群,初始化前需要在每一台节点执行kubeadm reset
, 执行完以后,再按前面的初始化步骤进行(注意不能落掉步骤)。
但是。。。。。。发现还是不行,各种查阅资料,仍解决不了,初入k8s的坑,网上的情况各种五花八门,不过好一点的是,借此机会熟悉了一下k8s的网络模型。 想放弃了。。。,后来重新装系统,重新配置,发现仅仅是因为端口类型只开放了TCP协议,哎。。。,想实践的话还是建议用虚拟机,完全关闭防火墙再操作。
2.6 kubectl常用命令
2.6.1 语法规则
kubectl [command] [TYPE] [NAME] [flags]
-
command: 指定要对一个或多个资源执行的操作,例如 create 、 get 、 describe 、 delete
-
type: 指定资源类型。资源类型不区分大小写,可以指定单数、复数或缩写形式
kubectl get pod pod1 kubectl get pods pod1 kubectl get po pod1
-
name: 指定资源的名称。名称区分大小写。如果省略名称,则显示所有资源的详细信息
在对多个资源执行操作时,您可以按类型和名称指定每个资源,或指定一个或多个文件
-
要按类型和名称指定资源:
要对所有类型相同的资源进行分组,请执行以下操作: TYPE1 name1 name2..
如:
kubectl get pod example-pod1 example-pod2
分别指定多个资源类型: TYPE1/name1 TYPE1/name2 TYPE2/name3.. 如:
kubectl get pod/example-pod1 replicationcontroller/example-rc1
-
用一个或多个文件指定资源: -f file1 -f file2 -f file<#>
如:
kubectl get pod -f ./pod.yaml
-
-
flags: 指定可选的参数。例如,可以使用 -s 或 -server 参数指定 Kubernetes API 服务器的地址和端口
2.6.2 get命令
列出一个或多个资源
# 查看集群状态信息
kubectl cluster-info
# 查看集群状态
kubectl get cs
# 查看集群节点信息
kubectl get nodes
# 查看集群命名空间
kubectl get ns
# 查看指定命名空间的服务
kubectl get svc -n kube-system
# 以纯文本输出格式列出所有 pod。
kubectl get pods
# 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
kubectl get pods -o wide
# 以纯文本输出格式列出具有指定名称的副本控制器。提示:您可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>
# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services
# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized
# 列出在节点 server01 上运行的所有 pod
kubectl get pods --field-selector=spec.nodeName=server01
2.6.3 describe命令
显示一个或多个资源的详细状态,默认情况下包括未初始化的资源
# 显示名称为 <node-name> 的节点的详细信息。
kubectl describe nodes <node-name>
# 显示名为 <pod-name> 的 pod 的详细信息。
kubectl describe pods/<pod-name>
# 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。
# 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。
kubectl describe pods <rc-name>
# 描述所有的 pod,不包括未初始化的 pod
kubectl describe pods --include-uninitialized=false
说明: kubectl get 命令通常用于检索同一资源类型的一个或多个资源。 它具有丰富的参数,允许您使用 -o 或 –output 参数自定义输出格式。您可以指定 -w 或 –watch 参数以开始观察特定对象的更新。 kubectl describe 命令更侧重于描述指定资源的许多相关方面。它可以调用对 API 服务器 的多个 API 调用来为用户构建视图。 例如,该 kubectl describe node 命令不仅检索有关节点的信息,还检索在其上运行的 pod 的摘要,为节点生成的事件等。
2.6.4 delete命令
从文件、stdin 或指定标签选择器、名称、资源选择器或资源中删除资源
# 使用 pod.yaml 文件中指定的类型和名称删除 pod。
kubectl delete -f pod.yaml
# 删除标签名= <label-name> 的所有 pod 和服务。
kubectl delete pods,services -l name=<label-name>
# 删除所有具有标签名称= <label-name> 的 pod 和服务,包括未初始化的那些。
kubectl delete pods,services -l name=<label-name> --include-uninitialized
# 删除所有 pod,包括未初始化的 pod。
kubectl delete pods --all
2.6.5 进入容器命令
kubectl exec
对 pod 中的容器执行命令。与docker的exec命令非常类似
# 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> date
# 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。
kubectl exec <pod-name> -c <container-name> date
# 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。
kubectl exec -ti <pod-name> /bin/bash
2.6.6 logs命令
打印 Pod 中容器的日志。
# 从 pod 返回日志快照。
kubectl logs <pod-name>
# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
2.6.7 格式化输出
# 将pod信息格式化输出到一个yaml文件
kubectl get pod web-pod-13je7 -o yaml
2.6.8 强制删除pod
# 强制删除一个pod
--force --grace-period=0
2.7 资源缩写
资源名 | 缩写 | API分组 | 按命名空间 | 资源类型 |
---|---|---|---|---|
configmaps | cm | true | ConfifigMap | |
namespaces | ns | false | Namespace | |
nodes | no | false | Node | |
persistentvolumeclaims | pvc | true | PersistentVolumeClaim | |
persistentvolumes | pv | false | PersistentVolume | |
pods | po | true | Pod | |
secrets | true | Secret | ||
serviceaccounts | sa | true | ServiceAccount | |
services | svc | true | Service | |
daemonsets | ds | apps | true | DaemonSet |
deployments | deploy | apps | true | Deployment |
statefulsets | sts | apps | true | StatefulSet |
horizontalpodautoscalers | hpa | autoscaling | true | HorizontalPodAutoscaler |
cronjobs | cj | batch | true | CronJob |
jobs | batch | true | Job | |
ingresses | ing | extensions | true | Ingress |
poddisruptionbudgets | pdb | policy | true | PodDisruptionBudget |
clusterrolebindings | rbac.authorization.k8s.io | false | ClusterRoleBinding | |
clusterroles | rbac.authorization.k8s.io | false | ClusterRole | |
rolebindings | rbac.authorization.k8s.io | true | RoleBinding | |
roles | rbac.authorization.k8s.io | true | Role | |
storageclasses | storage.k8s.io | false | StorageClass |