k8s系列学习
一、k8s介绍
一个k8s集群有master和node节点组成,每个节点需要安装对应的组件
master节点:
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
node节点:
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
Master:集群控制节点,
Node:工作负载节点,主要跑pod
Pod:k8s的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,有多种不同类型的控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
二、k8s资源管理方式
命令式对象管理 kubectl run nginx-pod --image=nginx 命令式对象配置 kubectl create/patch -f nginx.yaml 声明式对象配置 kubectl apply -f nginx.yaml
2.1命令式对象管理
通过kubectl命令行进行操作,语法如下 kubectl [command] [type] [name] [flags] comand:指定要对资源执行的操作,例如create、get、delete type:指定资源类型,比如deployment、pod、service name:指定资源的名称,名称大小写敏感 flags:指定额外的可选参数 例如: kubectl get pod kubectl get pod nginx-54f4c6f758-c52nk kubectl get pod nginx-54f4c6f758-c52nk -o yaml
kubernetes中所有的内容都抽象为资源,可以通过下面的命令进行查看:
kubectl api-resources
常用的命令可以通过kubectl --help查看
常用的有:create/edit/get/patch/delete/explain/run/describe/logs/apply
三、Namespace
Namespace是k8s系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。
查看名称空间 kubectl get ns #查看所有 集群启动后会默认创建一些ns NAME STATUS AGE default Active 45h # 所有未指定Namespace的对象都会被分配在default命名空间 kube-node-lease Active 45h # 集群节点之间的心跳维护 kube-public Active 45h # 此命名空间下的资源可以被所有人访问(包括未认证用户) kube-system Active 45h # 所有由Kubernetes系统创建的资源都处于这个命名空间 kubectl get ns default #查看指定 kubectl get ns default -o yaml #指定输出格式 wide、json、yaml kubectl describe ns default #查看详细信息 Name: default Labels: <none> Annotations: <none> Status: Active # Active 命名空间正在使用中 Terminating 正在删除命名空间 # ResourceQuota 针对namespace做的资源限制 # LimitRange针对namespace中的每个组件做的资源限制 No resource quota. No LimitRange resource.
创建 [root@~]# kubectl create ns test namespace/test created [root@ ~]# kubectl get ns test NAME STATUS AGE test Active 9s 删除 [root@ ~]# kubectl delete ns test namespace "test" deleted 通过yaml文件方式创建及删除 [root@ test]# cat ns-test.yaml apiVersion: v1 kind: Namespace metadata: name: test [root@ test]# kubectl create -f ns-test.yaml namespace/test created [root@ test]# kubectl get ns test NAME STATUS AGE test Active 13s [root@ test]# kubectl delete -f ns-test.yaml namespace "test" deleted [root@sjz002006 test]# kubectl get ns test Error from server (NotFound): namespaces "test" not found
四、pod
pod是K8s中最小调度单元,容器必须在pod中,一个pod里可以有一个或多个容器
k8s在集群启动之后,集群中的各个组件也都是以Pod方式运行的。可以通过下面命令查看: root@ test]# kubectl get pod -n kube-system NAME READY STATUS RESTARTS AGE calico-kube-controllers-867d8d6bd8-2dn2w 1/1 Running 0 17d calico-node-npc7p 1/1 Running 0 17d coredns-558bd4d5db-4gc5t 1/1 Running 0 17d coredns-558bd4d5db-frtwb 1/1 Running 0 17d etcd- 1/1 Running 0 17d kube-apiserver- 1/1 Running 0 17d kube-controller-manager- 1/1 Running 0 14d kube-proxy-s5bmp 1/1 Running 0 17d kube-scheduler- 1/1 Running 0 14d
# 命令格式: kubectl run 名称 [参数] # --image 指定Pod的镜像 # --port 指定端口 # --namespace 指定namespace [root@ test]# kubectl run nginx --image=nginx --namespace test pod/nginx created root@ test]# kubectl get pod -n test NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 37s [root@ test]# kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx 1/1 Running 0 89s 172.16.143.29 sjz002006 <none> <none> 查看详细信息 kubectl describe pod nginx -n test 删除 kubectl delete pod nginx -n test
五、Label
Label它的作用就是在资源上添加标识,用来对它们进行区分和选择。
一个Label会以key/value键值对的形式附加到各种对象上,如Node、Pod、Service等等
一个资源对象可以定义任意数量的Label ,同一个Label也可以被添加到任意数量的资源对象上去
Label通常在资源对象定义时确定,当然也可以在对象创建后动态添加或者删除
Label Selector用于查询和筛选拥有某些标签的资源对象
例如: name = slave name != slave name in (master, slave) name not in (master, slave) name=slave,env!=production
为pod资源打标签 [root@ test]# kubectl label pod nginx version=v1.0 -n test pod/nginx labeled 查看标签 [root@ test]# kubectl get pod nginx --show-labels -n test NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 2m59s run=nginx,version=v1.0 为pod资源更新标签通过--overwrite 参数 [root@ test]# kubectl label pod nginx version=v2.0 -n test --overwrite pod/nginx labeled [root@ test]# kubectl get pod nginx --show-labels -n test NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 3m46s run=nginx,version=v2.0 通过标签进行筛选 [root@ test]# kubectl get pod -n test -l version=v2.0 --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 8m36s run=nginx,version=v2.0 删除标签通过-号即可 [root@ test]# kubectl label pod nginx version- -n test pod/nginx labeled [root@ test]# kubectl get pod nginx -n test --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx 1/1 Running 0 9m47s run=nginx