namespace的中文名称是命名空间。 你可以认为namespaces是你kubernetes集群中的虚拟化集群。在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。 可以为你提供组织,安全甚至性能方面的帮助!
namespace是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(默认是default),而node, persistentVolumes等则不属于任何namespace。
大多数的Kubernetes中的集群默认会有一个叫default的namespace。实际上,应该是4个:
1,default:你的资源默认被创建于default命名空间。
2,kube-system:kubernetes系统组件使用。
3,kube-node-lease: kubernetes集群节点租约状态,v1.13加入
4,kube-public:公共资源使用。但实际上现在并不常用。
这个默认(default)的namespace并没什么特别,但你不能删除它。这很适合刚刚开始使用kubernetes和一些小的产品系统。但不建议应用于大型生产系统。因为,这种复杂系统中,团队会非常容易意外地或者无意识地重写或者中断其他服务service。相反,请创建多个命名空间来把你的service(服务)分割成更容易管理的块。
作用:多租户情况下,实现资源隔离:属于逻辑隔离;属于管理边界;不属于网络边界;可以针对每个namespace做资源配额。
#查看命名空间全拼
[root@k8s-master ~]# kubectl get namespaces
#查看命名空间简写
[root@k8s-master ~]# kubectl get ns
查看命名空间下面的pod:
[root@k8s-master ~]# kubectl get pod --all-namespaces
[root@k8s-master ~]# kubectl get pod -A
默认的命名空间有如下:
default 用户创建的pod默认在此命名空间
kube-public 所有用户均可以访问,包括未认证用户
kube-node-lease kubernetes集群节点租约状态,v1.13加入
kube-system kubernetes集群在使用
[root@k8s-master ~]# kubectl create namespace dream21th-one
namespace/dream21th-one created
[root@k8s-master ~]# kubectl create ns dream21th-two
namespace/dream21th-two created
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 118d
dream21th-one Active 49s
dream21th-two Active 30s
kube-node-lease Active 118d
kube-public Active 118d
kube-system Active 118d
[root@k8s-master ~]# kubectl delete namespace dream21th-one
namespace "dream21th-one" deleted
[root@k8s-master ~]# kubectl delete ns dream21th-two
namespace "dream21th-two" deleted
[root@k8s-master ~]# kubectl get ns
NAME STATUS AGE
default Active 118d
kube-node-lease Active 118d
kube-public Active 118d
kube-system Active 118d
Pod是kubernetes集群能够调度的最小单元。Pod是容器的封装 。 在Kubernetes集群中,Pod是所有业务类型的基础,也是K8S管理的最小单位级,它是一个或多个容器的组合。这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同
一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。
网络:每一个Pod都会被指派一个唯一的Ip地址,在Pod中的每一个容器共享网络命名空间,包括Ip地址和网络端口。在同一个Pod中的容器可以和localhost进行互相通信。当Pod中的容器需要与Pod外的实体进行通信时,则需要通过端口等共享的网络资源。
存储:Pod能够被指定共享存储卷的集合,在Pod中所有的容器能够访问共享存储卷,允许这些容器共享数据。存储卷也允许在一个Pod持久化数据,以防止其中的容器需要被重启。
K8s一般不直接创建Pod。 而是通过控制器和模版配置来管理和调度在Pod中的容器可能会由于异常等原因导致其终止退出,kubernetes提供了重启策略以重启容器。重启策略对同一个Pod的所有容器起作用,容器的重启由Node上的kubelet执行。Pod支持三种重启策略,在配置文件中通过restartPolicy字段设置重启策略(注意,这里的重启是指在Pod的宿主Node上进行本地重启,而不是调度到其它Node上):
1,Always:只要退出就会重启;
2,OnFailure:只有在失败退出(exit code不等于0)时,才会重启;
3,Never:只要退出,就不再重启。
Kubernetes通过cgroups限制容器的CPU和内存等计算资源,包括requests(请求,调度器保证调度到资源充足的Node上)和limits(上限)等。
#查看default命名空间下的pods
[root@k8s-master ~]# kubectl get pods
No resources found in default namespace.
#查看kube-system命名空间下的pods
[root@k8s-master ~]# kubectl get pods -n kube-system
#查看所有命名空间下的pods
[root@k8s-master ~]# kubectl get pod --all-namespaces
[root@k8s-master ~]# kubectl get pod -A
下载镜像:
[root@k8s-master ~]# docker pull tomcat:9.0.20-jre8-alpine
运行pod:
#在default命名空间中创建一个pod副本的deployment
[root@k8s-master ~]# kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/tomcat9-test created
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat9-test-569b5bf455-9bvzs 1/1 Running 0 14s
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat9-test-569b5bf455-9bvzs 1/1 Running 0 22s 10.244.2.3 k8s-work2 <none> <none>
#使用pod的IP访问容器
[root@k8s-master ~]# curl 10.244.2.3:8080
# 扩容成3个
[root@k8s-master ~]# kubectl scale --replicas=3 deployment/tomcat9-test
deployment.apps/tomcat9-test scaled
# 查看pod
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
tomcat9-test-569b5bf455-9bvzs 1/1 Running 0 4m17s
tomcat9-test-569b5bf455-s826c 0/1 ContainerCreating 0 5s
tomcat9-test-569b5bf455-zx4zk 0/1 ContainerCreating 0 5s
[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tomcat9-test-569b5bf455-9bvzs 1/1 Running 0 4m22s 10.244.2.3 k8s-work2 <none> <none>
tomcat9-test-569b5bf455-s826c 1/1 Running 0 10s 10.244.1.5 k8s-work1 <none> <none>
tomcat9-test-569b5bf455-zx4zk 1/1 Running 0 10s 10.244.1.4 k8s-work1 <none> <none>
#查看部署
[root@k8s-master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
tomcat9-test 3/3 3 3 4m40s
[root@k8s-master ~]# kubectl get deployment -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
tomcat9-test 3/3 3 3 4m52s tomcat9-test tomcat:9.0.20-jre8-alpine run=tomcat9-test
[root@k8s-master ~]# curl 10.244.2.3:8080
[root@k8s-master ~]# kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort
service/tomcat9-svc exposed
[root@k8s-master ~]# kubtck get pod
-bash: kubtck: 未找到命令
[root@k8s-master ~]# kubtck get pods
-bash: kubtck: 未找到命令
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat9-test-569b5bf455-9bvzs 1/1 Running 0 16m
tomcat9-test-569b5bf455-s826c 1/1 Running 0 12m
tomcat9-test-569b5bf455-zx4zk 1/1 Running 0 12m
[root@k8s-master ~]# kubtck get svc
-bash: kubtck: 未找到命令
[root@k8s-master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 118d
tomcat9-svc NodePort 10.96.33.14 <none> 8888:30286/TCP 40s
[root@k8s-master ~]# curl 10.96.33.14:8888
在浏览器上面访问http://192.168.43.103:30286/也可以正常访问。
kubectl get:列出一个或多个资源。
#查看集群状态信息
[root@k8s-master ~]# kubectl cluster-info
[root@k8s-master ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true"}
#查看集群节点信息
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 118d v1.17.5
k8s-work1 Ready <none> 118d v1.17.5
k8s-work2 Ready <none> 118d v1.17.5
# 查看集群命名空间
[root@k8s-master ~]# kubectl get ns
# 查看指定命名空间的服务
[root@k8s-master ~]# kubectl get svc -n kube-system
# 以纯文本输出格式列出所有 pod。
[root@k8s-master ~]# kubectl get pods
# 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。
[root@k8s-master ~]# kubectl get pods -o wide
# 以纯文本输出格式列出所有副本控制器和服务。
[root@k8s-master ~]# kubectl get rc,services
#列出在节点 server01 上运行的所有 pod
[root@k8s-master ~]# kubectl get pods --field-selector=spec.nodeName=k9s-master
kubectl describe - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。
[root@k8s-master ~]# kubectl describe nodes k8s-master
[root@k8s-master ~]# kubectl describe pods tomcat9-test-569b5bf455-9bvzs
kubectl 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
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
kubectl logs - 打印 Pod 中容器的日志。
# 从 pod 返回日志快照。
kubectl logs <pod-name>
# 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>
[root@k8s-master ~]# kubectl get pod tomcat9-test-569b5bf455-9bvzs -o yaml
强制删除一个pod
--force --grace-period=0