【クラウドネイティブ】K8S制御の詳細説明

1. ポッドコントローラー

1.1 ポッドコントローラーとその機能

  • ポッド コントローラー (ワークロードとも呼ばれる) は、ポッド リソースが期待されるステータスを確実に満たすようにポッドを管理するために使用される中間層です。ポッド リソースに障害が発生すると、再起動が試行されます。再起動ポリシーが無効な場合、ポッド リソースは再起動されます。 -作成した。

1.2 ポッド コントローラーにはさまざまな種類があります

  • 1. ReplicaSet: ユーザーに代わって指定された数のポッド コピーを作成し、ポッド コピーの数が期待されるステータスを満たしていることを確認し、ローリング自動拡張機能と縮小機能をサポートします。
    ReplicaSet は主に 3 つのコンポーネントで構成されます

(1) ユーザーが予期するポッド コピーの数
(2) ユーザーがどのポッドを管理するかを決定するラベル セレクター
(3) 既存のポッドの数が不十分な場合、ポッド リソース テンプレートに基づいて新しいポッドが作成され
、ユーザーがステートレス ポッド リソースを管理し、正確に応答できるようにします。ユーザー定義の目標数量ですが、RelicaSet は直接使用されるコントローラーではなく、Deployment が使用されます。

  • 2. デプロイメント: ReplicaSet 上で動作し、ステートレス アプリケーションの管理に使用され、現時点では最良のコントローラーです。ローリング更新およびロールバック機能をサポートし、宣言型構成も提供します。
    2 つのリソース オブジェクト ReplicaSet と Deployment は、RC の以前の役割を段階的に置き換えます。

  • 3. DaemonSet: クラスター内の各ノードが特定のポッド コピーのみを実行することを保証するために使用され、通常はシステム レベルのバックグラウンド タスクを実装するために使用されます。たとえば、ELK サービスの
    機能は次のとおりです。 サービスはステートレスであり、
    サービスはデーモン プロセスである必要があります。

  • 4. StatefulSet: ステートフル アプリケーションを管理する

  • 5. ジョブ: 完了したらすぐに終了します。再起動や再構築の必要はありません。

  • 6. Cronjob: 定期的なタスク制御。バックグラウンドで実行し続ける必要はありません。

1.3Podとコントローラーの関係

  • コントローラー: クラスター上のコンテナーを管理および実行するポッド オブジェクト。ポッドはラベル セレクターを通じて関連付けられます。
  • ポッドは、コントローラーを介してスケーリングやアップグレードなどのアプリケーションの運用とメンテナンスを実装します。

2.展開

ステートレス アプリケーションのデプロイオンライン デプロイメント、レプリカ設定、ローリング アップグレード、ロールバックなどの機能による
Pod と ReplicaSet の管理新しいイメージのみの更新などの宣言的な更新の提供アプリケーション シナリオ: Web サービス


vim nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx	
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80

kubectl create -f nginx-deployment.yaml

kubectl get pods,deploy,rs

コントローラー構成の表示

kubectl edit deployment/nginx-deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2021-04-19T08:13:50Z"
  generation: 1
  labels:
    app: nginx					#Deployment资源的标签
  name: nginx-deployment
  namespace: default
  resourceVersion: "167208"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
  uid: d9d3fef9-20d2-4196-95fb-0e21e65af24a
spec:
  progressDeadlineSeconds: 600
  replicas: 3					#期望的pod数量,默认是1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%				#升级过程中会先启动的新Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
      maxUnavailable: 25%		#升级过程中在新的Pod启动好后销毁的旧Pod的数量不超过期望的Pod数量的25%,也可以是一个绝对值
    type: RollingUpdate			#滚动升级
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx				#Pod副本关联的标签
    spec:
      containers:
      - image: nginx:1.15.4				#镜像名称
        imagePullPolicy: IfNotPresent	#镜像拉取策略
        name: nginx
        ports:
        - containerPort: 80				#容器暴露的监听端口
          protocol: TCP
        resources: {
    
    }
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always				#容器重启策略
      schedulerName: default-scheduler
      securityContext: {
    
    }
      terminationGracePeriodSeconds: 30

過去のバージョンを表示する

kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         <none>

