Go语言开发k8s之Deployment操作解析

2023-12-05 0 385
目录
  • 1. 结构体
    • 1.1 DeploymentList
    • 1.2 Deployment
    • 1.3 TypeMeta
    • 1.4 ObjectMeta(metadata)
    • 1.5 DeploymentSpec(spec)
      • 1) Replicas(spec.replicas)
      • 2)LabelSelector(spec.selector)
      • 3)PodTemplateSpec(spec.template)
      • 4)ObjectMeta (spec.template.metadata)
      • 5)Spec(spec.template.spec)
    • 1.6 DeploymentStatus
      • 1.7 对照yml文件示例
      • 2. Deployment list
        • 语法
          • 完整示例
          • 3. Get Deployment
            • 语法示例
            • 4. Create Deployment
              • 语法示例
                • 完整示例
                • 5. PUT Deployment
                  • 语法
                    • 完整示例(修改镜像)
                      • 完整示例(修改副本数)
                      • 6. Delete Deployment
                        • 语法
                          • 完整示例

                          1. 结构体

                          1.1 DeploymentList

                          所属包:"k8s.io/api/apps/v1"

                          type DeploymentList struct {
                          v1.TypeMeta `json:\”,inline\”`
                          v1.ListMeta `json:\”metadata,omitempty\” protobuf:\”bytes,1,opt,name=metadata\”`
                          Items []Deployment `json:\”items\” protobuf:\”bytes,2,rep,name=items\”`
                          }

                          其中Items的每个成员的结构体Deployment 如下:

                          1.2 Deployment

                          所属包:"k8s.io/api/apps/v1"

                          type Deployment struct {
                          v1.TypeMeta `json:\”,inline\”`
                          v1.ObjectMeta `json:\”metadata,omitempty\” protobuf:\”bytes,1,opt,name=metadata\”`
                          Spec DeploymentSpec `json:\”spec,omitempty\” protobuf:\”bytes,2,opt,name=spec\”`
                          Status DeploymentStatus `json:\”status,omitempty\” protobuf:\”bytes,3,opt,name=status\”`
                          }

                          其中各成员结构体如下:

                          1.3 TypeMeta

                          所属包 "k8s.io/apimachinery/pkg/apis/meta/v1"

                          type TypeMeta struct {
                          Kind string `json:\”kind,omitempty\” protobuf:\”bytes,1,opt,name=kind\”`
                          APIVersion string `json:\”apiVersion,omitempty\” protobuf:\”bytes,2,opt,name=apiVersion\”`
                          }

                          对应k8s的yml文件

                          apiVersion: apps/v1
                          kind: Deployment

                          1.4 ObjectMeta(metadata)

                          所属包: "k8s.io/apimachinery/pkg/apis/meta/v1"

                          type ObjectMeta struct {
                          Name string `json:\”name,omitempty\” protobuf:\”bytes,1,opt,name=name\”`
                          GenerateName string `json:\”generateName,omitempty\” protobuf:\”bytes,2,opt,name=generateName\”`
                          Namespace string `json:\”namespace,omitempty\” protobuf:\”bytes,3,opt,name=namespace\”`
                          SelfLink string `json:\”selfLink,omitempty\” protobuf:\”bytes,4,opt,name=selfLink\”`
                          UID types.UID `json:\”uid,omitempty\” protobuf:\”bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID\”`
                          ResourceVersion string `json:\”resourceVersion,omitempty\” protobuf:\”bytes,6,opt,name=resourceVersion\”`
                          Generation int64 `json:\”generation,omitempty\” protobuf:\”varint,7,opt,name=generation\”`
                          CreationTimestamp Time `json:\”creationTimestamp,omitempty\” protobuf:\”bytes,8,opt,name=creationTimestamp\”`
                          DeletionTimestamp *Time `json:\”deletionTimestamp,omitempty\” protobuf:\”bytes,9,opt,name=deletionTimestamp\”`
                          DeletionGracePeriodSeconds *int64 `json:\”deletionGracePeriodSeconds,omitempty\” protobuf:\”varint,10,opt,name=deletionGracePeriodSeconds\”`
                          Labels map[string]string `json:\”labels,omitempty\” protobuf:\”bytes,11,rep,name=labels\”`
                          Annotations map[string]string `json:\”annotations,omitempty\” protobuf:\”bytes,12,rep,name=annotations\”`
                          OwnerReferences []OwnerReference `json:\”ownerReferences,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”uid\” protobuf:\”bytes,13,rep,name=ownerReferences\”`
                          Finalizers []string `json:\”finalizers,omitempty\” patchStrategy:\”merge\” protobuf:\”bytes,14,rep,name=finalizers\”`
                          ManagedFields []ManagedFieldsEntry `json:\”managedFields,omitempty\” protobuf:\”bytes,17,rep,name=managedFields\”`
                          }

                          对应k8s的yml文件中如下部分

                          metadata:
                          ……

                          和k8s用yml文件创建deployment一样,此处我们主要关心Name和Namespace

                          1.5 DeploymentSpec(spec)

                          属于包:"k8s.io/api/apps/v1"

                          type DeploymentSpec struct {
                          Replicas *int32 `json:\”replicas,omitempty\” protobuf:\”varint,1,opt,name=replicas\”`
                          Selector *v1.LabelSelector `json:\”selector\” protobuf:\”bytes,2,opt,name=selector\”`
                          Template v1.PodTemplateSpec `json:\”template\” protobuf:\”bytes,3,opt,name=template\”`
                          Strategy DeploymentStrategy `json:\”strategy,omitempty\” patchStrategy:\”retainKeys\” protobuf:\”bytes,4,opt,name=strategy\”`
                          MinReadySeconds int32 `json:\”minReadySeconds,omitempty\” protobuf:\”varint,5,opt,name=minReadySeconds\”`
                          RevisionHistoryLimit *int32 `json:\”revisionHistoryLimit,omitempty\” protobuf:\”varint,6,opt,name=revisionHistoryLimit\”`
                          Paused bool `json:\”paused,omitempty\” protobuf:\”varint,7,opt,name=paused\”`
                          ProgressDeadlineSeconds *int32 `json:\”progressDeadlineSeconds,omitempty\” protobuf:\”varint,9,opt,name=progressDeadlineSeconds\”`
                          }

                          对应k8s的yml文件中如下部分

                          spec:
                          ……

                          和k8s用yml文件创建deployment一样,这一部分是我们主要要传入的信息。

                          1) Replicas(spec.replicas)

                          一个 int的指针,因此赋值的时候我们只好先定义int变量,在把指针赋给它

                          2)LabelSelector(spec.selector)

                          所属包:"k8s.io/apimachinery/pkg/apis/meta/v1"

                          type LabelSelector struct {
                          MatchLabels map[string]string `json:\”matchLabels,omitempty\” protobuf:\”bytes,1,rep,name=matchLabels\”`
                          MatchExpressions []LabelSelectorRequirement `json:\”matchExpressions,omitempty\” protobuf:\”bytes,2,rep,name=matchExpressions\”`
                          }

                          和k8s用yml文件创建deployment一样,我们主要用其中matchLabels打标签:

                          spec:
                          selector:
                          matchLabels:
                          app: nginx

                          代码种示例如下

                          Selector: &metaV1.LabelSelector{
                          MatchLabels: map[string]string{
                          \”app\”: \”nginx\”,
                          },
                          },

                          3)PodTemplateSpec(spec.template)

                          所在包:"k8s.io/api/core/v1"

                          type PodTemplateSpec struct {
                          v1.ObjectMeta `json:\”metadata,omitempty\” protobuf:\”bytes,1,opt,name=metadata\”`
                          Spec PodSpec `json:\”spec,omitempty\” protobuf:\”bytes,2,opt,name=spec\”`
                          }

                          对应k8s的yml文件中如下部分,顾名思义,这一部分定义的是pod的模板。

                          spec:
                          ……
                          template:
                          ……

                          4)ObjectMeta (spec.template.metadata)

                          所在包:"k8s.io/apimachinery/pkg/apis/meta/v1"

                          type ObjectMeta struct {
                          Name string `json:\”name,omitempty\” protobuf:\”bytes,1,opt,name=name\”`
                          GenerateName string `json:\”generateName,omitempty\” protobuf:\”bytes,2,opt,name=generateName\”`
                          Namespace string `json:\”namespace,omitempty\” protobuf:\”bytes,3,opt,name=namespace\”`
                          SelfLink string `json:\”selfLink,omitempty\” protobuf:\”bytes,4,opt,name=selfLink\”`
                          UID types.UID `json:\”uid,omitempty\” protobuf:\”bytes,5,opt,name=uid,casttype=k8s.io/kubernetes/pkg/types.UID\”`
                          ResourceVersion string `json:\”resourceVersion,omitempty\” protobuf:\”bytes,6,opt,name=resourceVersion\”`
                          Generation int64 `json:\”generation,omitempty\” protobuf:\”varint,7,opt,name=generation\”`
                          CreationTimestamp Time `json:\”creationTimestamp,omitempty\” protobuf:\”bytes,8,opt,name=creationTimestamp\”`
                          DeletionTimestamp *Time `json:\”deletionTimestamp,omitempty\” protobuf:\”bytes,9,opt,name=deletionTimestamp\”`
                          DeletionGracePeriodSeconds *int64 `json:\”deletionGracePeriodSeconds,omitempty\” protobuf:\”varint,10,opt,name=deletionGracePeriodSeconds\”`
                          Labels map[string]string `json:\”labels,omitempty\” protobuf:\”bytes,11,rep,name=labels\”`
                          Annotations map[string]string `json:\”annotations,omitempty\” protobuf:\”bytes,12,rep,name=annotations\”`
                          OwnerReferences []OwnerReference `json:\”ownerReferences,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”uid\” protobuf:\”bytes,13,rep,name=ownerReferences\”`
                          Finalizers []string `json:\”finalizers,omitempty\” patchStrategy:\”merge\” protobuf:\”bytes,14,rep,name=finalizers\”`
                          ManagedFields []ManagedFieldsEntry `json:\”managedFields,omitempty\” protobuf:\”bytes,17,rep,name=managedFields\”`
                          }

                          对应k8s的yml文件中如下部分

                          spec:
                          ……
                          template:
                          metadata:
                          creationTimestamp: null
                          labels:
                          app: nginx

                          代码中示例如下

                          ObjectMeta: metaV1.ObjectMeta{
                          Labels: map[string]string{
                          \”app\”: deploymentName,
                          },
                          }

                          5)Spec(spec.template.spec)

                          type PodSpec struct {
                          Volumes []Volume `json:\”volumes,omitempty\” patchStrategy:\”merge,retainKeys\” patchMergeKey:\”name\” protobuf:\”bytes,1,rep,name=volumes\”`
                          InitContainers []Container `json:\”initContainers,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”name\” protobuf:\”bytes,20,rep,name=initContainers\”`
                          Containers []Container `json:\”containers\” patchStrategy:\”merge\” patchMergeKey:\”name\” protobuf:\”bytes,2,rep,name=containers\”`
                          EphemeralContainers []EphemeralContainer `json:\”ephemeralContainers,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”name\” protobuf:\”bytes,34,rep,name=ephemeralContainers\”`
                          RestartPolicy RestartPolicy `json:\”restartPolicy,omitempty\” protobuf:\”bytes,3,opt,name=restartPolicy,casttype=RestartPolicy\”`
                          TerminationGracePeriodSeconds *int64 `json:\”terminationGracePeriodSeconds,omitempty\” protobuf:\”varint,4,opt,name=terminationGracePeriodSeconds\”`
                          ActiveDeadlineSeconds *int64 `json:\”activeDeadlineSeconds,omitempty\” protobuf:\”varint,5,opt,name=activeDeadlineSeconds\”`
                          DNSPolicy DNSPolicy `json:\”dnsPolicy,omitempty\” protobuf:\”bytes,6,opt,name=dnsPolicy,casttype=DNSPolicy\”`
                          NodeSelector map[string]string `json:\”nodeSelector,omitempty\” protobuf:\”bytes,7,rep,name=nodeSelector\”`
                          ServiceAccountName string `json:\”serviceAccountName,omitempty\” protobuf:\”bytes,8,opt,name=serviceAccountName\”`
                          DeprecatedServiceAccount string `json:\”serviceAccount,omitempty\” protobuf:\”bytes,9,opt,name=serviceAccount\”`
                          AutomountServiceAccountToken *bool `json:\”automountServiceAccountToken,omitempty\” protobuf:\”varint,21,opt,name=automountServiceAccountToken\”`
                          NodeName string `json:\”nodeName,omitempty\” protobuf:\”bytes,10,opt,name=nodeName\”`
                          HostNetwork bool `json:\”hostNetwork,omitempty\” protobuf:\”varint,11,opt,name=hostNetwork\”`
                          HostPID bool `json:\”hostPID,omitempty\” protobuf:\”varint,12,opt,name=hostPID\”`
                          HostIPC bool `json:\”hostIPC,omitempty\” protobuf:\”varint,13,opt,name=hostIPC\”`
                          ShareProcessNamespace *bool `json:\”shareProcessNamespace,omitempty\” protobuf:\”varint,27,opt,name=shareProcessNamespace\”`
                          SecurityContext *PodSecurityContext `json:\”securityContext,omitempty\” protobuf:\”bytes,14,opt,name=securityContext\”`
                          ImagePullSecrets []LocalObjectReference `json:\”imagePullSecrets,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”name\” protobuf:\”bytes,15,rep,name=imagePullSecrets\”`
                          Hostname string `json:\”hostname,omitempty\” protobuf:\”bytes,16,opt,name=hostname\”`
                          Subdomain string `json:\”subdomain,omitempty\” protobuf:\”bytes,17,opt,name=subdomain\”`
                          Affinity *Affinity `json:\”affinity,omitempty\” protobuf:\”bytes,18,opt,name=affinity\”`
                          SchedulerName string `json:\”schedulerName,omitempty\” protobuf:\”bytes,19,opt,name=schedulerName\”`
                          Tolerations []Toleration `json:\”tolerations,omitempty\” protobuf:\”bytes,22,opt,name=tolerations\”`
                          HostAliases []HostAlias `json:\”hostAliases,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”ip\” protobuf:\”bytes,23,rep,name=hostAliases\”`
                          PriorityClassName string `json:\”priorityClassName,omitempty\” protobuf:\”bytes,24,opt,name=priorityClassName\”`
                          Priority *int32 `json:\”priority,omitempty\” protobuf:\”bytes,25,opt,name=priority\”`
                          DNSConfig *PodDNSConfig `json:\”dnsConfig,omitempty\” protobuf:\”bytes,26,opt,name=dnsConfig\”`
                          ReadinessGates []PodReadinessGate `json:\”readinessGates,omitempty\” protobuf:\”bytes,28,opt,name=readinessGates\”`
                          RuntimeClassName *string `json:\”runtimeClassName,omitempty\” protobuf:\”bytes,29,opt,name=runtimeClassName\”`
                          EnableServiceLinks *bool `json:\”enableServiceLinks,omitempty\” protobuf:\”varint,30,opt,name=enableServiceLinks\”`
                          PreemptionPolicy *PreemptionPolicy `json:\”preemptionPolicy,omitempty\” protobuf:\”bytes,31,opt,name=preemptionPolicy\”`
                          Overhead ResourceList `json:\”overhead,omitempty\” protobuf:\”bytes,32,opt,name=overhead\”`
                          TopologySpreadConstraints []TopologySpreadConstraint `json:\”topologySpreadConstraints,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”topologyKey\” protobuf:\”bytes,33,opt,name=topologySpreadConstraints\”`
                          SetHostnameAsFQDN *bool `json:\”setHostnameAsFQDN,omitempty\” protobuf:\”varint,35,opt,name=setHostnameAsFQDN\”`
                          OS *PodOS `json:\”os,omitempty\” protobuf:\”bytes,36,opt,name=os\”`
                          HostUsers *bool `json:\”hostUsers,omitempty\” protobuf:\”bytes,37,opt,name=hostUsers\”`
                          }

                          对应k8s的yml文件中如下部分,是deployment中pod模板的规格信息

                          spec:
                          ……
                          template:
                          spec:
                          ……

                          这一部分通常是我们主要填写的,因为内容较多,目前不展开介绍了,以后用到我们再详细说明。现在我们写一个代码中的简单示例

                          Spec: coreV1.PodSpec{
                          Containers: []coreV1.Container{
                          {
                          Name: deploymentName,
                          Image: image,
                          Ports: []coreV1.ContainerPort{
                          {
                          ContainerPort: portNum,
                          },
                          },
                          },
                          },
                          }

                          1.6 DeploymentStatus

                          所在包:"k8s.io/api/apps/v1"

                          type DeploymentStatus struct {
                          ObservedGeneration int64 `json:\”observedGeneration,omitempty\” protobuf:\”varint,1,opt,name=observedGeneration\”`
                          Replicas int32 `json:\”replicas,omitempty\” protobuf:\”varint,2,opt,name=replicas\”`
                          UpdatedReplicas int32 `json:\”updatedReplicas,omitempty\” protobuf:\”varint,3,opt,name=updatedReplicas\”`
                          ReadyReplicas int32 `json:\”readyReplicas,omitempty\” protobuf:\”varint,7,opt,name=readyReplicas\”`
                          AvailableReplicas int32 `json:\”availableReplicas,omitempty\” protobuf:\”varint,4,opt,name=availableReplicas\”`
                          UnavailableReplicas int32 `json:\”unavailableReplicas,omitempty\” protobuf:\”varint,5,opt,name=unavailableReplicas\”`
                          Conditions []DeploymentCondition `json:\”conditions,omitempty\” patchStrategy:\”merge\” patchMergeKey:\”type\” protobuf:\”bytes,6,rep,name=conditions\”`
                          CollisionCount *int32 `json:\”collisionCount,omitempty\” protobuf:\”varint,8,opt,name=collisionCount\”`
                          }

                          deployment的状态,入门中不必过多关注

                          1.7 对照yml文件示例

                          附原生k8s集群上一个deployment 信息,大家可以对照理解一下以上结构体

                          apiVersion: apps/v1
                          kind: Deployment
                          metadata:
                          annotations:
                          deployment.kubernetes.io/revision: \”4\”
                          field.cattle.io/publicEndpoints: \'[{\”addresses\”:[\”10.10.117.53\”],\”port\”:30051,\”protocol\”:\”TCP\”,\”serviceName\”:\”liubei:nginx\”,\”allNodes\”:true}]\’
                          creationTimestamp: \”2022-09-28T06:07:39Z\”
                          generation: 6
                          name: nginx
                          namespace: liubei
                          resourceVersion: \”19656054\”
                          selfLink: /apis/apps/v1/namespaces/liubei/deployments/nginx
                          uid: dcbf8aac-1c23-4be5-943e-c9f2b3e7c767
                          spec:
                          progressDeadlineSeconds: 600
                          replicas: 1
                          revisionHistoryLimit: 10
                          selector:
                          matchLabels:
                          app: nginx
                          strategy:
                          rollingUpdate:
                          maxSurge: 25%
                          maxUnavailable: 25%
                          type: RollingUpdate
                          template:
                          metadata:
                          creationTimestamp: null
                          labels:
                          app: nginx
                          spec:
                          containers:
                          – image: harbocto.xxx.com.cn/public/nginx:1.19.2-alpine
                          imagePullPolicy: Always
                          name: nginx
                          ports:
                          – containerPort: 80
                          protocol: TCP
                          resources: {}
                          terminationMessagePath: /dev/termination-log
                          terminationMessagePolicy: File
                          dnsPolicy: ClusterFirst
                          restartPolicy: Always
                          schedulerName: default-scheduler
                          securityContext: {}
                          terminationGracePeriodSeconds: 30
                          status:
                          availableReplicas: 1
                          conditions:
                          – lastTransitionTime: \”2022-09-28T06:07:44Z\”
                          lastUpdateTime: \”2022-09-28T06:07:44Z\”
                          message: Deployment has minimum availability.
                          reason: MinimumReplicasAvailable
                          status: \”True\”
                          type: Available
                          – lastTransitionTime: \”2022-09-28T06:07:39Z\”
                          lastUpdateTime: \”2022-09-28T13:01:17Z\”
                          message: ReplicaSet \”nginx-b6588447f\” has successfully progressed.
                          reason: NewReplicaSetAvailable
                          status: \”True\”
                          type: Progressing
                          observedGeneration: 6
                          readyReplicas: 1
                          replicas: 1
                          updatedReplicas: 1

                          2. Deployment list

                          语法

                          func (DeploymentInterface) List(ctx context.Context, opts v1.ListOptions) (*v1.DeploymentList, error)

                          • 语法示例

                          deploymentList,err = clientSet.AppsV1().Deployments(namespaceName).List(context.TODO(), metaV1.ListOptions{})

                          完整示例

                          • 创建函数

                          package crowK8S
                          import (
                          \”context\”
                          appsV1 \”k8s.io/api/apps/v1\”
                          metaV1 \”k8s.io/apimachinery/pkg/apis/meta/v1\”
                          \”k8s.io/client-go/kubernetes\”
                          )
                          func GetDeploymentList(clientSet *kubernetes.Clientset,namespaceName string)(deploymentList *appsV1.DeploymentList,err error) {
                          deploymentList,err = clientSet.AppsV1().Deployments(namespaceName).List(context.TODO(), metaV1.ListOptions{})
                          if err != nil{
                          return nil, err
                          }
                          return deploymentList, err
                          }

                          说明:如果namespaceName 为空字串,则查所有namespace

                          • 引用函数

                          package main
                          import (
                          \”fmt\”
                          \”go-k8s/crowK8S\”
                          )
                          func main() {
                          clientSet,err := crowK8S.ConnectK8s()
                          if err !=nil {
                          fmt.Println(err)
                          }
                          deploymentList,err := crowK8S.GetDeploymentList(clientSet,\”kube-system\”)
                          if err != nil {
                          fmt.Println(err)
                          }
                          for _,deployment := range deploymentList.Items{
                          fmt.Printf(\”%+v\\n\”,deployment.Name)
                          }
                          }

                          3. Get Deployment

                          语法示例

                          • 定义函数

                          package crowK8S
                          import (
                          \”context\”
                          appsV1 \”k8s.io/api/apps/v1\”
                          metaV1 \”k8s.io/apimachinery/pkg/apis/meta/v1\”
                          \”k8s.io/client-go/kubernetes\”
                          )
                          func GetDeployment(clientSet *kubernetes.Clientset,namespaceName string,deploymentName string)(deploymentInfo *appsV1.Deployment,err error) {
                          deploymentInfo,err = clientSet.AppsV1().Deployments(namespaceName).Get(context.TODO(), deploymentName,metaV1.GetOptions{})
                          if err != nil{
                          return nil, err
                          }
                          return deploymentInfo, err
                          }

                          • 引用

                          package main
                          import (
                          \”fmt\”
                          \”go-k8s/crowK8S\”
                          )
                          func main() {
                          clientSet,err := crowK8S.ConnectK8s()
                          if err !=nil {
                          fmt.Println(err)
                          }
                          deploymentInfo,err := crowK8S.GetDeployment(clientSet,\”kube-system\”,\”coredns\”)
                          if err != nil {
                          fmt.Println(err)
                          }
                          fmt.Printf(\”%+v\\n\”,deploymentInfo)
                          }

                          • 结果输出

                          说明:打印是一个json字串,以下是我格式化后的结果:

                          {
                          ObjectMeta: {
                          coredns kube – system / apis / apps / v1 / namespaces / kube – system / deployments / coredns e6bfc631 – fe3a – 4863 – b202 – a96188c4c3f4 5154836 1 2022 – 07 – 12 16: 41: 38 + 0800 CST < nil > < nil > map[k8s – app: kube – dns] map[deployment.kubernetes.io / revision: 1][][][{
                          kubeadm Update apps / v1 2022 – 07 – 12 16: 41: 38 + 0800 CST FieldsV1 {
                          \”f:metadata\”: {
                          \”f:labels\”: {
                          \”.\”: {},
                          \”f:k8s-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:k8s-app\”: {}
                          }
                          },
                          \”f:spec\”: {
                          \”f:containers\”: {
                          \”k:{\\\”name\\\”:\\\”coredns\\\”}\”: {
                          \”.\”: {},
                          \”f:args\”: {},
                          \”f:image\”: {},
                          \”f:imagePullPolicy\”: {},
                          \”f:livenessProbe\”: {
                          \”.\”: {},
                          \”f:failureThreshold\”: {},
                          \”f:httpGet\”: {
                          \”.\”: {},
                          \”f:path\”: {},
                          \”f:port\”: {},
                          \”f:scheme\”: {}
                          },
                          \”f:initialDelaySeconds\”: {},
                          \”f:periodSeconds\”: {},
                          \”f:successThreshold\”: {},
                          \”f:timeoutSeconds\”: {}
                          },
                          \”f:name\”: {},
                          \”f:ports\”: {
                          \”.\”: {},
                          \”k:{\\\”containerPort\\\”:53,\\\”protocol\\\”:\\\”TCP\\\”}\”: {
                          \”.\”: {},
                          \”f:containerPort\”: {},
                          \”f:name\”: {},
                          \”f:protocol\”: {}
                          },
                          \”k:{\\\”containerPort\\\”:53,\\\”protocol\\\”:\\\”UDP\\\”}\”: {
                          \”.\”: {},
                          \”f:containerPort\”: {},
                          \”f:name\”: {},
                          \”f:protocol\”: {}
                          },
                          \”k:{\\\”containerPort\\\”:9153,\\\”protocol\\\”:\\\”TCP\\\”}\”: {
                          \”.\”: {},
                          \”f:containerPort\”: {},
                          \”f:name\”: {},
                          \”f:protocol\”: {}
                          }
                          },
                          \”f:readinessProbe\”: {
                          \”.\”: {},
                          \”f:failureThreshold\”: {},
                          \”f:httpGet\”: {
                          \”.\”: {},
                          \”f:path\”: {},
                          \”f:port\”: {},
                          \”f:scheme\”: {}
                          },
                          \”f:periodSeconds\”: {},
                          \”f:successThreshold\”: {},
                          \”f:timeoutSeconds\”: {}
                          },
                          \”f:resources\”: {
                          \”.\”: {},
                          \”f:limits\”: {
                          \”.\”: {},
                          \”f:memory\”: {}
                          },
                          \”f:requests\”: {
                          \”.\”: {},
                          \”f:cpu\”: {},
                          \”f:memory\”: {}
                          }
                          },
                          \”f:securityContext\”: {
                          \”.\”: {},
                          \”f:allowPrivilegeEscalation\”: {},
                          \”f:capabilities\”: {
                          \”.\”: {},
                          \”f:add\”: {},
                          \”f:drop\”: {}
                          },
                          \”f:readOnlyRootFilesystem\”: {}
                          },
                          \”f:terminationMessagePath\”: {},
                          \”f:terminationMessagePolicy\”: {},
                          \”f:volumeMounts\”: {
                          \”.\”: {},
                          \”k:{\\\”mountPath\\\”:\\\”/etc/coredns\\\”}\”: {
                          \”.\”: {},
                          \”f:mountPath\”: {},
                          \”f:name\”: {},
                          \”f:readOnly\”: {}
                          }
                          }
                          }
                          },
                          \”f:dnsPolicy\”: {},
                          \”f:nodeSelector\”: {
                          \”.\”: {},
                          \”f:kubernetes.io/os\”: {}
                          },
                          \”f:priorityClassName\”: {},
                          \”f:restartPolicy\”: {},
                          \”f:schedulerName\”: {},
                          \”f:securityContext\”: {},
                          \”f:serviceAccount\”: {},
                          \”f:serviceAccountName\”: {},
                          \”f:terminationGracePeriodSeconds\”: {},
                          \”f:tolerations\”: {},
                          \”f:volumes\”: {
                          \”.\”: {},
                          \”k:{\\\”name\\\”:\\\”config-volume\\\”}\”: {
                          \”.\”: {},
                          \”f:configMap\”: {
                          \”.\”: {},
                          \”f:defaultMode\”: {},
                          \”f:items\”: {},
                          \”f:name\”: {}
                          },
                          \”f:name\”: {}
                          }
                          }
                          }
                          }
                          }
                          }
                          } {
                          kube – controller – manager Update apps / v1 2022 – 08 – 05 16: 36: 43 + 0800 CST FieldsV1 {
                          \”f:metadata\”: {
                          \”f:annotations\”: {
                          \”.\”: {},
                          \”f:deployment.kubernetes.io/revision\”: {}
                          }
                          },
                          \”f:status\”: {
                          \”f:availableReplicas\”: {},
                          \”f:conditions\”: {
                          \”.\”: {},
                          \”k:{\\\”type\\\”:\\\”Available\\\”}\”: {
                          \”.\”: {},
                          \”f:lastTransitionTime\”: {},
                          \”f:lastUpdateTime\”: {},
                          \”f:message\”: {},
                          \”f:reason\”: {},
                          \”f:status\”: {},
                          \”f:type\”: {}
                          },
                          \”k:{\\\”type\\\”:\\\”Progressing\\\”}\”: {
                          \”.\”: {},
                          \”f:lastTransitionTime\”: {},
                          \”f:lastUpdateTime\”: {},
                          \”f:message\”: {},
                          \”f:reason\”: {},
                          \”f:status\”: {},
                          \”f:type\”: {}
                          }
                          },
                          \”f:observedGeneration\”: {},
                          \”f:readyReplicas\”: {},
                          \”f:replicas\”: {},
                          \”f:updatedReplicas\”: {}
                          }
                          }
                          }]
                          },
                          Spec: DeploymentSpec {
                          Replicas: * 2,
                          Selector: & v1.LabelSelector {
                          MatchLabels: map[string] string {
                          k8s – app: kube – dns,
                          },
                          MatchExpressions: [] LabelSelectorRequirement {},
                          },
                          Template: {
                          {
                          0 0001 – 01 – 01 00: 00: 00 + 0000 UTC < nil > < nil > map[k8s – app: kube – dns] map[][][][]
                          } {
                          [{
                          config – volume {
                          nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil ConfigMapVolumeSource {
                          LocalObjectReference: LocalObjectReference {
                          Name: coredns,
                          },
                          Items: [] KeyToPath {
                          KeyToPath {
                          Key: Corefile,
                          Path: Corefile,
                          Mode: nil,
                          },
                          },
                          DefaultMode: * 420,
                          Optional: nil,
                          }
                          nil nil nil nil nil nil nil nil nil nil
                          }
                          }][][{
                          coredns registry.aliyuncs.com / google_containers / coredns: v1 .8 .0[][-conf / etc / coredns / Corefile][{
                          dns 0 53 UDP
                          } {
                          dns – tcp 0 53 TCP
                          } {
                          metrics 0 9153 TCP
                          }][][] {
                          map[memory: {
                          {
                          178257920 0
                          } { < nil >
                          }
                          170 Mi BinarySI
                          }] map[cpu: {
                          {
                          100 – 3
                          } { < nil >
                          }
                          100 m DecimalSI
                          }
                          memory: {
                          {
                          73400320 0
                          } { < nil >
                          }
                          70 Mi BinarySI
                          }]
                          }[{
                          config – volume true / etc / coredns < nil >
                          }][] & Probe {
                          ProbeHandler: ProbeHandler {
                          Exec: nil,
                          HTTPGet: & HTTPGetAction {
                          Path: /health,Port:{0 8080 },Host:,Scheme:HTTP,HTTPHeaders:[]HTTPHeader{},},TCPSocket:nil,GRPC:nil,},InitialDelaySeconds:60,TimeoutSeconds:5,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:5,TerminationGracePeriodSeconds:nil,} &Probe{ProbeHandler:ProbeHandler{Exec:nil,HTTPGet:&HTTPGetAction{Path:/ready,
                          Port: {
                          0 8181
                          },
                          Host: ,
                          Scheme: HTTP,
                          HTTPHeaders: [] HTTPHeader {},
                          },
                          TCPSocket: nil,
                          GRPC: nil,
                          },
                          InitialDelaySeconds: 0,
                          TimeoutSeconds: 1,
                          PeriodSeconds: 10,
                          SuccessThreshold: 1,
                          FailureThreshold: 3,
                          TerminationGracePeriodSeconds: nil,
                          }
                          nil nil / dev / termination – log File IfNotPresent & SecurityContext {
                          Capabilities: & Capabilities {
                          Add: [NET_BIND_SERVICE],
                          Drop: [all],
                          },
                          Privileged: nil,
                          SELinuxOptions: nil,
                          RunAsUser: nil,
                          RunAsNonRoot: nil,
                          ReadOnlyRootFilesystem: * true,
                          AllowPrivilegeEscalation: * false,
                          RunAsGroup: nil,
                          ProcMount: nil,
                          WindowsOptions: nil,
                          SeccompProfile: nil,
                          }
                          false false false
                          }][] Always 0xc000517f88 < nil > Default map[kubernetes.io / os: linux] coredns coredns < nil > false false false < nil > & PodSecurityContext {
                          SELinuxOptions: nil,
                          RunAsUser: nil,
                          RunAsNonRoot: nil,
                          SupplementalGroups: [],
                          FSGroup: nil,
                          RunAsGroup: nil,
                          Sysctls: [] Sysctl {},
                          WindowsOptions: nil,
                          FSGroupChangePolicy: nil,
                          SeccompProfile: nil,
                          }[] nil
                          default -scheduler[{
                          CriticalAddonsOnly Exists < nil >
                          } {
                          node – role.kubernetes.io / master NoSchedule < nil >
                          } {
                          node – role.kubernetes.io / control – plane NoSchedule < nil >
                          }][] system – cluster – critical < nil > nil[] < nil > < nil > < nil > map[][] < nil > nil < nil >
                          }
                          },
                          Strategy: DeploymentStrategy {
                          Type: RollingUpdate,
                          RollingUpdate: & RollingUpdateDeployment {
                          MaxUnavailable: 1,
                          MaxSurge: 25 % ,
                          },
                          },
                          MinReadySeconds: 0,
                          RevisionHistoryLimit: * 10,
                          Paused: false,
                          ProgressDeadlineSeconds: * 600,
                          },
                          Status: DeploymentStatus {
                          ObservedGeneration: 1,
                          Replicas: 2,
                          UpdatedReplicas: 2,
                          AvailableReplicas: 2,
                          UnavailableReplicas: 0,
                          Conditions: [] DeploymentCondition {
                          DeploymentCondition {
                          Type: Progressing,
                          Status: True,
                          Reason: NewReplicaSetAvailable,
                          Message: ReplicaSet \”coredns-59d64cd4d4\”
                          has successfully progressed.,
                          LastUpdateTime: 2022 – 07 – 12 16: 44: 35 + 0800 CST,
                          LastTransitionTime: 2022 – 07 – 12 16: 41: 49 + 0800 CST,
                          }, DeploymentCondition {
                          Type: Available,
                          Status: True,
                          Reason: MinimumReplicasAvailable,
                          Message: Deployment has minimum availability.,
                          LastUpdateTime: 2022 – 08 – 05 16: 36: 39 + 0800 CST,
                          LastTransitionTime: 2022 – 08 – 05 16: 36: 39 + 0800 CST,
                          },
                          },
                          ReadyReplicas: 2,
                          CollisionCount: nil,
                          },
                          }

                          4. Create Deployment

                          语法示例

                          deployment,err := clientset.AppsV1().Deployments(namespace).Create(context.TODO(),deployment,metaV1.CreateOptions{})

                          完整示例

                          • yml文件对照

                          以下是边这个yml文件为例,我们就照着这个内容写代码:

                          apiVersion: apps/v1
                          kind: Deployment
                          metadata:
                          name: nginx
                          namespace: liubei
                          spec:
                          replicas: 1
                          selector:
                          matchLabels:
                          app: nginx
                          template:
                          metadata:
                          labels:
                          app: nginx
                          spec:
                          containers:
                          – name: nginx
                          image: harbocto.xxx.com.cn/public/nginx
                          imagePullPolicy: Always
                          ports:
                          – containerPort: 80

                          • 定义函数

                          package crowK8S
                          import (
                          \”context\”
                          appsV1 \”k8s.io/api/apps/v1\”
                          coreV1 \”k8s.io/api/core/v1\”
                          metaV1 \”k8s.io/apimachinery/pkg/apis/meta/v1\”
                          \”k8s.io/client-go/kubernetes\”
                          )
                          func CreateSimpleDeployment(clientSet *kubernetes.Clientset,namespaceName string,deploymentName string,image string,portNum int32,replicas int32)(deploymentInfo *appsV1.Deployment,err error) {
                          namespace := namespaceName
                          //这个结构和原生k8s启动deployment的yml文件结构完全一样,对着写就好
                          deployment := &amp;appsV1.Deployment{
                          ObjectMeta: metaV1.ObjectMeta{
                          Name: deploymentName,
                          },
                          Spec: appsV1.DeploymentSpec{
                          Replicas: &amp;replicas,
                          Selector: &amp;metaV1.LabelSelector{
                          MatchLabels: map[string]string{
                          \”app\”:deploymentName,
                          },
                          },
                          Template: coreV1.PodTemplateSpec{
                          ObjectMeta: metaV1.ObjectMeta{
                          Labels: map[string]string{
                          \”app\”: deploymentName,
                          },
                          },
                          Spec: coreV1.PodSpec{
                          Containers: []coreV1.Container{
                          {
                          Name: deploymentName,
                          Image: image,
                          Ports: []coreV1.ContainerPort{
                          {
                          ContainerPort: portNum,
                          },
                          },
                          },
                          },
                          },
                          },
                          },
                          }
                          deploymentInfo,err = clientSet.AppsV1().Deployments(namespace).Create(context.TODO(),deployment,metaV1.CreateOptions{})
                          if err != nil {
                          return deploymentInfo,err
                          }
                          return deploymentInfo,nil
                          }

                          • 调用

                          package main
                          import (
                          \”fmt\”
                          \”go-k8s/crowK8S\”
                          )
                          func main() {
                          clientSet,err := crowK8S.ConnectK8s()
                          if err !=nil {
                          fmt.Println(err)
                          }
                          deploymentInfo,err := crowK8S.CreateSimpleDeployment(clientSet,\”liubei\”,\”nginx\”,\”harbocto.xxx.com.cn/public/nginx\”,80,1)
                          if err != nil {
                          fmt.Println(err)
                          }
                          fmt.Printf(\”%+v\\n\”,deploymentInfo)
                          }

                          输出

                          &Deployment{ObjectMeta:{nginx liubei /apis/apps/v1/namespaces/liubei/deployments/nginx dcbf8aac-1c23-4be5-943e-c9f2b3e7c767 19114656 1 2022-09-28 14:07:39 +0800 CST <nil> <nil> map[] map[] [] [] [{___6go_build_main_go.exe Update apps/v1 2022-09-28 14:07:39 +0800 CST FieldsV1 {"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:DeploymentSpec{Replicas:*1,Selector:&v1.LabelSelector{MatchLabels:map[string]string{app: nginx,},MatchExpressions:[]LabelSelectorRequirement{},},Template:{{ 0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[app:nginx] map[] [] [] []} {[] [] [{nginx harbocto.xxx.com.cn/public/nginx [] [] [{ 0 80 TCP }] [] [] {map[] map[]} [] [] nil nil nil nil /dev/termination-log File Always nil false false false}] [] Always 0xc000560040 <nil> ClusterFirst map[] <nil> false false false <nil> PodSecurityContext{SELinuxOptions:nil,RunAsUser:nil,RunAsNonRoot:nil,SupplementalGroups:[],FSGroup:nil,RunAsGroup:nil,Sysctls:[]Sysctl{},WindowsOptions:nil,FSGroupChangePolicy:nil,SeccompProfile:nil,} [] nil default-scheduler [] [] <nil> nil [] <nil> <nil> <nil> map[] [] <nil> nil <nil>}},Strategy:DeploymentStrategy{Type:RollingUpdate,RollingUpdate:&RollingUpdateDeployment{MaxUnavailable:25%,MaxSurge:25%,},},MinReadySeconds:0,RevisionHistoryLimit:*10,Paused:false,ProgressDeadlineSeconds:*600,},Status:DeploymentStatus{ObservedGeneration:0,Replicas:0,UpdatedReplicas:0,AvailableReplicas:0,UnavailableReplicas:0,Conditions:[]DeploymentCondition{},ReadyReplicas:0,CollisionCount:nil,},}

                          5. PUT Deployment

                          语法

                          func (DeploymentInterface) Update(ctx context.Context, deployment *v1.Deployment, opts v1.UpdateOptions) (*v1.Deployment, error)

                          • 语法示例

                          deploymentInfo,err = clientSet.AppsV1().Deployments(namespaceName).Update(context.TODO(),deployment,metaV1.UpdateOptions{})

                          完整示例(修改镜像)

                          • 创建函数

                          package crowK8S
                          import (
                          \”context\”
                          \”fmt\”
                          appsV1 \”k8s.io/api/apps/v1\”
                          coreV1 \”k8s.io/api/core/v1\”
                          metaV1 \”k8s.io/apimachinery/pkg/apis/meta/v1\”
                          \”k8s.io/client-go/kubernetes\”
                          )
                          func ApplyDeploymentByImage(clientSet *kubernetes.Clientset,namespaceName string,deploymentName string,image string)(deploymentInfo *appsV1.Deployment,err error) {
                          deployment,err := clientSet.AppsV1().Deployments(namespaceName).Get(context.TODO(),deploymentName,metaV1.GetOptions{})
                          if err !=nil {
                          return deploymentInfo,err
                          }
                          //deployment.Spec.Replicas = &amp;replicas
                          deployment.Spec.Template.Spec.Containers[0].Image = image
                          deploymentInfo,err = clientSet.AppsV1().Deployments(namespaceName).Update(context.TODO(),deployment,metaV1.UpdateOptions{})
                          if err !=nil {
                          return deploymentInfo,err
                          }
                          return deploymentInfo,nil
                          }

                          • 引用

                          package main
                          import (
                          \”fmt\”
                          \”go-k8s/crowK8S\”
                          )
                          func main() {
                          clientSet,err := crowK8S.ConnectK8s()
                          if err !=nil {
                          fmt.Println(err)
                          }
                          deploymentInfo,err := crowK8S.ApplyDeploymentByImage(clientSet,\”liubei\”,\”nginx\”,\”harbocto.xxx.com.cn/public/nginx:1.19.2-alpine\”)
                          if err != nil {
                          fmt.Println(err)
                          }
                          fmt.Printf(\”%+v\\n\”,deploymentInfo)
                          }

                          输出

                          &Deployment{ObjectMeta:{nginx liubei /apis/apps/v1/namespaces/liubei/deployments/nginx dcbf8aac-1c23-4be5-943e-c9f2b3e7c767 19190799 4 2022-09-28 14:07:39 +0800 CST <nil> <nil> map[] map[deployment.kubernetes.io/revision:3] [] [] [{___6go_build_main_go.exe Update apps/v1 2022-09-28 14:07:39 +0800 CST FieldsV1 {"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":{}}}}} } {kube-controller-manager Update apps/v1 2022-09-28 21:00:18 +0800 CST FieldsV1 {"f:metadata":{"f:annotations":{".":{},"f:deployment.kubernetes.io/revision":{}}},"f:status":{"f:availableReplicas":{},"f:conditions":{".":{},"k:{\\"type\\":\\"Available\\"}":{".":{},"f:lastTransitionTime":{},"f:lastUpdateTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}},"k:{\\"type\\":\\"Progressing\\"}":{".":{},"f:lastTransitionTime":{},"f:lastUpdateTime":{},"f:message":{},"f:reason":{},"f:status":{},"f:type":{}}},"f:observedGeneration":{},"f:readyReplicas":{},"f:replicas":{},"f:updatedReplicas":{}}} }]},Spec:DeploymentSpec{Replicas:*1,Selector:&v1.LabelSelector{MatchLabels:map[string]string{app: nginx,},MatchExpressions:[]LabelSelectorRequirement{},},Template:{{ 0 0001-01-01 00:00:00 +0000 UTC <nil> <nil> map[app:nginx] map[] [] [] []} {[] [] [{nginx harbocto.boe.com.cn/public/nginx:1.19.2-alpine [] [] [{ 0 80 TCP }] [] [] {map[] map[]} [] [] nil nil nil nil /dev/termination-log File Always nil false false false}] [] Always 0xc00043a180 <nil> ClusterFirst map[] <nil> false false false <nil> PodSecurityContext{SELinuxOptions:nil,RunAsUser:nil,RunAsNonRoot:nil,SupplementalGroups:[],FSGroup:nil,RunAsGroup:nil,Sysctls:[]Sysctl{},WindowsOptions:nil,FSGroupChangePolicy:nil,SeccompProfile:nil,} [] nil default-scheduler [] [] <nil> nil [] <nil> <nil> <nil> map[] [] <nil> nil <nil>}},Strategy:DeploymentStrategy{Type:RollingUpdate,RollingUpdate:&RollingUpdateDeployment{MaxUnavailable:25%,MaxSurge:25%,},},MinReadySeconds:0,RevisionHistoryLimit:*10,Paused:false,ProgressDeadlineSeconds:*600,},Status:DeploymentStatus{ObservedGeneration:3,Replicas:1,UpdatedReplicas:1,AvailableReplicas:1,UnavailableReplicas:0,Conditions:[]DeploymentCondition{DeploymentCondition{Type:Available,Status:True,Reason:MinimumReplicasAvailable,Message:Deployment has minimum availability.,LastUpdateTime:2022-09-28 14:07:44 +0800 CST,LastTransitionTime:2022-09-28 14:07:44 +0800 CST,},DeploymentCondition{Type:Progressing,Status:True,Reason:NewReplicaSetAvailable,Message:ReplicaSet "nginx-86d45dbbf4" has successfully progressed.,LastUpdateTime:2022-09-28 21:00:18 +0800 CST,LastTransitionTime:2022-09-28 14:07:39 +0800 CST,},},ReadyReplicas:1,CollisionCount:nil,},}

                          完整示例(修改副本数)

                          • 创建函数

                          func ApplyDeploymentByReplicas(clientSet *kubernetes.Clientset,namespaceName string,deploymentName string,replicas int32)(deploymentInfo *appsV1.Deployment,err error) {
                          deployment,err := clientSet.AppsV1().Deployments(namespaceName).Get(context.TODO(),deploymentName,metaV1.GetOptions{})
                          if err !=nil {
                          return deploymentInfo,err
                          }
                          deployment.Spec.Replicas = &replicas
                          deploymentInfo,err = clientSet.AppsV1().Deployments(namespaceName).Update(context.TODO(),deployment,metaV1.UpdateOptions{})
                          if err !=nil {
                          return deploymentInfo,err
                          }
                          //fmt.Println(err,deployment)
                          return deploymentInfo,nil
                          }

                          6. Delete Deployment

                          语法

                          func (DeploymentInterface) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error

                          • 语法示例

                          err = clientSet.AppsV1().Deployments(namespaceName).Delete(context.TODO(),deploymentName,metaV1.DeleteOptions{})

                          完整示例

                          • 创建函数

                          package crowK8S
                          import (
                          \”context\”
                          metaV1 \”k8s.io/apimachinery/pkg/apis/meta/v1\”
                          \”k8s.io/client-go/kubernetes\”
                          )
                          func DeleteDeployment(clientSet *kubernetes.Clientset,namespaceName string,deploymentName string)(err error) {
                          err = clientSet.AppsV1().Deployments(namespaceName).Delete(context.TODO(),deploymentName,metaV1.DeleteOptions{})
                          if err != nil {
                          return err
                          }
                          return nil
                          }

                          • 调用

                          import (
                          \”fmt\”
                          \”go-k8s/crowK8S\”
                          )
                          func main() {
                          clientSet,err := crowK8S.ConnectK8s()
                          if err !=nil {
                          fmt.Println(err)
                          }
                          err = crowK8S.DeleteDeployment(clientSet,\”liubei\”,\”nginx\”)
                          if err != nil {
                          fmt.Println(err)
                          }else {
                          fmt.Println(\”删除成功\”)
                          }
                          }

                          以上就是Go语言开发k8s之Deployment操作解析的详细内容,更多关于Go开发k8s Deployment操作的资料请关注悠久资源网其它相关文章!

                          您可能感兴趣的文章:

                          • k8s跨服务调用入门到实战示例详解
                          • k8s 常见面试题集锦
                          • k8s自身原理service及实现图文示例解析
                          • golang简易实现 k8s 的yaml上传并应用示例方案
                          • Go语言开发k8s之ConfigMap操作解析
                          • k8s设置非强一致反亲和性示例

                          收藏 (0) 打赏

                          感谢您的支持,我会继续努力的!

                          打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
                          点赞 (0)

                          悠久资源 Golang Go语言开发k8s之Deployment操作解析 https://www.u-9.cn/jiaoben/golang/101736.html

                          常见问题

                          相关文章

                          发表评论
                          暂无评论
                          官方客服团队

                          为您解决烦忧 - 24小时在线 专业服务