K8SリソースとDaemonSetアプリケーションを作成するには2つの方法は、(5)

まず、分類の方法を作成

  Kubernetesは、リソースを作成する2つの方法をサポートしています。

  :(1)直接ような、kubectlコマンドで作成

kubectl実行HTTPDアプリ--image = reg.yunwei.com /学ぶ/ httpdの:最新--replicas = 2

  リソース属性のパラメータを指定して、コマンドラインで。

  (2)構成ファイルを通って  kubectl apply 作成し、同じ作業の前に完了することが、実行可能なコマンド:

  適用kubectl -f httpd.yaml

  以下のためのhttpd.yamlコンテンツ:

apiVersion:拡張/ v1beta1
種類:展開
メタデータ:
  名前:httpdの - 展開
スペック:
  レプリカ:2
  テンプレート:
    メタデータ:
      ラベル:
        名前:httpdの
    スペック:
      コンテナ:
      -名前:httpd- アプリ
        画像:reg.yunwei.com /学ぶ/ httpdの:最新

  設定ファイルに記述されたリソースのプロパティは、ファイル形式はYAMLです。

[ルート@ ren7のYAML]#kubectl GETポッド
リソース見つかりません。
[ルート@ ren7のYAML]#のkubectl -f httpd.yamlを適用 
作成deployment.extensions / httpdの展開
[ルート@ ren7のYAML]#kubectl GETポッド
NAME READYステータスは、AGEを再起動します
0 5Sを実行しているのhttpd-展開584d5b54cf-g5rqg 1/1
0 5Sを実行しているのhttpd-展開584d5b54cf-tpndt 1/1

次の2つの方法の比較:

途中のコマンドに基づいて:

  (1)簡単かつ迅速、迅速な直感的。

  (2)一時的試験又は実験のために。

設定文書に基づいて:

  (1)プロファイルは、最終状態の、すなわちアプリケーションに到達するものが記載されています。

  (2)プロファイルが繰り返し展開することができ、リソースを作成するためのテンプレートを提供します。

  (3)管理コード管理の展開と同じであってもよいです。

  (4)形式的な、クロス環境、大規模な配備に適し。

  (5)このアプローチは、いくつかの困難があり、使い慣れた設定ファイルの構文が必要です。

  kubectl apply Kubernetesリソースを作成することができ、また、リソースを更新するために、非常に便利なだけでなく。しかしKubernetesまた、のようないくつかのようなコマンドを、提供し  kubectl createkubectl replacekubectl edit と  kubectl patch

  不要なトラブルを避けるために、我々は唯一使用しようと  kubectl apply

  このコマンドは、より効率的なシーンの90%以上に対処することができました。

 二、展開YAMLファイル

図1に示すように、展開構成フォーマット  

  ①apiVersionは、構成フォーマットの現在のバージョンです。

  その後、まず、すべてのリソースを見つけるために実行kubectlのAPI-リソース、およびコマンドkubectlは情報のバージョンと種類を取得するために配備を説明し、実行

[ルート@のren7のYAML]#デプロイを説明kubectl
KIND:展開
VERSION:拡張/ v1beta1

  ②作成したいリソースの種類、ここでの展開です。

  ③メタデータは、メタデータリソース、名前が必要とされるメタデータ項目です。

  ④仕様は、展開の仕様の一部です。

  ⑤レプリカがコピーの数を指定し、デフォルトは1です。

  設定ファイルの重要な部分である⑥定義されたテンプレートテンプレートポッド、。

  ⑦メタデータのメタデータを定義したポッドは、少なくともラベルを定義します。任意に指定できるキーと値ラベルを付けます。

  ポッド記載⑧スペック仕様は、ポッドこのセクションでは、必要とされる各コンテナ、名前と画像の属性を定義します。

  注意:最後の名前を前に水平線を追加するには、バックがコンテナのリストであるため、

[ルート@のren7のYAML]#のkubectlはdeployments.spec.template.specを説明します
KIND:展開
VERSION:拡張 / v1beta1
RESOURCE:スペック <オブジェクト>
DESCRIPTION:
     ポッドの所望の動作の仕様。詳しい情報
     HTTPS:// git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status
     PodSpecは、ポッドの説明です。
FIELDS:
   コンテナ     < []バーの背後にあるオブジェクト>#-required-リスト、
     ポッドに属するコンテナのリスト。コンテナは、現在することはできません
     追加または削除。少なくとも1つの容器が存在しなければならないポッド。ことはできません。
     更新しました。

   dnsconfig     <オブジェクト>#は単なるオブジェクトであります
     ポッドのDNSパラメータを指定します。ここで指定されたパラメータは次のようになります
     DNSPolicyに基づいて生成されたDNSの設定にマージ。

   ボリューム     <[]オブジェクト>
     ポッドに属するコンテナでマウントできるボリュームのリスト。
     詳しい情報ます。https:// kubernetes.io/docs/concepts/storage/volumes

  上記のポッドを適用kubectlによって作成されたさまざまなリソースを表示します。