3. ステートフルセット

安定した永続ストレージを使用してステートフル アプリケーションをデプロイします
。つまり、ポッドが再スケジュールされた後も同じ永続データにアクセスできます。安定したネットワーク フラグを実現するために PVC に基づいています。つまり、ポッドが再スケジュールされた後も、その PodName と HostName は変更されません
。ヘッドレス サービス (つまり、クラスター IP のないサービス) で、
秩序あるデプロイメントと秩序ある拡張を実現します。つまり、ポッドが順番に配置されており、定義された順序 (つまり、0 から N まで) に従って順番にデプロイまたは拡張する必要があります。 -1、次のポッドで実行します。以前のすべてのポッドは実行中および準備完了ステータスである必要があります)。初期化コンテナに基づいて、
秩序ある縮小と秩序ある削除 (つまり、N-1 から 0 へ) を実現します。

一般的なアプリケーション シナリオ: データベース

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 3 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

3.1 上記のアプリケーション シナリオから、StatefulSet は次の部分で構成されていることがわかります。

●ヘッドレスサービス: ポッドリソース識別子の解決可能な DNS レコードを生成するために使用されます。
●volumeClaimTemplates (ストレージボリュームアプリケーションテンプレート): 静的または動的 PV 供給方法に基づいて、Pod リソースに専用の固定ストレージを提供します。
●StatefulSet: Podリソースの管理と制御に使用されます。

3.2 なぜヘッドレスにする必要があるのですか?

  • デプロイメントでは、各ポッドには名前がなく、ランダムな文字列であり、順序付けされていません。Statefulset には順序付けが必要であり、各ポッドの名前は固定されている必要があります。ノードに障害が発生した場合、再構築後の識別子は変更されず、各ノードのノード名は変更できません。ポッド名はポッドを識別するために使用される一意の識別子であり、その識別子は安定していて一意である必要があります。
  • 識別子の安定性を実現するには、ヘッドレス サービスが識別子をポッドに直接解決する必要があり、ポッドに一意の名前を構成する必要があります。

3.3 volumeClaimTemplate が必要なのはなぜですか?

ほとんどのステートフル レプリカ セットは永続ストレージを使用します。たとえば、分散システムではデータが異なるため、各ノードには独自の専用ストレージ ノードが必要です。デプロイメントのポッド テンプレートで作成されたストレージ ボリュームは共有ストレージ ボリュームです。複数のポッドが同じストレージ ボリュームを使用します。ただし、ステートフルセット定義内の各ポッドは同じストレージ ボリュームを使用できません。したがって、ポッドはポッド テンプレートに基づいて作成されますstatefulset を使用してポッドを作成すると、PVC が自動的に生成され、PV を独自の専用ストレージ ボリュームにバインドするよう要求されます。

3.4 サービスの検出

サービス ディスカバリ: アプリケーション サービス間の相互位置付けのプロセスです。
アプリケーションシナリオ:
●非常に動的: ポッドは他のノードにフロートします
●頻繁なアップデートとリリース: インターネットの考え方は小さなステップで実行され、最初に実装してから最適化します。上司は常に最初にオンラインになり、その後ゆっくりと最適化して、最初にアイデアを形にします。お金を稼ぐための製品 お金を手に入れたら、少しずつ最適化できます。
●自動スケーリングをサポート: 大きなセールが発生したら、必ず複数のコピーを拡張する必要があります。

K8S のサービス検出方法 - DNS により、K8S クラスターがサービス リソースの「名前」と「CLUSTER-IP」を自動的に関連付けることができるため、クラスターによってサービスが自動的に検出されます。

K8S で DNS 機能を実装するプラグイン:
●skyDNS: Kubernetes 1.3 より前のバージョン
●kubeDNS: Kubernetes 1.3 ~ Kubernetes 1.11
●CoreDNS: Kubernetes 1.11 以降

3.5 CoreDNSのインストール

方法 1

下载链接:
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
vim transforms2sed.sed
s/__DNS__SERVER__/10.0.0.2/g
s/__DNS__DOMAIN__/cluster.local/g
s/__DNS__MEMORY__LIMIT__/170Mi/g
s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: coredns.yaml.base/g

sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml

