まず、分類の方法を作成
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 create
、kubectl replace
、kubectl 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.168。11.5 <なし> <なし> のhttpd -deployment-584d5b54cf-tpndt 1 / 1が 動作していない 0 46メートル 172.20を。33.74 192.168。11.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 上最多只能运行一个副本。
(2)在每个节点上运行日志收集 Daemon,比如 flunentd 或 logstash。
(3)在每个节点上运行监控 Daemon,比如 Prometheus Node Exporter 或 collectd。
[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: