资源管理
一、资源管理方式
1.命令式对象管理:直接使用命令去操作kubernetes资源
[root@master ~]# kubectl run nginx-pod --image=nginx --port=80 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/nginx-pod created |
2.命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
[root@master ~]# kubectl create -f nginx-pod.yaml |
3.声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
[root@master ~]# kubectl apply -f nginx-pod.yaml pod/nginx-pod created |
二、命令式对象管理
1.Kubectl命令:
Kubectl是kubernetes集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署,kubectl命令的语法如下:
# kubectl [command] [type] [name] [flags]
参数解析:
Comand:指定要对资源执行的操作,例如create 、get、delete
Type:指定资源类型,比如deployment、pod、service
Name:指定资源的名称,大小写敏感
Flags:制定额外的可选参数
#查看所有Pod [root@master ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-6867cdf567-qmxt5 1/1 Running 0 25h nginx-pod 1/1 Running 0 40m nginx-pod-77f84df46-fr452 1/1 Running 0 46m #查看nginx-pod [root@master ~]# kubectl get pod nginx-pod NAME READY STATUS RESTARTS AGE nginx-pod 1/1 Running 0 40m #查看nginx-pod,以yaml格式展示结果 [root@master ~]# kubectl get pod nginx-pod -o yaml |
2.资源类型
Kubernetes中所有的内容都抽象为资源,可通过下面命令进行查看
[root@master ~]# kubectl api-resources |
经常使用的资源有如下这些:
操作
Kubernetes允许对资源进行多种操作,可通过-help查看详细的操作命令
[root@master ~]# kubectl --help |
经常使用的操作有下面这些:
练习:
下面通过一个namespace/pod的创建和删除进行演示
#创建一个namespace [root@master ~]# kubectl create namespace dev namespace/dev created #获取namespace [root@master ~]# kubectl get ns NAME STATUS AGE default Active 26h dev Active 17s kube-node-lease Active 26h kube-public Active 26h kube-system Active 26h mem-example Active 74m #在此namespace下创建并运行一个nginx的pod [root@master ~]# kubectl run pod --image=nginx -n dev 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/pod created #查看新建的pod [root@master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-864f9875b9-fth8f 0/1 ContainerCreating 0 22s [root@master ~]# kubectl get pod -n dev NAME READY STATUS RESTARTS AGE pod-864f9875b9-fth8f 1/1 Running 0 36s #删除指定的pod [root@master ~]# kubectl delete pod pod-864f9875b9-fth8f pod “pod-864f9875b9-fth8f” deleted #删除指定的namespace [root@master ~]# kubectl delete ns dev namespace "dev" deleted |
三、命令式对象配置
命令式对象配置就是使用命令配合配置文件一起操作kubernetes资源
1.创建一个nginxpod.yaml,内容如下:
[root@master ~]# vi nginxpod.yaml apiVersion: v1 kind: Namespace metadata: name: dev --- apiVersion: v1 kind: Pod metadata: name: nginxpod namespace: dev spec: containers: - name: nginx-containers image: nginx:latest ~ |
2.执行create命令,创建资源
3.执行get命令,查看资源
[root@master ~]# kubectl get -f nginxpod.yaml NAME STATUS AGE namespace/dev Active 11h NAME READY STATUS RESTARTS AGE pod/nginxpod 1/1 Running 0 11h |
4.执行delete命令,删除资源
[root@master ~]# kubectl delete -f nginxpod.yaml namespace "dev" deleted pod "nginxpod" deleted |
四、声明式对象配置
[root@master ~]# kubectl apply -f nginxpod.yaml namespace/dev created pod/nginxpod created #当第一次执行该命令,发现成功创建资源 [root@master ~]# kubectl apply -f nginxpod.yaml namespace/dev unchanged pod/nginxpod unchanged #再次执行该命令,说资源没有变动 |
注:使用apply操作资源
若资源不存在,就会kubectl create 创建
若资源不存在,就会kubectl patch 更新
入门基础
一、Namespace
Namespace是kubernetes系统中的重要资源,作用是实现多套环境的资源隔离或者多租户的资源隔离
Kubernetes在集群启动之后,默认创建几个namespace
[root@master ~]# kubectl get namespace NAME STATUS AGE default Active 38h #所有未指定namespace的对象都会分配在该命名间 dev Active 8m31s kube-node-lease Active 38h #集群节点之间的心跳维护 kube-public Active 38h #此命名空间下的资源可以被所有人访问(未认证用户) kube-system Active 38h #所有由kubernetes系统创建的资源都处于该命名空间 mem-example Active 13h |
Namespace资源的具体操作
查看
1.查看所有的ns
[root@master ~]# kubectl get ns NAME STATUS AGE default Active 38h dev Active 8m51s kube-node-lease Active 38h kube-public Active 38h kube-system Active 38h mem-example Active 13h |
2.查看指定的ns
[root@master ~]# kubectl get ns dev NAME STATUS AGE dev Active 9m36s |
3.指定输出格式
命令:kubectl get ns ns名称 -o 格式参数(kubernetes支持的格式参数常见的有wide、json、yaml)
4.查看ns详情
[root@master ~]# kubectl describe ns dev Name: dev Labels: <none> Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"dev"}} Status: Active No resource quota. resource quota.:针对namespace做的资源限制 No LimitRange resource. LimitRange :针对namespace中的每个组件做的资源限制 |
5.创建
[root@master ~]# kubectl create ns ywj namespace/ywj created |
6.删除
[root@master ~]# kubectl delete ns ywj namespace "ywj" deleted |
7.配置方式
二、Pod
Pod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于pod中;pod可以认为是容器的封装,一个pod中可以存在一个或者多个容器
Kubernetes在集群启动之后,集群中的各个组件都是以pod方式运行的
1.创建并运行
#kubernetes没有提供单独运行pod的命令,都是通过pod控制器来实现的 #命令格式:kubectl run (pod控制器名称) [参数] #-image 指定pod的镜像 #-port 指定端口 #-namespace 指定namespace [root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --namespace dev 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/nginx created |
2.查看pod信息
(1)查看pod基本信息
[root@master ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginxpod 1/1 Running 0 37m |
(2)查看pod详细信息
3.访问pod
#获取pod的ip [root@master ~]# kubectl get pods -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginxpod 1/1 Running 0 38m 10.244.166.134 node1 <none> <none> #访问pod [root@master ~]# curl http://10.244.166.134:80 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> |
4.删除指定pod
删除指定pod [root@master ~]# kubectl delete pod nginxpod -n dev pod "nginxpod" deleted #虽然显示pod删除成功,但又产生了一个 [root@master ~]# kubectl get pods -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-dd6b5d745-vkcjw 1/1 Running 0 9s 10.244.166.136 node1 <none> <none> #这是因为当前pod是由pod控制器创建的,控制台会监视pod状况,一旦发现pod死亡,就会立即重建 #若想删除pod,必须删除pod控制器 #查询当前namespace下的pod控制器 [root@master ~]# kubectl get deploy -n dev NAME READY UP-TO-DATE AVAILABLE AGE nginx 1/1 1 1 4m32s #删除pod控制器 [root@master ~]# kubectl delete deploy nginx -n dev deployment.apps "nginx" deleted #再次查询pod,发现被删除了 [root@master ~]# kubectl get pods -n dev No resources found in dev namespace. |
5.配置操作
创建一个pod-nginx.yaml
然后就可以执行对应的创建和删除命令
三、Label
Label是kubernetes系统中的一个重要概念,作用就是在资源上添加标识,用来区分和选择
Label的特点:
一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
1.命令方式
#为pod资源打标签 [root@master ~]# kubectl label pod nginx version=1.0 -n dev pod/nginx labeled #为pod资源更新标签 [root@master ~]# kubectl label pod nginx version=2.0 -n dev --overwrite pod/nginx labeled #查看标签 [root@master ~]# kubectl get pod nginx -n dev --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 16m version=2.0 #筛选标签 [root@master ~]# kubectl get pod -n dev -l version=2.0 --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 18m version=2.0 [root@master ~]# kubectl get pod -n dev -l version!=2.0 --show-labels No resources found in dev namespace. #删除标签 [root@master ~]# kubectl label pod nginx version- -n dev pod/nginx labeled |
2.配置方式
四、Deployment
在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。
在kubernetes中Pod控制器的种类有很多,deployment是其中一种
1.命令操作
#命令格式: kubectl create deployment 名称 [参数]
#-image 指定pod的镜像
#-port 指定端口
#-replicas 指定创建pod数量
#-namespace 指定namespace
[root@master ~]# kubectl run nginx --image=nginx:latest --port=80 --replicas=3 -n dev 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/nginx created #查看创建的pod [root@master ~]# kubectl get pods -n dev NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 47m nginx-dd6b5d745-69hj9 1/1 Running 0 3m37s nginx-dd6b5d745-r5gb9 1/1 Running 0 3m37s nginx-dd6b5d745-z5mcr 1/1 Running 0 57s #查看deployment的信息 [root@master ~]# kubectl get deploy -n dev NAME READY UP-TO-DATE AVAILABLE AGE nginx 3/3 3 3 2m50s 注:#UP-TO-DATE:成功升级的副本数量 #AVAILABLE:可用副本的数量 [root@master ~]# kubectl get deploy -n dev -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx 3/3 3 3 5m17s nginx nginx:latest run=nginx |
查看deployment的详细信息
删除
[root@master ~]# kubectl delete deploy nginx -n dev deployment.apps "nginx" deleted |
2.配置操作
创建一个deploy-nginx.yanl文件
五、Service
虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:
(1)Pod IP 会随着Pod的重建产生变化
(2)Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
1.创建集群内部可访问的Service
#暴露Service [root@master ~]# kubectl expose deploy nginx --name=svc-nginx1 --type=ClusterIP --port=80 --target-port=80 -n dev service/svc-nginx1 exposed #查看Service [root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx1 ClusterIP 10.100.104.101 <none> 80/TCP 31s run=nginx |
上面产生一个Cluster-IP,这就是Service的IP,在Service的生命周期中,这个地址不会变
可以通过这个IP访问Service对应的pod
2.创建集群外部可访问的Service
[root@master ~]# kubectl expose deploy nginx --name=svc-nginx2 --type=NodePort --port=80 --target-port=80 service/svc-nginx2 exposed [root@master ~]# kubectl get svc svc-nginx1 -n dev -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR svc-nginx2 NodePort 10.100.94.0 <none> 80/31928/TCP 9s run=nginx |
在电脑主机上通过浏览器访问下面地址
3.删除Service
[root@master ~]# kubectl delete svc svc-nginx1 -n dev service "svc-nginx1" deleted |
4.配置方式
创建一个svc-nginx.yaml