方法 2: coredns.yaml ファイルをアップロードする

kubectl create -f coredns.yaml

kubectl get pods -n kube-system


vim nginx-service.yaml
apiVersion: v1  
kind: Service  
metadata:
  name: nginx-service
  labels:
    app: nginx  
spec:
  type: NodePort  
  ports:
  - port: 80
    targetPort: 80  
  selector:
    app: nginx

kubectl create -f nginx-service.yaml

kubectl get svc
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        5d19h
nginx-service   NodePort    10.96.173.115   <none>        80:31756/TCP   10s


vim pod6.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never
  
kubectl create -f pod6.yaml 

kubernetes および nginx サービス名を解析する

kubectl exec -it dns-test sh
/ # nslookup kubernetes
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
/ # nslookup nginx-service
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      nginx-service
Address 1: 10.96.173.115 nginx-service.default.svc.cluster.local



//查看statefulset的定义
kubectl explain statefulset
KIND:     StatefulSet
VERSION:  apps/v1

DESCRIPTION:
     StatefulSet represents a set of pods with consistent identities. Identities
     are defined as: - Network: A single stable DNS and hostname. - Storage: As
     many VolumeClaims as requested. The StatefulSet guarantees that a given
     network identity will always map to the same storage identity.

FIELDS:
   apiVersion	<string>
   kind	<string>
   metadata	<Object>
   spec	<Object>
   status	<Object>

kubectl explain statefulset.spec
KIND:     StatefulSet
VERSION:  apps/v1

RESOURCE: spec <Object>

DESCRIPTION:
     Spec defines the desired identities of pods in this set.

     A StatefulSetSpec is the specification of a StatefulSet.

FIELDS:
   podManagementPolicy	<string>  #Pod管理策略
   replicas	<integer>    #副本数量
   revisionHistoryLimit	<integer>   #历史版本限制
   selector	<Object> -required-    #选择器,必选项
   serviceName	<string> -required-  #服务名称,必选项
   template	<Object> -required-    #模板,必选项
   updateStrategy	<Object>       #更新策略
   volumeClaimTemplates	<[]Object>   #存储卷申请模板,必选项

マニフェスト定義StatefulSet

前述したように、完全な StatefulSet コントローラーは、Headless Service、StatefulSet、および volumeClaimTemplate で構成されます。以下のリソース リストで定義されているように:

vim stateful-demo.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
  labels:
    app: myapp-svc
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: myapp-pod
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: myapp
spec:
  serviceName: myapp-svc
  replicas: 3
  selector:
    matchLabels:
      app: myapp-pod
  template:
    metadata:
      labels:
        app: myapp-pod
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myappdata
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myappdata
	  annotations:          #动态PV创建时,使用annotations在PVC里声明一个StorageClass对象的标识进行关联
        volume.beta.kubernetes.io/storage-class: nfs-client-storageclass
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 2Gi

PVの作成

/stor01节点
mkdir -p /data/volumes/v{
    
    1,2,3,4,5}

vim /etc/exports
/data/volumes/v1 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.80.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.80.0/24(rw,no_root_squash)


systemctl restart rpcbind
systemctl restart nfs

exportfs -arv

showmount -e

//定义PV
vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv001
  labels:
    name: pv001
spec:
  nfs:
    path: /data/volumes/v1
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv002
  labels:
    name: pv002
