文章目录

①. 什么是k8s对象

②. 描述k8s的对象

③. 管理k8s的对象

④. k8s的名称空间

⑤. 给k8s对象打标签

⑥. 认识kubectl和kubelet

⑦. k8s的自动补全

①. 什么是k8s对象

  • ①. k8s里面操作的资源实体,就是k8s的对象,可以使用yaml来声明对象。然后让k8s根据yaml的声明创建出这个对象(kubectl create/run /expose…)
  • ②. 操作Kubernetes对象—无论是创建、修改,或者删除—需要使用Kubernetes API。比如,当使用kubectl命令行接口时,CLI 会执行必要的Kubernetes API调用
  • ③. Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes对象的形式通过api server存储在etcd中。(集群中所有的资源都是etc中,k8s只依赖一个储存就是etcd)。具体来说,这些数据(Kubernetes对象)描述了:
  1. 集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
  2. 集群中对应用程序可用的资源(网络,存储等)
  3. 应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
  4. 其他Kubernetes管理应用程序时所需要的信息
  5. scheduler先计算应该去哪个节点部署
  • ④. 对象的spec和status,每一个Kubernetes对象都包含了两个重要的字段:
  1. spec必须由您来提供,描述了您对该对象所期望的目标状态
  2. status只能由Kubernetes系统来修改,描述了该对象在Kubernetes系统中的实际状态
  3. Kubernetes通过对应的 控制器,不断地使实际状态趋向于您期望的目标状态
# kubectl create deployment my-nginx --image=nginx
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2022-01-03T09:18:20Z"
  generation: 1
  labels:
    app: my-nginx
  managedFields:
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    manager: kubectl-create
    operation: Update
    time: "2022-01-03T09:18:20Z"
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    manager: kube-controller-manager
    operation: Update
    time: "2022-01-03T09:18:39Z"
  name: my-nginx
  namespace: default
  resourceVersion: "99511"
  uid: 270afb1b-f4df-4b10-b708-53313027a805
spec: # 期望状态
  progressDeadlineSeconds: 600
  replicas: 1 # 副本数量
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: my-nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-nginx
    spec:
      containers:
      - image: nginx # 使用这个镜像创建容器
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status: # 当前状态
  availableReplicas: 1 # 当前集群可用的
  conditions:
  - lastTransitionTime: "2022-01-03T09:18:39Z"
    lastUpdateTime: "2022-01-03T09:18:39Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-01-03T09:18:20Z"
    lastUpdateTime: "2022-01-03T09:18:39Z"
    message: ReplicaSet "my-nginx-6b74b79f57" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
#  最终一致
# etcd保存的创建资源期望的状态和最终这个资源的状态要是一致的;spec和status要最终一致
# 1. kubectl create deployment my-nginx --image=nginx
# 2. pi-server保存etcd,controller-manager最终解析数据,知道集群要my-nginx一份,保存到etcd
# 3. kubelet就做一件事情,spec状态和最终状态一致
while(true){ if(my-nginx.replicas != spec.replicas) { kubelet.startPod(); } }

