本文是胡涛大佬所出版的《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 就是:group,Version,Kind。我们在描述 Kubernetes API 的时候往往会使用一个四元组:[group, version, kind, resource]