spec:
  nfs:
    path: /data/volumes/v2
    server: stor01
  accessModes: ["ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv003
  labels:
    name: pv003
spec:
  nfs:
    path: /data/volumes/v3
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv004
  labels:
    name: pv004
spec:
  nfs:
    path: /data/volumes/v4
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv005
  labels:
    name: pv005
spec:
  nfs:
    path: /data/volumes/v5
    server: stor01
  accessModes: ["ReadWriteMany","ReadWriteOnce"]
  capacity:
    storage: 2Gi


kubectl apply -f pv-demo.yaml

kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                      7s
pv002     2Gi        RWO            Retain           Available                                      7s
pv003     2Gi        RWO,RWX        Retain           Available                                      7s
pv004     2Gi        RWO,RWX        Retain           Available                                      7s
pv005     2Gi        RWO,RWX        Retain           Available                           			7s


//创建statefulset
kubectl apply -f stateful-demo.yaml 

kubectl get svc  #查看创建的无头服务myapp-svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP             50d
myapp-svc    ClusterIP   None             <none>        80/TCP              38s

kubectl get sts    #查看statefulset
NAME      DESIRED   CURRENT   AGE
myapp     3         3         55s

kubectl get pvc    #查看pvc绑定
NAME                STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myappdata-myapp-0   Bound     pv002     2Gi        RWO                           1m
myappdata-myapp-1   Bound     pv003     2Gi        RWO,RWX                       1m
myappdata-myapp-2   Bound     pv004     2Gi        RWO,RWX                       1m

kubectl get pv    #查看pv绑定
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                       STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                                        6m
pv002     2Gi        RWO            Retain           Bound       default/myappdata-myapp-0                            6m
pv003     2Gi        RWO,RWX        Retain           Bound       default/myappdata-myapp-1                            6m
pv004     2Gi        RWO,RWX        Retain           Bound       default/myappdata-myapp-2                            6m
pv005     2Gi        RWO,RWX        Retain           Available                                                        6m

kubectl get pods   #查看Pod信息
NAME                     READY     STATUS    RESTARTS   AGE
myapp-0                  1/1       Running   0          2m
myapp-1                  1/1       Running   0          2m
myapp-2                  1/1       Running   0          2m


//当删除一个 StatefulSet 时,该 StatefulSet 不提供任何终止 Pod 的保证。为了实现 StatefulSet 中的 Pod 可以有序且体面地终止,可以在删除之前将 StatefulSet 缩容到 0。
kubectl scale statefulset myappdata-myapp --replicas=0
kubectl delete -f stateful-demo.yaml	

//此时PVC依旧存在的,再重新创建pod时,依旧会重新去绑定原来的pvc
kubectl apply -f stateful-demo.yaml

kubectl get pvc
NAME                STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myappdata-myapp-0   Bound     pv002     2Gi        RWO                           5m
myappdata-myapp-1   Bound     pv003     2Gi        RWO,RWX                       5m
myappdata-myapp-2   Bound     pv004     2Gi        RWO,RWX

ローリングアップデート

//StatefulSet 控制器将在 StatefulSet 中删除并重新创建每个 Pod。它将以与 Pod 终止相同的顺序进行(从最大的序数到最小的序数),每次更新一个 Pod。在更新其前身之前,它将等待正在更新的 Pod 状态变成正在运行并就绪。如下操作的滚动更新是按照2-0的顺序更新。
vim stateful-demo.yaml  		#修改image版本为v2
.....
image: ikubernetes/myapp:v2
....

kubectl apply -f stateful-demo.yaml

kubectl get pods -w   #查看滚动更新的过程
NAME      READY   STATUS        RESTARTS   AGE
myapp-0   1/1     Running       0          29s
myapp-1   1/1     Running       0          27s
myapp-2   0/1     Terminating   0          26s
myapp-2   0/1     Terminating   0          30s
myapp-2   0/1     Terminating   0          30s
myapp-2   0/1     Pending       0          0s
myapp-2   0/1     Pending       0          0s
myapp-2   0/1     ContainerCreating   0          0s
myapp-2   1/1     Running             0          31s
myapp-1   1/1     Terminating         0          62s
myapp-1   0/1     Terminating         0          63s
myapp-1   0/1     Terminating         0          66s
myapp-1   0/1     Terminating         0          67s
myapp-1   0/1     Pending             0          0s
myapp-1   0/1     Pending             0          0s
myapp-1   0/1     ContainerCreating   0          0s
myapp-1   1/1     Running             0          30s
myapp-0   1/1     Terminating         0          99s
myapp-0   0/1     Terminating         0          100s
myapp-0   0/1     Terminating         0          101s
myapp-0   0/1     Terminating         0          101s
myapp-0   0/1     Pending             0          0s
myapp-0   0/1     Pending             0          0s
myapp-0   0/1     ContainerCreating   0          0s
myapp-0   1/1     Running             0          1s


//在创建的每一个Pod中,每一个pod自己的名称都是可以被解析的
kubectl exec -it myapp-0 /bin/sh
Name:      myapp-0.myapp-svc.default.svc.cluster.local
Address 1: 10.244.2.27 myapp-0.myapp-svc.default.svc.cluster.local
/ # nslookup myapp-1.myapp-svc.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve

Name:      myapp-1.myapp-svc.default.svc.cluster.local
Address 1: 10.244.1.14 myapp-1.myapp-svc.default.svc.cluster.local
/ # nslookup myapp-2.myapp-svc.default.svc.cluster.local
nslookup: can't resolve '(null)': Name does not resolve

Name:      myapp-2.myapp-svc.default.svc.cluster.local
Address 1: 10.244.2.26 myapp-2.myapp-svc.default.svc.cluster.local

//从上面的解析,我们可以看到在容器当中可以通过对Pod的名称进行解析到ip。其解析的域名格式如下:
(pod_name).(service_name).(namespace_name).svc.cluster.local

3.6 概要

ステタスはありません:

1) デプロイではすべてのポッドが同じであると見なされます
2) 順序要件を考慮する必要はありません
3) ノードがどのノードで実行されているかを考慮する必要はありません
4) 容量は自由に拡張および削減できます

