k8s命令行
k8s入门命令行
命令行
NameSpace
顾名思义成为“命名空间”,在一个k8s集群中可以拥有多个命名空间,在逻辑上彼此隔离。
namespace是一组资源和抽象的集合,可以用系统内部对象划分不同的项目组或用户组。常见的pods,services,replication,controllers,deployments等都是属于某一个namespace的(默认为default)
而node,persistentVolumes等则不属于任何namespace。
k8s中自带的namespace:
- default:资源默认被创建的命名空间
- kube-system:k8s组件使用
- kube-node-lease:k8s集群中的租约状态(v1.13加入)
- kube-public:公共资源使用
默认是default的namespace并不能删除。创建多个namespace容易将服务分割成容易管理的块。
作用:
- 多租户的情况下,实现资源隔离
- 属于逻辑隔离
- 属于管理边界
- 可以针对每一个namespace做到资源分配
#查看所有namespace
kubectl get namespace
#查询集群中的所有pod,带有namespace
kubectl get pods --all-namespaces
kubectl get pod -A
#查看所有namespace,简写命令
kubectl get ns
#创建namespace
kubectl create namespace zoro
#创建namespace,简写
kubectl create ns zoro
#删除namespace
kubectl delete namespace zoro
#删除namespace,简写
kubectl delete ns zoro
Pod
pod是kubernetes中的最小单位,pod是容器的封装,是所有业务类型的基础。pod是通过deployment控制器来管理的
pod可以由一个或多个容器组合,这些容器共享存储、网络和命名空间以及如何运行规范。所有容器都是统一安排和调度,并运行在共享上下文中。相对具体的应用而言,pod是它们的逻辑主机,pod包括业务中相关的多个应用容器。
pod的特点:
- 网络
每一个pod都会被指派一个唯一的ip,在pod中每一个容器共享网络的命名空间,包括ip地址和端口。当pod中中的容器需要与外部的实体进行通信时,则需要通过端口等共享网络资源。
- 存储
pod能够被指定共享存储卷的集合,在pod所有的容器都能访问共享的存储卷,允许这些容器共享数据。存储卷也允许在一个pod中持久化数据,以防止其中的容器被重启。
pod的工作方式
k8s通过控制器和模版配置来管理和调度。
- pod模版
- pod重启
在pod中容器可能由于异常等原因导致其终止退出。
pod支持3种重启策略:
- Always:只要退出就会重启
- OnFailure:只要在失败退出时(exit code不等于0),才会重启
- Never:只要退出,就不再重启
上述策略可在配置文件中通过restartPolicy进行配置重启策略。
重启策略对同一个pod的所有容器起作用,容器的重启由node上的kubelet进行执行。
- 资源限制
k8s是通过cgroups限制容器的cpu和内存等计算资源,包括requests(调度器保证请求能调度到资源充足的node上)和 limits 等。
#运行pod,这里的image是基于docker的镜像
#kubectl run deployment控制器名称 --image=docker镜像 --port=端口
kubectl run tomcat9-test --image=tomcat:9.0.20-jre8-alpine --port=8080
#查看pod
kubectl get pod
#查看pod,更加详细的信息
kubectl get pod -o wide
#查看deployment控制器,pod是通过deployment控制器来管理的
kubectl get deployment
#查看deployment控制器详情
kubectl get deployment -o wide
#删除deployment控制器
#kubectl delete deployment.apps 控制器name
kubectl delete deployment.apps tomcat9-test
#扩容
#kubectl scale --replicas=10 deployment deployment的name
kubectl scale --replicas=10 deployment tomcat9-test
deployment上有一层service,它的作用是给集群外的一些地址进行服务,集群外的就可以通过service来访问pod里的容器了。
#创建服务
#kubectl expose deployment deloyment的name --name=定义service的name --port=service对集群内其他的应用暴露端口 --target-port=pod内的目标端口 --protocol=TCP --type=NodePort
#使用NodePort方式能让集群外的应用进行访问
kubectl expose deployment tomcat9-test --name=tomcat9-svc --port=8888 --target-port=8080 --protocol=TCP --type=NodePort
#查看service
kubectl get service
#查看service,简写
kubectl get svc
常用命令
语法:kubectl [command][TYPE][NAME][flags]
#查看集群状态信息
kubectl cluster-info
#查看运行的状态
kubectl get cs
#查看节点运行状态
kubectl get nodes
#查看命名空间
kubectl get namespace
#查看service
kubectl get service
#查看namespace为kube-system下的service
kubectl get svc -n kube-system
#显示一个或多个资源的详细状态
kubectl describe [type][name]
#删除所有pod
kubectl delete pod --all
#进入容器
kubectl exec -it pod的name sh
#查看日志
kubectl logs -f pod的name
#查看模版信息, 将pod信息格式化输出到一个yaml文件
kubectl get pod pod的name -o yaml
#强制删除
kubectl delete pod pod的name --force--grace-period=0
资源缩写
使用资源文件
1.创建namespace
创建一个namespace-test.yml文件上传到服务器
apiVersion: v1
kind: Namespace
metadata:
name: xiaofei
#执行namespace-test.yml文件
kubectl apply -f namespace-test.yml
查看执行结果
#删除
kubectl delete -f namespace-test.yml
2.创建pod
创建一个pod-test.yml文件上传到服务器
apiVersion: v1
kind: Pod
metadata:
name: tomcat-pod
labels:
app: tomcat-pod
spec:
containers:
- name: mytest
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
镜像下载策略(imagePullPolicy)
- Always:总是拉取 pull
- IfNotPresent:如果本地有镜像,使用本地,如果本地没有镜像,下载镜像
- Never:只使用本地镜像,从不拉取
#执行文件创建pod
kubectl apply -f pod-test.yml
结果
注:通过资源文件创建的pod是不会创建deployment控制器的,所有删除只有没有控制器再次拉起。
#删除
kubectl delete -f pod-test.yml
3.创建deployment
创建一个tomcat-deployment.yml文件上传到服务器
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat-deployment
spec:
replicas: 1
template:
metadata:
name: tomcat-deployment
labels:
app: tomcat-pod
spec:
containers:
- name: tomcat-deployment
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
restartPolicy: Always
selector:
matchLabels:
app: tomcat-pod
注:在deployment资源文件中必须写matchLabels,而它又与template.labels是对应的
#执行文件创建deployment
kubectl apply -f tomcat-deployment.yml
结果
#删除deployment
kubectl delete -f tomcat-deployment.yml
控制器类型
4.创建Service
创建一个tomcat-service.yml文件上传到服务器
多个资源用“—”进行分隔
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
labels:
app: tomcat-deploy
spec:
replicas: 1
template:
metadata:
name: tomcat-deploy
labels:
app: tomcat-pod
spec:
containers:
- name: tomcat-deploy
image: tomcat:9.0.20-jre8-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Always
selector:
matchLabels:
app: tomcat-pod
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
spec:
selector:
#标签选择必须是template.labels.app对应
app: tomcat-pod
ports:
- port: 8888 #对集群内其他服务暴露的端口号
targetPort: 8080
nodePort: 30088
type: NodePort
service类型(spec.type)
- ClusterIP:默认,分配一个集群内部可以访问的虚拟IP
- NodePort:在每个Node上分配一个端口作为外部访问入口
- LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
- ExternalName:表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务 进行通信
service参数
- port :访问service使用的端口
- targetPort :Pod中容器端口
- nodePort: 通过Node实现外网用户访问k8s集群内service(30000-32767)
#执行tomcat-service.yml文件
kubectl apply -f tomcat-service.yml
结果
上图可以看到tomcat部署在node1的节点上,但如下图通过访问不同节点的ip都能访问到tomcat,这因为k8s内部的负载均衡的原因。
更多推荐
所有评论(0)