[ルート@ ren7のYAML]#kubectl GET展開
NAME READY UP -TO- DATE AVAILABLE AGE
httpdの -deployment    2 / 2      2             2            45メートル
[ren7 YAML @ルート]#kubectl GETさらにreplicaSet
NAME所望の電流READYのAGE
httpdの -deployment-584d5b54cf    2          2          2        46メートル
[ルート@ ren7のYAML]#kubectl GETポッド - 広いO
NAME READYステータスは、AGEのIP NODEノミネートNODE準備GATESを再起動します
httpdの -deployment-584d5b54cf-g5rqg    1 / 1      実行    0           46メートル    172.20を72.140    192.16811.5    <なし> <なし> 
のhttpd -deployment-584d5b54cf-tpndt    1 / 1が      動作していない    0           46メートル    172.20を33.74     192.16811.6    <なし> <なし>

  展開、さらにreplicaSet、ポッドは準備が整いました。あなたはこれらのリソースを削除したい場合は、展開のhttpd-展開を削除kubectl実行するか、-f httpd.yamlを削除kubectl(httpd.yamlを書かれたファイルは削除されません)。

[ルート@のren7のYAML]#のkubectl削除- httpd.yaml fは
deployment.extensions httpdの展開を削除
[ルート@ ren7のYAML]#kubectl GETポッド - 広いO
リソース見つかりません。

2、実行YAMLのプロフィール

次のコマンドを実行します。

 -f httpd.yaml#実行ポッド適用kubectl
 -f http.yaml#ポッドを削除し、削除kubectl

(1) アップ/ダウンスケール)ストレッチ:オンライン部数ポッドの増加または減少をいいます。YAML設定ファイルを直接上書きレプリカパラメータすることができ

  セキュリティ上の理由から、デフォルトの設定はKubernetesポッドは、ノードをマスターする予定はありません。

(2)ノード障害(フェイルオーバー):前記ノード障害の場合、KubernetesのK8S-ノード3ポッド上のマークに利用できないがK8S-ノード1終端状態で、新たに作成された2つのポッドK8S-node2で、維持チェックオリジナル3の部数を指定部数の合計数。

  K8S-node2の回復、ポッドの終了が削除されますが、ポッドは戻って再スケジュールされませんK8S-ノード2を実行している場合。

(3)用 label 控制 Pod 的位置: 默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。

  Kubernetes 是通过 label 来实现这个功能的。label 是 key-value 对,各种资源都可以设置 label,灵活添加各种自定义属性。比如执行如下命令标注 k8s-node3 是配置了 SSD 的节点。

[root@ren8 ~]# kubectl label node 192.168.11.5 disktype=ssd
node/192.168.11.5 labeled

  然后通过:kubectl get node --show-labels 查看节点的label。

[root@ren8 ~]# kubectl get node --show-labels
NAME           STATUS                     ROLES    AGE   VERSION   LABELS
192.168.11.5   Ready                      <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.5,kubernetes.io/os=linux
192.168.11.6   Ready                      <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.6,kubernetes.io/os=linux
192.168.11.7   Ready,SchedulingDisabled   <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.7,kubernetes.io/os=linux

  disktype=ssd 已经成功添加到 k8s-node3,除了 disktype,Node 还有几个 Kubernetes 自己维护的 label。

  有了 disktype 这个自定义 label,接下来就可以指定将 Pod 部署到 k8s-node3。编辑 httpd.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpd-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        name: httpd
    spec:
      containers:
      - name: httpd-app
        image: reg.yunwei.com/learn/httpd:latest
      nodeSelector:
        disktype: ssd

  在 Pod 模板的 spec 里通过 nodeSelector 指定将此 Pod 部署到具有:label disktype=ssd 的 Node 上。

  部署 Deployment 并查看 Pod 的运行节点:

[root@ren7 yaml]# kubectl apply -f .
deployment.extensions/httpd-deployment created
[root@ren7 yaml]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
httpd-deployment-55d95f5b6f-5pfcw   1/1     Running   0          18s   172.20.72.142   192.168.11.5   <none>           <none>
httpd-deployment-55d95f5b6f-hcpg7   1/1     Running   0          18s   172.20.72.141   192.168.11.5   <none>           <none>

  全部2个副本都运行在k8s-node3节点上,符合我们的预期。

  要删除 label disktype,执行如下命令:kubectl label node k8s-node3 disktype- 即删除。不过此时已创建的pod并不会重新部署,依然在 k8s-node3上运行。