ステートフル

1) インスタンス間に違いがあります。各インスタンスには独自の一意性と、etcd、zookeeper などの異なるメタデータがあります。2
) インスタンス間の非対称関係と、外部ストレージに依存するアプリケーション。

通常サービスとヘッドレスサービスの違い

サービス: クラスター-IP クラスター間の通信、負荷分散およびサービス検出を提供する一連のポッド アクセス ポリシー。
ヘッドレス サービス: クラスター IP を必要としないヘッドレス サービスの代わりに、DNS レコードを通じてプロキシされたポッドの IP アドレスを直接解決します。

vim pod6.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    args:
    - /bin/sh
    - -c
    - sleep 36000
  restartPolicy: Never


vim sts.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1  
kind: StatefulSet  
metadata:
  name: nginx-statefulset  
  namespace: default
spec:
  serviceName: nginx  
  replicas: 3  
  selector:
    matchLabels:  
       app: nginx
  template:  
    metadata:
      labels:
        app: nginx  
    spec:
      containers:
      - name: nginx
        image: nginx:latest  
        ports:
        - containerPort: 80  


kubectl apply -f sts.yaml

kubectl apply -f pod6.yaml

kubectl get pods,svc

kubectl exec -it dns-test sh
/ # nslookup nginx-statefulset-0.nginx.default.svc.cluster.local
/ # nslookup nginx-statefulset-1.nginx.default.svc.cluster.local
/ # nslookup nginx-statefulset-2.nginx.default.svc.cluster.local

kubectl exec -it nginx-statefulset-0 bash
/# curl nginx-statefulset-0.nginx
/# curl nginx-statefulset-1.nginx
/# curl nginx-statefulset-2.nginx


//扩展伸缩
kubectl scale sts myapp --replicas=4  #扩容副本增加到4个

kubectl get pods -w  #动态查看扩容

kubectl get pv  #查看pv绑定

kubectl patch sts myapp -p '{"spec":{"replicas":2}}'  #打补丁方式缩容

kubectl get pods -w  #动态查看缩容


4.デーモンセット

  • DaemonSet は、すべて (または一部) のノードがポッドのコピーを実行していることを保証します。ノードがクラスターに参加すると、ポッドがクラスターに追加されます。ノードがクラスターから削除されると、これらのポッドもリサイクルされます。DaemonSet を削除すると、DaemonSet が作成したすべての Pod が削除されます。

DaemonSet の一般的な使用例は次のとおりです。

●各ノードで glusterd や ceph などのクラスター ストレージ デーモンを実行します。
●fluentd や logstash などのログ収集デーモンを各ノードで実行します。
●Prometheus Node Exporter、collectd、Datadog エージェント、New Relic エージェント、Ganglia gmond などの監視デーモンを各ノードで実行します。
アプリケーションシナリオ: エージェント
//公式ケース (モニタリング)
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

例:

vim ds.yaml 
apiVersion: apps/v1
kind: DaemonSet 
metadata:
  name: nginx-daemonSet
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.15.4
        ports:
        - containerPort: 80


