KUBERNETES03_k8s对象是什么、如何管理、命名空间、代码自动补全提示
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对象)描述了:
- 集群中运行了哪些容器化应用程序(以及在哪个节点上运行)
- 集群中对应用程序可用的资源(网络,存储等)
- 应用程序相关的策略定义,例如,重启策略、升级策略、容错策略
- 其他Kubernetes管理应用程序时所需要的信息
- scheduler先计算应该去哪个节点部署
- ④. 对象的spec和status,每一个Kubernetes对象都包含了两个重要的字段:
- spec必须由您来提供,描述了您对该对象所期望的目标状态
- status只能由Kubernetes系统来修改,描述了该对象在Kubernetes系统中的实际状态
- 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)
- kubectl get pod my-nginx666 -oyaml集群中挑一个同类资源,获取出他的yaml
- kubectl run my-tomcat --image=tomcat --dry-run -oyaml 干跑一遍
- ②. 当您在Kubernetes中创建一个对象时,您必须提供
- 该对象的spec字段,通过该字段描述您期望的目标状态,该对象的一些基本信息,例如名字
- 可以使用 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对象对应的.yaml文件中,需要配置如下的字段(必须字段)
- apiVersion:创建该对象所使用的Kubernetes API的版本
- kind:想要创建的对象的类别
- metadata: 用于唯一确定该对象的元数据:包括name和namespace,如果namespace为空,则默认值为default
- spec:你所期望的该对象的状态
- 不同类型的 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 安装成功后,默认有初始化了三个名称空间:
- default默认名称空间,如果Kubernetes对象中不定义metadata.namespace字段,该对象将放在此名称空间下
- kube-system Kubernetes系统创建的对象放在此名称空间下
- 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
- ②. 通过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目录下
-
②. kubelet额外参数配置/etc/sysconfig/kubelet。kubelet配置位置/var/lib/kubelet/config.yaml
[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
更多推荐
所有评论(0)