kubernetes Object k8s对象概念

基础概念理解:

集群:
master
worker --node
Pod:
应用最终以pod为一个基本单位部署
Label:
很多资源都可以打标签
Deployment:
应用部署它,deployment最终会产生pod
Service:
负载均衡机制。

理解 Kubernetes 对象

1.k8s里面操作的资源实体,就是k8s的对象,可以使用yaml来声明对象。然后让k8s根据yaml的声明
创建出这个对象;kubectl create/run /expose…
2.操作 Kubernetes 对象 —— 无论是创建、修改,或者删除 —— 需要使用 Kubernetes API。比如,当
使用 kubectl 命令行接口时,CLI 会执行必要的 Kubernetes API 调用
3.Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际
情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes
对象的形式通过 api server存储在 etcd 中
。具体来说,这些数据(Kubernetes对象)描述了:
集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
集群中对应用程序可用的资源(网络,存储等)
应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
其他Kubernetes管理应用程序时所需要的信息
scheduler先计算应该去哪个节点部署

对象的spec和status:
每一个k8s对象都包含了两个重要的字段
spec:必须由你来提供,描述了您对该对象所期望的目标状态
status:只能由k8s系统修改,描述了该对象在kubernetes系统的实际状态
kubernetes通过对应的控制器,不断的使实际状态趋向与您期望的目标状态

### 最终一致。
## etcd保存的创建资源期望的状态和最终这个资源的状态要是一致的;spec和status要最终一致 
## 1、kubectl create deployment my-nginx --image=nginx 
## 2、api-server保存etcd,controller-manager最终解析数据,知道集群要my-nginx一份,保存到etcd 
## 3、kubelet就做一件事情,spec状态和最终状态一致

描述K8S对象:

如何编写一个yaml
## 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 干跑一遍

kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
kubernetes Object k8s对象概念_第1张图片

apiVersion: v1 #同一个资源有可能有多个版本。看 kubectl api-resources提示的。
kind: Pod #资源类型 kubectl api-resources:可以获取到所有资源
metadata: #每一个资源定义一些元数据信息
  creationTimestamp: null
  labels:
    run: mytomcat
  name: mytomcat
spec: #资源的规格(镜像名、镜像的环境变量信息等等)
  containers:
  - image: tomcat
    name: mytomcat
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

kubectl api-resources | grep pod

K8S对象yaml结构:

kubernetes Object k8s对象概念_第2张图片
必填字段:

1.apiVersion 用来创建对象时所使用的Kubernetes API版本
2.kind 被创建对象的类型
3.metadata 用于唯一确定该对象的元数据:包括 name 和 namespace ,如果 namespace 为空,
则默认值为 default
4.spec 描述您对该对象的期望状态

不同类型的 Kubernetes,其 spec 对象的格式不同(含有不同的内嵌字段),通过 API 手册 可
以查看 Kubernetes 对象的字段和描述。例如,假设您想了解 Pod 的 spec 定义,可以在 这里找
到,Deployment 的 spec 定义可以在 这里 找到
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.21/

kind: Pod
apiVersion: v1
#以上 type信息结束
metadata:
  name: my-tomcat-test  # 资源的名字
# 以上是元数据部分
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
    - image: tomcat   #指定镜像
      name: my-tomcat  #容器的名字

# 以上是资源的完整规格描述部分 以上是我们必须会编写的
status: {}
#status不用我们写,是k8s集群实时更新的状态信息,
#只要资源变化,kubelet会请求api-server保存最新的资源状态信息

管理k8s对象

kubernetes Object k8s对象概念_第3张图片

#对比修改完的配置文件的更新内容
kubectl diff -f deploy2.yaml

kubernetes Object k8s对象概念_第4张图片

#删除应用
kubectl delete -f deploy2.yaml

同一个Kubernetes对象应该只使用一种方式管理,否则可能会出现不可预期的结果

#1、命令式 
kubectl run nginx --image nginx 
kubectl create deployment nginx --image 
nginx apply -f : 没有就创建,有就修改

#2、指令性
 - 使用指令性的对象配置(imperative object configuration)时,需要向 kubectl 命令指定具体 的操作(create,replace,apply,delete等),可选参数以及至少一个配置文件的名字。配置文件中必须 包括一个完整的对象的定义,可以是 yaml 格式,也可以是 json 格式。

#创建对象 
kubectl create -f nginx.yaml 
#删除对象
kubectl delete -f nginx.yaml -f redis.yaml 
#替换对象 
kubectl replace -f nginx.yaml
#3、声明式 
#处理 configs 目录中所有配置文件中的Kubernetes对象,根据情况创建对象、或更新Kubernetes中已 经存在的对象。可以先执行 diff 指令查看具体的变更,然后执行 apply 指令执行变更;
kubectl diff -f configs/ 
kubectl apply -f configs/