kubectl apply -f ds.yaml

//DaemonSet会在每个node节点都创建一个Pod
kubectl get pods
nginx-deployment-4kr6h   1/1     Running     0          35s
nginx-deployment-8jrg5   1/1     Running     0          35s

5. 仕事

ジョブは通常のタスク (Job) とスケジュールされたタスク (CronJob) に分けられ、
これらは 1 回だけ実行する必要があるタスクの実行によく使用されます
アプリケーション シナリオ: データベース移行、バッチ スクリプト、kube-bench スキャン、オフライン データ処理、ビデオデコードおよびその他のサービス
https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/

例:

vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

//参数解释
.spec.template.spec.restartPolicy该属性拥有三个候选值:OnFailure,Never和Always。默认值为Always。它主要用于描述Pod内容器的重启策略。在Job中只能将此属性设置为OnFailure或Never,否则Job将不间断运行。

.spec.backoffLimit用于设置job失败后进行重试的次数,默认值为6。默认情况下,除非Pod失败或容器异常退出,Job任务将不间断的重试,此时Job遵循 .spec.backoffLimit上述说明。一旦.spec.backoffLimit达到,作业将被标记为失败。


//在所有node节点下载perl镜像,因为镜像比较大,所以建议提前下载好
docker pull perl

kubectl apply -f job.yaml 

kubectl get pods
pi-bqtf7                 0/1     Completed   0          41s

//结果输出到控制台
kubectl logs pi-bqtf7
3.14159265......

//清除job资源
kubectl delete -f job.yaml 

//backoffLimit
vim job-limit.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox
spec:
  template:
    spec:
      containers:
        - name: busybox
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ["/bin/sh", "-c", "sleep 10;date;exit 1"]
      restartPolicy: Never
  backoffLimit: 2
  
kubectl apply -f job-limit.yaml

kubectl get job,pods
NAME                COMPLETIONS   DURATION   AGE
job.batch/busybox   0/1           4m34s      4m34s

NAME                READY   STATUS   RESTARTS   AGE
pod/busybox-dhrkt   0/1     Error    0          4m34s
pod/busybox-kcx46   0/1     Error    0          4m
pod/busybox-tlk48   0/1     Error    0          4m21s

kubectl describe job busybox
......
Warning  BackoffLimitExceeded  43s    job-controller  Job has reached the specified backoff limit

6. クロンジョブ

Linux の Crontab のような定期的なタスク。
定期タスクの
アプリケーション シナリオ: 通知、バックアップ
https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/

例:

//每分钟打印hello
vim cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
		  
//cronjob其它可用参数的配置
spec:
  concurrencyPolicy: Allow			#声明了 CronJob 创建的任务执行时发生重叠如何处理(并发性规则仅适用于相同 CronJob 创建的任务)。spec仅能声明下列规则中的一种:
                                         ●Allow (默认):CronJob 允许并发任务执行。
                                         ●Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。
                                         ●Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。
  startingDeadlineSeconds: 15		#它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务,且标记失败.如果此字段未设置,那任务就没有最后期限。
  successfulJobsHistoryLimit: 3		#要保留的成功完成的任务数(默认为3)
  failedJobsHistoryLimit:1         #要保留多少已完成和失败的任务数(默认为1)
  suspend:true                     #如果设置为 true ,后续发生的执行都会被挂起。 这个设置对已经开始的执行不起作用。默认是 false。
  schedule: '*/1 * * * *'			#必需字段,作业时间表。在此示例中,作业将每分钟运行一次
  jobTemplate:						#必需字段,作业模板。这类似于工作示例


kubectl create -f cronjob.yaml 

kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          25s

kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
hello-1621587180-mffj6   0/1     Completed   0          3m
hello-1621587240-g68w4   0/1     Completed   0          2m
hello-1621587300-vmkqg   0/1     Completed   0          60s

kubectl logs hello-1621587180-mffj6
Fri May 21 09:03:14 UTC 2021
Hello from the Kubernetes cluster
//如果报错:Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log hello-1621587780-c7v54)
//解决办法:绑定一个cluster-admin的权限
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous



おすすめ

転載: blog.csdn.net/wang_dian1/article/details/132304667