3. 浅尝Kubernetes API

70 阅读2分钟

本文是胡涛大佬所出版的《Kubernetes Operator 进阶开发》,强烈推荐各位阅读原书,本文仅仅留作个人心得,如有侵权立马删除。


1 认识 Kubernetes API

我们可以通过下面命令之后,通过 curl 来和 HTTP 进行交互:

kubectl proxy --port 18080    
Starting to serve on 127.0.0.1:18080
curl localhost:18080/version  
{
  "major": "1",
  "minor": "26",
  "gitVersion": "v1.26.14",
  "gitCommit": "6db79806d788bfb9cfc996deb7e2e178402e8b50",
  "gitTreeState": "clean",
  "buildDate": "2024-02-14T23:09:42Z",
  "goVersion": "go1.21.7",
  "compiler": "gc",
  "platform": "linux/amd64"
}

编写 nginx-deployment.yaml

# 编写一个简单的 nginx 的deploy yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80

执行下面的命令:

base ❯ curl -X  POST -H 'Content-Type: application/yaml' --data-binary '@nginx-deployment.yaml' http://localhost:18080/apis/apps/v1/namespaces/default/deployments
{
  "kind": "Deployment",
  "apiVersion": "apps/v1",
  "metadata": {
    "name": "nginx-deployment",
    "namespace": "default",
    "uid": "4d89d8bf-4c98-4b19-93c6-fe1c4019e1f2",
    "resourceVersion": "16767",
    "generation": 1,
    "creationTimestamp": "2024-04-04T02:24:08Z",
    "labels": {
      "app": "nginx"
    },
    "managedFields": [
      {
        "manager": "curl",
        "operation": "Update",
        "apiVersion": "apps/v1",
        "time": "2024-04-04T02:24:08Z",
        "fieldsType": "FieldsV1",
        "fieldsV1": {
          "f:metadata": {
            "f:labels": {
              ".": {},
              "f:app": {}
            }
          },
          "f:spec": {
            "f:progressDeadlineSeconds": {},
            "f:replicas": {},
            "f:revisionHistoryLimit": {},
            "f:selector": {},
            "f:strategy": {
              "f:rollingUpdate": {
                ".": {},
                "f:maxSurge": {},
                "f:maxUnavailable": {}
              },
              "f:type": {}
            },
            "f:template": {
              "f:metadata": {
                "f:labels": {
                  ".": {},
                  "f:app": {}
                }
              },
              "f:spec": {
                "f:containers": {
                  "k:{\"name\":\"nginx\"}": {
                    ".": {},
                    "f:image": {},
                    "f:imagePullPolicy": {},
                    "f:name": {},
                    "f:ports": {
                      ".": {},
                      "k:{\"containerPort\":80,\"protocol\":\"TCP\"}": {
                        ".": {},
                        "f:containerPort": {},
                        "f:protocol": {}
                      }
                    },
                    "f:resources": {},
                    "f:terminationMessagePath": {},
                    "f:terminationMessagePolicy": {}
                  }
                },
                "f:dnsPolicy": {},
                "f:restartPolicy": {},
                "f:schedulerName": {},
                "f:securityContext": {},
                "f:terminationGracePeriodSeconds": {}
              }
            }
          }
        }
      }
    ]
  },
  "spec": {
    "replicas": 1,
    "selector": {
      "matchLabels": {
        "app": "nginx"
      }
    },
    "template": {
      "metadata": {
        "creationTimestamp": null,
        "labels": {
          "app": "nginx"
        }
      },
      "spec": {
        "containers": [
          {
            "name": "nginx",
            "image": "nginx:1.14.2",
            "ports": [
              {
                "containerPort": 80,
                "protocol": "TCP"
              }
            ],
            "resources": {},
            "terminationMessagePath": "/dev/termination-log",
            "terminationMessagePolicy": "File",
            "imagePullPolicy": "IfNotPresent"
          }
        ],
        "restartPolicy": "Always",
        "terminationGracePeriodSeconds": 30,
        "dnsPolicy": "ClusterFirst",
        "securityContext": {},
        "schedulerName": "default-scheduler"
      }
    },
    "strategy": {
      "type": "RollingUpdate",
      "rollingUpdate": {
        "maxUnavailable": "25%",
        "maxSurge": "25%"
      }
    },
    "revisionHistoryLimit": 10,
    "progressDeadlineSeconds": 600
  },
  "status": {}
}

以及查看当前的 cluster 的情况:

base ❯ kubectl get pod        
NAME                                      READY   STATUS    RESTARTS   AGE
nginx-deployment-85996f8dbd-kdd5t         1/1     Running   0          87s

2 理解 GVK

所谓 GVK 就是:groupVersionKind。我们在描述 Kubernetes API 的时候往往会使用一个四元组:[group, version, kind, resource]