[root@ren7 yaml]# kubectl label node 192.168.11.5 disktype-
node/192.168.11.5 labeled
[root@ren7 yaml]# kubectl get node --show-labels
NAME           STATUS                     ROLES    AGE   VERSION   LABELS
192.168.11.5   Ready                      <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.5,kubernetes.io/os=linux
192.168.11.6   Ready                      <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.6,kubernetes.io/os=linux
192.168.11.7   Ready,SchedulingDisabled   <none>   46h   v1.14.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=192.168.11.7,kubernetes.io/os=linux
[root@ren7 yaml]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
httpd-deployment-55d95f5b6f-5pfcw   1/1     Running   0          5m8s   172.20.72.142   192.168.11.5   <none>           <none>
httpd-deployment-55d95f5b6f-hcpg7   1/1     Running   0          5m8s   172.20.72.141   192.168.11.5   <none>           <none>

  除非在 httpd.yaml文件中删除nodeSelector设置,然后通过kubectl apply重新部署。kubernetes 会删除之前的pod并调度和运行新的pod。

[root@ren7 yaml]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
httpd-deployment-55d95f5b6f-5pfcw   1/1     Running   0          5m8s   172.20.72.142   192.168.11.5   <none>           <none>
httpd-deployment-55d95f5b6f-hcpg7   1/1     Running   0          5m8s   172.20.72.141   192.168.11.5   <none>           <none>
[root@ren7 yaml]# vim httpd.yaml     #删除(或注释)nodeSelector设置
[root@ren7 yaml]# kubectl apply -f .   #重新部署pod
deployment.extensions/httpd-deployment configured
[root@ren7 yaml]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
httpd-deployment-584d5b54cf-c9d6r   1/1     Running   0          17s   172.20.33.75    192.168.11.6   <none>           <none>
httpd-deployment-584d5b54cf-vltn8   1/1     Running   0          17s   172.20.72.143   192.168.11.5   <none>           <none>

三、DaemonSet应用

  Deployment 部署的副本 Pod 会分布在各个 Node 上,每个 Node 都可能运行好几个副本。DaemonSet 的不同之处在于:每个 Node 上最多只能运行一个副本。

DaemonSet 的典型应用场景有:
  (1)在集群的每个节点上运行存储 Daemon,比如 glusterd 或 ceph。

  (2)在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。

  (3)在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。

  其实 Kubernetes 自己就在用 DaemonSet 运行系统组件。执行如下命令:
[root@ren8 ~]# kubectl get daemonset -n kube-system
NAME          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
calico-node   3         3         3       3            3           <none>          46h

  DaemonSet calico-node分别负责在每个节点上运行 calico-node 组件。

[root@ren8 ~]# kubectl get pod -n kube-system -o wide
NAME                                       READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
calico-kube-controllers-7dd985b95c-s8q64   1/1     Running   1          46h   192.168.11.6    192.168.11.6   <none>           <none>
calico-node-fwrnb                          2/2     Running   6          46h   192.168.11.7    192.168.11.7   <none>           <none>
calico-node-tpbgh                          2/2     Running   2          46h   192.168.11.6    192.168.11.6   <none>           <none>
calico-node-z7wxb                          2/2     Running   2          46h   192.168.11.5    192.168.11.5   <none>           <none>
coredns-64d5b756bc-bcmqd                   1/1     Running   1          46h   172.20.33.69    192.168.11.6   <none>           <none>
coredns-64d5b756bc-bmj2v                   1/1     Running   2          46h   172.20.72.136   192.168.11.5   <none>           <none>
heapster-7f48ff4cd9-6zmqr                  1/1     Running   1          25h   172.20.33.71    192.168.11.6   <none>           <none>
kubernetes-dashboard-6f75588d94-g6vcr      1/1     Running   1          46h   172.20.72.137   192.168.11.5   <none>           <none>
monitoring-grafana-6c76875cb-8zjrv         1/1     Running   1          25h   172.20.33.70    192.168.11.6   <none>           <none>
monitoring-influxdb-66dbc76bf9-9lsqk       1/1     Running   1          25h   172.20.72.135   192.168.11.5   <none>           <none>

  因为 calico-node 属于系统组件,需要在命令行中通过 --namespace=kube-system 指定 namespace kube-system。如果不指定则只返回默认 namespace default 中的资源。

[root@ren8 templates]# pwd
/etc/ansible/roles/calico/templates
[root@ren8 templates]# vim calico.yaml.j2
# This manifest installs the calico/node container, as well
# as the Calico CNI plugins and network config on
# each master and worker node in a Kubernetes cluster.
kind: DaemonSet
apiVersion: extensions/v1beta1
metadata:
  name: calico-node
  namespace: kube-system
  labels:
    k8s-app: calico-node
spec:
  selector:
    matchLabels:
      k8s-app: calico-node
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        k8s-app: calico-node
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      hostNetwork: true
      tolerations:

 

おすすめ

転載: www.cnblogs.com/renyz/p/11739633.html