②. 描述k8s的对象

  • ①. 如何会写任意资源的yaml,比如Pod (kubectl run my-nginx666 --image=nginx #启动一个Pod)
  1. kubectl get pod my-nginx666 -oyaml集群中挑一个同类资源,获取出他的yaml
  2. kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
  • ②. 当您在Kubernetes中创建一个对象时,您必须提供
  1. 该对象的spec字段,通过该字段描述您期望的目标状态,该对象的一些基本信息,例如名字
  2. 可以使用 kubectl 命令行创建对象,也可以编写.yaml 格式的文件进行创建
[root@k8smaster ~]# kubectl run my-tomcat --image=tomcat --dry-run -oyaml  # dry-run过期了,可以使用dry-run=client
[root@k8smaster ~]# kubectl api-resources | grep pod
# tomcat干跑
#(1). apiVersion和kind称为typeMeta(基本信息)
#(2). metadata成为元数据,ObjectMeta
apiVersion: v1 # 同一个资源有可能有多个版本。看 kubectl api-resources提示的
kind: Pod # 资源类型 kubectl api-resources:可以获取到所有资源
metadata: # 每一个资源定义一些元数据信息
  labels:
    run: my-tomcat
  name: my-tomcat # 指定资源的名字
spec: # 资源的规格(镜像名、镜像的环境变量信息等等)
  containers: # 指定要启动一个什么样的容器
  - image: tomcat # 容器的镜像
    name: my-tomcat # 容器的名字
    resources: {} # 容器的资源信息(后面详解)
  dnsPolicy: ClusterFirst # dns的策略信息(后面详解)
  restartPolicy: Always
# 以上是资源的完整规格描述部分 以上是我们必须会编写的
# status不用我们写,是k8s集群实时更新的状态信息,只要资源变化,kubelet会请求api-server保存最新的资源状态信息
status: {}

kubernetes 的 deployment 资源 kubernetes的资源对象_kubernetes

  • ③. 在想要创建的Kubernetes对象对应的.yaml文件中,需要配置如下的字段(必须字段)
  1. apiVersion:创建该对象所使用的Kubernetes API的版本
  2. kind:想要创建的对象的类别
  3. metadata: 用于唯一确定该对象的元数据:包括name和namespace,如果namespace为空,则默认值为default
  4. spec:你所期望的该对象的状态
  5. 不同类型的 Kubernetes,其spec对象的格式不同(含有不同的内嵌字段),通过API手册可以查看 Kubernetes对象的字段和描述。例如,假设您想了解Pod的spec定义,可以在这里找到,Deployment的spec定义可以在这里找到

③. 管理k8s的对象

  • ①. 同一个Kubernetes对象应该只使用一种方式管理,否则可能会出现不可预期的结果
  • ②. kubectl create -f 没有会创建,有的话会报错 kubectl apply -f 没有会创建,有的话不会报错

④. k8s的名称空间

  • ①. Namespace:名称空间,用来对集群资源进行隔离划分。默认只隔离资源,不隔离网络(同一名称下的资源可以共享,不同名称空间下的资源不能共享,但是不同名称空间下的网络可以互通)
  • ②. 关于Namespace中基本的命令 kubectl get ns:查看命名空间 kubectl create ns hello:创建命名空间 kubectl delete ns hello:删除命名空间
  • ③. 使用yaml的文件创建命名空间(下面创建了hello的命名空间),hello.yaml 如果要删除命名空间:kubectl delete -f hello.yaml
[root@k8smaster k8syaml]# kubectl create ns hello--dry-run=client -oyaml 
apiVersion: v1
kind: Namespace
metadata:
  name: hello # 名称空间的名字
spec: {}
status: {}
  • ④. 使用kubectl get pods:查看的是默认(default命名空间)下的内容
[root@k8s-master~]kubectl get pods
No resources found in default namespace
  • ⑤. Kubernetes 安装成功后,默认有初始化了三个名称空间:
  1. default默认名称空间,如果Kubernetes对象中不定义metadata.namespace字段,该对象将放在此名称空间下
  2. kube-system Kubernetes系统创建的对象放在此名称空间下
  3. kube-public此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群用户看到

⑤. 给k8s对象打标签

  • ①. 通过命令行的方式打标签
[root@k8smaster k8syaml]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
mynginx   1/1     Running   0          34s
[root@k8smaster k8syaml]# kubectl label pod mynginx name=tangzhi # 将mynginx进行打标签
pod/mynginx labeled
[root@k8smaster k8syaml]# kubectl get pod --show-labels # 查看pod的标签
NAME      READY   STATUS    RESTARTS   AGE   LABELS
mynginx   1/1     Running   0          91s   name=tangzhi,run=mynginx
[root@k8smaster k8syaml]# kubectl label pod mynginx name-  # 将标签name进行删除
pod/mynginx labeled
[root@k8smaster k8syaml]# kubectl get pod --show-labels
NAME      READY   STATUS    RESTARTS   AGE    LABELS
mynginx   1/1     Running   0          119s   run=mynginx

kubernetes 的 deployment 资源 kubernetes的资源对象_docker_02

kubernetes 的 deployment 资源 kubernetes的资源对象_nginx_03

  • ②. 通过yaml的方式打标签
# 自己给pod的yaml文件的方式打标签
# pod带上名称空间和label的
kind: Pod
apiVersion: v1
metadata:
  name: my-nginx-labels
  namespace: hello # 在hello命名空间下创建pod
  labels:
     aa: bb
     bb: dd
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
  - image: nginx   #指定镜像
    name: my-nginx  #容器的名字

⑥. 认识kubectl和kubelet

  • ①. 之前的环境中通过kubeadm安装的集群,进入到/etc/kubernetes目录下
  • kubernetes 的 deployment 资源 kubernetes的资源对象_docker_04

  • ②. kubelet额外参数配置/etc/sysconfig/kubelet。kubelet配置位置/var/lib/kubelet/config.yaml
  • kubernetes 的 deployment 资源 kubernetes的资源对象_云原生_05

  • ③. kubectl的命令大全
[root@k8s-master kubelet]# kubectl
kubectl controls the Kubernetes cluster manager.

 Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/

Basic Commands (Beginner):
  create        Create a resource from a file or from stdin.
  expose        使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes
Service
  run           在集群中运行一个指定的镜像
  set           为 objects 设置一个指定的特征

Basic Commands (Intermediate):
  explain       查看资源的文档
  get           显示一个或更多 resources
  edit          在服务器上编辑一个资源
  delete        Delete resources by filenames, stdin, resources and names, or by resources and label selector

Deploy Commands:
  rollout       Manage the rollout of a resource
  scale         Set a new size for a Deployment, ReplicaSet or Replication Controller
  autoscale     自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量

Cluster Management Commands:
  certificate   修改 certificate 资源.
  cluster-info  显示集群信息
  top           Display Resource (CPU/Memory/Storage) usage.
  cordon        标记 node 为 unschedulable
  uncordon      标记 node 为 schedulable
  drain         Drain node in preparation for maintenance
  taint         更新一个或者多个 node 上的 taints

Troubleshooting and Debugging Commands:
  describe      显示一个指定 resource 或者 group 的 resources 详情
  logs          输出容器在 pod 中的日志
  attach        Attach 到一个运行中的 container
  exec          在一个 container 中执行一个命令
  port-forward  Forward one or more local ports to a pod
  proxy         运行一个 proxy 到 Kubernetes API server
  cp            复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
  auth          Inspect authorization
  debug         Create debugging sessions for troubleshooting workloads and nodes

Advanced Commands:
  diff          Diff live version against would-be applied version
  apply         通过文件名或标准输入流(stdin)对资源进行配置
  patch         Update field(s) of a resource
  replace       通过 filename 或者 stdin替换一个资源
  wait          Experimental: Wait for a specific condition on one or many resources.
  kustomize     Build a kustomization target from a directory or a remote url.

Settings Commands:
  label         更新在这个资源上的 labels
  annotate      更新一个资源的注解
  completion    Output shell completion code for the specified shell (bash or zsh)

Other Commands:
  api-resources Print the supported API resources on the server
  api-versions  Print the supported API versions on the server, in the form of "group/version"
  config        修改 kubeconfig 文件
  plugin        Provides utilities for interacting with plugins.
  version       输出 client 和 server 的版本信息

Usage:
  kubectl [flags] [options]

Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).

⑦. k8s的自动补全

  • ①. 补全的网址
  • ②. 详细步骤
# 安装 
yum install bash-completion 
# 自动补全 
echo 'source <(kubectl completion bash)' >>~/.bashrc 
kubectl completion bash >/etc/bash_completion.d/kubectl
source /usr/share/bash-completion/bash_completion