#递归处理目录中的内容: 
kubectl diff -R -f configs/ 
kubectl apply -R -f configs/
#移除 
kubectl delete -f configs/

名称空间:

kubectl get namespaces
kubectl describe namespaces 	

kubernetes Object k8s对象概念_第5张图片
Kubernetes 安装成功后,默认有初始化了三个名称空间:
1.default 默认名称空间,如果 Kubernetes 对象中不定义 metadata.namespace 字段,该对象将放
在此名称空间下
2.kube-system Kubernetes系统创建的对象放在此名称空间下
3…kube-public 此名称空间自动在安装集群是自动创建,并且所有用户都是可以读取的(即使是那些
未登录的用户)。主要是为集群预留的,例如,某些情况下,某些Kubernetes对象应该被所有集群
用户看到。

名称空间如何隔离:

  1. 基于环境隔离 (prod,test)两个不同的名称空间:
    prod: 部署的所有应用
    test:部署的所有应用
    2.基于产品线的名称空间 不同的产品线,不同的名称空间
  2. 基于团队隔离 不同的团队,不同的名称空间

访问其他名称空间的东西? 名称空间资源隔离,网络不隔离
1.配置直接拿来用。不行
2.网络访问,可以
serviceName来访问,找本名称空间的Service负载均衡
serviceName.名称空间, 可以访问别的名称空间的

# 创建
kubectl create ns <名称空间的名字>
#删除
kubectl delete ns <名称空间的名字>

#使用yaml方式创建名称空间
kubectl create ns world2 --dry-run=client -oyaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: world2
spec: {}
status: {}

kubernetes Object k8s对象概念_第6张图片

apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: k8s-001 #名称空间的名字
spec: {}
status: {}

kubernetes Object k8s对象概念_第7张图片
名称空间的名字必须与 DNS 兼容:
1.不能带小数点 .
2.不能带下划线 _
3.使用数字、小写字母和减号 - 组成的字符串
默认情况下,安装Kubernetes集群时,会初始化一个 default 名称空间,用来将承载那些未指定名称
空间的 Pod、Service、Deployment等对象

为请求设置名称空间:
#要为当前请求设置命名空间,请使用 --namespace 参数。

kubectl run nginx --image=nginx --namespace= 

kubectl get pods --namespace=

并非所有的对象都再命名空间中:
大多数 kubernetes 资源(例如 Pod、Service、副本控制器等)都位于某些命名空间中。但是命名空间资
源本身并不在命名空间中。而且底层资源,例如 nodes 和持久化卷不属于任何命名空间。
查看哪些 Kubernetes 资源在命名空间中,哪些不在命名空间中:

# In a namespace 
kubectl api-resources --namespaced=true 
# Not in a namespace 
kubectl api-resources --namespaced=false

标签和选择器:

标签(Label)是附加在Kubernetes对象上的一组名值对,其意图是按照对用户有意义的方式来标识
Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和选择一组
Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为其添加标签。
每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一

#加标签
kubeclt label pod nginx-deployment-746fbb99df-49t7w  aaa=bbb
#查看标签
kubectl get pod  --show-labels
#删除标签
kubeclt label pod nginx-deployment-746fbb99df-49t7w  aaa-
#解释标签:
kubectl explain pod.metadata.labels

使用yaml文件如何写标签:

kind: Pod
apiVersion: v1
#以上 type信息结束
metadata:
  name: my-nginx-labels  # 资源的名字
  labels:
    aa: bb #指定标签
    cc: dd
    app: my-nginx
# 以上是元数据部分
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
    - image: nginx   #指定镜像
      name: my-nginx  #容器的名字

三个命令玩转所有的yaml写法:

kubectl get xxx -oyaml 
kubectl create deploy xxxxx --dry-run-client -oyaml
kubectl explain pod.spec.xx

认识kubectl和kubelet:

kubeadm安装的集群。二进制后来就是 yum install etcd api-server
认识核心文件夹 /etc/kubernetes . 以Pod方式安装的核心组件。
etcd,api-server,scheduler。(安装k8s的时候,yum kubeadm kubelet kubectl)
回顾集群安装的时候,为什么只有master节点的kubectl可以操作集群
kubelet额外参数配置 /etc/sysconfig/kubelet;
kubelet配置位置 /var/lib/kubelet/config.yaml

kubectl的所有命令参考:
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

自动补全:

https://kubernetes.io/zh/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/

# 安装 
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
#查询基础信息
 ps -aux | grep kubelet

万物基础:

镜像:
在 Kubernetes 的 Pod 中使用容器镜像之前,我们必须将其推送到一个镜像仓库(或者使用仓库中已经
有的容器镜像)。在 Kubernetes 的 Pod 定义中定义容器时,必须指定容器所使用的镜像,容器中的
image 字段支持与 docker 命令一样的语法,包括私有镜像仓库和标签。
kubernetes Object k8s对象概念_第8张图片
下载私有仓库镜像:

#这个秘钥默认在default名称空间,不能被hello名称空间共享 
kubectl create secret -n hello docker-registry my-aliyun \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=forsumlove \
--docker-password=lfy11223344 # 那个镜像对应哪个仓库没有任何问题
apiVersion: v1 kind: Pod metadata: name: foo spec: containers:
- name: foo image: registry.cn-zhangjiakou.aliyuncs.com/atguigudocker/atguigu-java- img:v1.0 imagePullSecrets:
- name: mydocker

kubernetes Object k8s对象概念_第9张图片

#查看详细下载信息
kubectl describe pod名称 -n hello

环境变量:

验证环境变量:

kind: Pod
apiVersion: v1
metadata:
  name: my-mysql
  namespace: hello
  labels:
    aa: bb
    bb: dd
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
    ## docker run -e = env   --name=name -v=volumeMounts -w /usr/  /bin/bash
    - image: mysql:5.7.34  #指定镜像
      name: mysql  #容器的名字 数据就在容器里面  docker run mysql.
      # ports: #指定容器暴露哪些端口  -p
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: cle
        - name: MYSQL_DATABASE
          value: "itdachang"
      workingDir: "/usr/" # Dockerfiel WORKDIR
      #volumeMounts: 挂载

验证输出信息:

kind: Pod
apiVersion: v1
metadata:
  name: my-command-test
  namespace: hello
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
    - image: nginx  #指定镜像。默认会启动一个nginx容器
      name: command-test
      command:    # 以这里为准  ## redis 主节点  redis 启动命令
        - /bin/sh
        - -c
        - "echo $(msg);sleep 3600;"
      env:
        - name: msg
          value: "hello msg"   ## Dockerfile  CMD  能用到
      # 直接覆盖容器的默认命令  Dockerfile  ENTRYPOINT CMD 指定容器的启动命令

kubectl logs my-command-test -n hello

kubernetes Object k8s对象概念_第10张图片

kubernetes Object k8s对象概念_第11张图片

声明周期容器钩子:

Kubernetes中为容器提供了两个 hook(钩子函数):
PostStart
此钩子函数在容器创建后将立刻执行。但是,并不能保证该钩子函数在容器的 ENTRYPOINT 之前
执行。该钩子函数没有输入参数。
PreStop
此钩子函数在容器被 terminate(终止)之前执行,例如:
通过接口调用删除容器所在 Pod
某些管理事件的发生:健康检查失败、资源紧缺等
如果容器已经被关闭或者进入了 completed 状态,preStop 钩子函数的调用将失败。该函数的执
行是同步的,即,kubernetes 将在该函数完成执行之后才删除容器。该钩子函数没有输入参数。

验证:启动pod访问nginx:

kind: Pod
apiVersion: v1
metadata:
  name: my-life
  namespace: hello
  labels:
    aa: bb
    bb: dd
spec:  # 指定规格信息
  containers:  # 指定要启动一个什么样的容器
    - image: nginx  #指定镜像
      name: nginx  #容器的名字 数据就在容器里面  docker run mysql.
      lifecycle:
        postStart:
          # httpGet:
          #   port: 80
          #   path: "http://192.168.169.160/postStart"
          httpGet:
            host: "192.168.179.54"
            path: "/postStart"
            port: 80
            scheme: HTTP

          # exec:  容器创建之后,这个钩子程序执行一个命令  echo 1111
          # httpGet: 容器创建之后,这个钩子程序发送一个httpGet 请求
          # tcpSocket: 容器创建之后,这个钩子程序连上一个TCP端口
        preStop:  ##
          httpGet:
            host: "192.168.179.54"
            path: "/preStop"
            port: 80
            scheme: HTTP

Kubernetes 在容器启动后立刻发送 postStart 事件,但是并不能确保 postStart 事件处理程序在容器
的 EntryPoint 之前执行
。postStart 事件处理程序相对于容器中的进程来说是异步的(同时执行),
然而**,Kubernetes 在管理容器时,将一直等到 postStart 事件处理程序结束之后,才会将容器的状
态标记为 Running**。
Kubernetes 在决定关闭容器时,立刻发送 preStop 事件,并且,将一直等到 preStop 事件处理程序
结束或者 Pod 的 --grace-period 超时,才删除容器

资源限制:

kubernetes Object k8s对象概念_第12张图片
kubectl explain 解析一个资源Pod改怎么编写yaml
kubectl describe 用来排错的,看资源的状态

你可能感兴趣的:(K8S,kubernetes)