123 | kubectl get namespace#或者kubectl get ns |
---|
名字 | 说明 |
---|---|
default | 用户创建的pod默认在此命名空间 |
kube-public | 所有用户均可以访问,包括未认证用户 |
kube-node-lease | 集群节点租约状态,v1.13加入 |
kube-system | kubernetes集群系统内部使用的命名空间 |
通过kubectl命令行创建
1 | kubectl create namespace test #创建test命名空间 |
---|
通过应用资源清单文件创建:
准备资源清单文件01-create-ns.yaml
1234 | apiVersion: v1kind: Namespacemetadata: name: test2 |
---|
应用资源清单文件
1 | kubectl apply -f 01-create-ns.yaml |
---|
通过kubectl命令行删除
1 | kubectl delete namespace test #删除test命名空间 |
---|
通过应用资源清单文件删除(使用和创建同样的资源文件):
1 | kubectl delete -f 01-create-ns.yaml |
---|
Pod是容器的封装,也是kubernetes集群能够调度的最小单元。
123456 | #查看default命名空间中的Pod,pod和pods效果一样kubectl get podkubectl get pods#查看kube-system命名空间中的Podkubectl get pods --namespace kube-systemkubectl get pod -n kube-system |
---|
由于网络原因,建议提前准备好容器镜像。本示例使用nginx:latest
容器镜像。
编写用于创建Pod资源清单文件02-create-pod.yaml
1234567891011 | apiVersion: v1kind: Podmetadata: name: pod1spec: containers: - name: nginx-pod image: nginx:latest ports: -name: nginxport containerPort: 80 |
---|
应用用于创建Pod资源清单文件
1 | kubectl apply -f 02-create-pod.yaml |
---|
12 | kubectl get pods -o wide #查看pod更加详细信息curl http://172.16.1.2 #直接访问pod的地址 |
---|
12 | kubectl delete pods pod1 #命令行删除kubectl delete -f 02-create-pod.yaml #使用Pod资源清单文件删除 |
---|
Controller(控制器),用于在k8s集群中以loop方式监视Pod状态,如果其发现Pod被删除,将会重新拉起一个Pod,以让Pod一直保持在用户期望状态。 常见Pod控制器:
控制器名称 | 作用 |
---|---|
Deployment | 声明式更新控制器,用于发布无状态应用 |
ReplicaSet | 副本集控制器,用于对Pod进行副本规模扩大或剪裁 |
StatefulSet | 有状态副本集,用于发布有状态应用 |
DaemonSet | 在k8s集群每一个Node上运行一个副本,用于发布监控或日志收集类等应用 |
Job | 运行一次性作业任务 |
CronJob | 运行周期性作业任务 |
Deployment
包含ReplicaSet
,除非需要自定义升级功能或者根本不需要升级Pod
,否则还是建议使用Deployment而不直接使用ReplicaSet
。命令行创建:
123456 | kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=2# 说明:# nginx-app 是deployment控制器类型的应用名称# nginx:latest 是应用运行的Pod中的Container所使用的镜像# IfNotPresent 是Container容器镜像下载策略,如果本地有镜像,使用本地,如果本地没有镜像,下载镜像# --replicas=2 是指应用运行的Pod共计2个副本,这是用户的期望值,Deployment控制器中的ReplicaSet控制器会一直监控此应用运行的Pod副本状态,如果数量达不到用户期望,就会重新拉起一个新的Pod,会让Pod数量一直维持在用户期望值数量 |
---|
查看控制器:
1234567891011 | #查看Deployment控制器类型应用kubectl get deployment.apps#查看ReplicaSet控制器类型kubectl get replicaset#查看Pod状态kubectl get pods#查看Pod状态,显示更宽泛信息kubectl get pods -o wide#访问Podcurl http://172.16.xxx.xxcurl http://172.16.xxx.xx |
---|
通过资源清单文件创建,编写用于创建Deployment控制器类型应用资源清单03-creat-deployment-app.yaml
12345678910111213141516171819202122 | apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-apps labels: app: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginxapp image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 |
---|
应用创建Deployment控制器类型应用资源清单
12345 | kubectl apply -f 03-creat-deployment-app.yaml#查看Deployment控制器类型应用kubectl get deployment.apps#查看ReplicaSet控制器类型应用kubectl get replicaset.apps |
---|
带有控制器类型的Pod不能随便删除,如果必须删除,请删除控制器类型的应用名称。
1234 | #通过kubectl命令行删除kubectl delete deployment.apps nginx-app#通过kubectl应用资源清单文件删除kubectl delete -f 03-creat-deployment-app.yaml |
---|
Pod的状态不是人为控制的,Pod IP是在创建时分配的,如果在Pod被误删除,被Controller重新拉起一个新的Pod时,Pod IP地址是变化着的,如果访问必Pod则必须更换IP地址。这样对于大量的Pod运行应用来说,无法对Pod进行控制,因此在k8s集群中引入另一个概念Service
。
Service
不是实体服务,是一条iptables
或ipvs
的转发规则。
通过Service
为Pod
客户端提供访问Pod
方法,即客户端访问Pod
入口,Service
通过Pod
标签与Pod
进行关联。
类型 | 说明 |
---|---|
ClusterIP | 默认,分配一个集群内部可以访问的虚拟IP |
NodePort | 在每个Node上分配一个端口作为外部访问入口 |
LoadBalancer | 工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack |
ExternalName | 表示把集群外部的服务引入到集群内部中来,即实现了集群内部pod和集群外部的服务进行通信 |
参数 | 说明 |
---|---|
port | 访问Service使用的端口 |
targetPort | Pod中容器端口 |
NodePort | 通过Node实现外网用户访问k8s集群内Service(30000-32767) |
通过命令行创建:
1234567891011 | #创建Deployment类型应用kubectl run nginx-app --image=nginx:latest --image-pull-policy=IfNotPresent --replicas=1#创建Service与Deployment类型应用关联kubectl expose deployment.apps nginx-app --type=ClusterIP --target-port=80 --port=80# 说明:# expose 创建service# deployment.apps 控制器类型# nginx-app 应用名称,也是service名称# --type=ClusterIP 指定service类型# --target-port=80 指定Pod中容器端口 # --port=80 指定service端口 |
---|
访问Service以实现访问Pod目的:
1234 | # 查看Service创建情况kubectl get service# 访问Servicecurl http://10.109.21.171 |
---|
通过资源清单YAML文件创建,编写用于创建ClusterIP
类型Service资源清单文件create-deployment-service-clusterip.yaml
123456789101112131415161718192021222324252627282930313233343536 | apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-apps labels: app: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginxapp image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1kind: Servicemetadata: name: nginx-appsspec: type: ClusterIP selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 |
---|
应用用于创建Service资源清单文件
1 | kubectl apply -f create-deployment-service-clusterip.yaml |
---|
基于资源清单YAML文件创建NodePort
类型Service,create-deployment-service-nodeport.yaml
12345678910111213141516171819202122232425262728293031323334353637 | apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-apps labels: app: nginxspec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginxapp image: nginx:latest imagePullPolicy: IfNotPresent ports: - containerPort: 80 --- apiVersion: v1kind: Servicemetadata: name: nginx-appsspec: type: NodePort selector: app: nginx ports: - protocol: TCP nodePort: 30001 port: 80 targetPort: 80 |
---|
验证资源对象创建情况
1234 | #查看service创建kubectl get service#查看k8s集群所有主机30001端口侦听状态ss -anput | grep ":30001" |
---|
在k8s集群外访问Service,在物理机浏览器中访问即可验证。
1234 | #命令行删除kubectl delete service nginx-app#通过资源清单YAML文件删除kubectl delete -f create-deployment-service-clusterip.yaml |
---|