kubernetes-API资源类型、核心资源的用法

335 阅读5分钟

资源类型组 和 资源类型

支持的API版本

root@k8s-node01:~# kubectl api-versions
admissionregistration.k8s.io/v1
apiextensions.k8s.io/v1
apiregistration.k8s.io/v1
apps/v1
authentication.k8s.io/v1
authorization.k8s.io/v1
autoscaling/v1
autoscaling/v2
batch/v1
certificates.k8s.io/v1
coordination.k8s.io/v1
discovery.k8s.io/v1
events.k8s.io/v1
flowcontrol.apiserver.k8s.io/v1beta2
flowcontrol.apiserver.k8s.io/v1beta3
networking.k8s.io/v1
node.k8s.io/v1
policy/v1
rbac.authorization.k8s.io/v1
scheduling.k8s.io/v1
storage.k8s.io/v1
v1

支持的API资源

root@k8s-node01:~# kubectl api-resources --api-group=apps
NAME                  SHORTNAMES   APIVERSION   NAMESPACED   KIND
controllerrevisions                apps/v1      true         ControllerRevision
daemonsets            ds           apps/v1      true         DaemonSet
deployments           deploy       apps/v1      true         Deployment
replicasets           rs           apps/v1      true         ReplicaSet
statefulsets          sts          apps/v1      true         StatefulSet
root@k8s-node01:~# 

核心资源类型

Kubernetes API Primitive

用于描述在Kubernetes上运行应用程序的基本组件,即俗称的Kubernetes对象(Object)

它们持久存储于API Server上,用于描述集群的状态

image.png

依据资源的主要功能作为分类标准,Kubernetes的API对象大体可分为如下几个类别

工作负载(Workload)相关

  • 编排POD
  • Deployment 无状态应用
  • Statefulset 有状态应用
  • Deamonset 系统应用
  • Replicaset 由副本数目的定义和一个 Pod 模板组成的, Deployment控制器会操控创建Replicaset对象

服务发现和负载均衡(Discovery & LB)

  • ingress接入集群的外部流量 并且进行分发

配置和存储(Config & Storage)

集群(Cluster)

  • 水平扩容 向外扩容 不停的加pod
  • 垂直扩容 扩容配置cpu 内存

元数据(Metadata)

总结:都是围绕如何为POD更好的运行 而服务的

示例

run Demonapp application 无状态应用

命令式 创建容器化应用

kubectl create deployment  -h

Examples:
  # Create a deployment named my-dep that runs the busybox image
  kubectl create deployment my-dep --image=busybox
  
  # Create a deployment with a command
  kubectl create deployment my-dep --image=busybox -- date
  
  # Create a deployment named my-dep that runs the nginx image with 3 replicas
  kubectl create deployment my-dep --image=nginx --replicas=3
  
  # Create a deployment named my-dep that runs the busybox image and expose port 5701
  kubectl create deployment my-dep --image=busybox --port=5701

常用选项 --image 编排运行的pod模版 中 容器默认使用的镜像 --replicas 运行的pod的副本的数量 --dry-run client 仅打印 仅测试是否能够成功完成 但不会真正的创建资源

仅打印资源清单

kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3 --dry-run=client -o yaml

image.png

5个一级字段解释

apiVersion 资源组的版本 kind 负载类型 metadata 定义对象元数据 spec 期望的对象的终态 status 控制器显示的状态

创建一个 deployment资源类型 的对象


root@iZ0jli08cedg6bfntl7yucZ:~# kubectl create deployment demoapp --image=ikubernetes/demoapp:v1.0 --replicas=3 
deployment.apps/demoapp created

列出 deployment资源规范及状态

kubectl get deployments [-o yaml|json]

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get deployment 
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
demoapp   0/3     3            0           7s

列出 pod 下的所有对象

kubectl get pods -l app=demoapp -o wide

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
demoapp-75f59c894-g78kd   1/1     Running   0          115s
demoapp-75f59c894-sjk82   1/1     Running   0          115s
demoapp-75f59c894-tfd78   1/1     Running   0          115s

列出详细的资源信息

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get pods demoapp-75f59c894-g78kd
NAME                      READY   STATUS    RESTARTS   AGE
demoapp-75f59c894-g78kd   1/1     Running   0          2m44s


kubectl get pods demoapp-75f59c894-g78kd -o yaml

删除pod

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl delete pods demoapp-75f59c894-g78kd     
pod "demoapp-75f59c894-g78kd" deleted

查看pods的 labelsb标签

kubectl get pods --show-labels

image.png

每个资源对象的定义

遵循引用的资源类型的规范(数据的范式 JSON YAML)

  • 必选字段
  • 可选字段 创建完成后 需要提交给apiserver

创建 service类型的队形

service的种类

root@k8s-master01:~# kubectl create service -h
Available Commands:
  clusterip      Create a ClusterIP service
  externalname   Create an ExternalName service
  loadbalancer   Create a LoadBalancer service
  nodeport       Create a NodePort service

仅打印资源清单

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl create service nodeport demoapp --tcp=80:80 --dry-run=client -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: demoapp
  name: demoapp
spec:
  ports:
  - name: 80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: demoapp
  type: NodePort
status:
  loadBalancer: {}

创建service对象

root@k8s-master01:~# kubectl create service nodeport demoapp --tcp=80:80
service/demoapp created

查看标签(selector 标签选择器)

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get pods --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     LABELS
demoapp-75f59c894-sjk82   1/1     Running   0          31m     app=demoapp,pod-template-hash=75f59c894
demoapp-75f59c894-tbfbq   1/1     Running   0          3m54s   app=demoapp,pod-template-hash=75f59c894
demoapp-75f59c894-tfd78   1/1     Running   0          31m     app=demoapp,pod-template-hash=75f59c894

查看services资源对象

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get services --show-labels    
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE    LABELS
demoapp      NodePort    10.96.172.179   <none>        80:32638/TCP   6s     app=demoapp
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        140m   component=apiserver,provider=kubernetes

访问service

curl 10.102.174.101的时候 可以看到负载到不同的节点 image.png

image.png

iptable规则可以看到 image.png

每一个service都会有一个endpoints 这个endpoints是自动创建的

root@iZ0jli08cedg6bfntl7yucZ:~# kubectl get endpoints -o wide
NAME         ENDPOINTS                                   AGE
demoapp      10.244.1.2:80,10.244.1.3:80,10.244.2.3:80   3m11s
kubernetes   172.30.64.3:6443                            143m

单独获取clusterIP属性

kubectl get services demoapp -o jsonpath={.spec.clusterIP}

扩容 & 缩容

kubectl scale --replicas=3 deployment/nginx

image.png

kubectl scale --replicas=1 deployment/nginx

image.png